tag 标签: Embedded

相关博文
  • 热度 3
    2022-8-13 11:14
    1069 次阅读|
    0 个评论
    IAR Systems 助力韩国 Osong Medical Innovation Foundation(KBIO Health) 开发先进医疗设备
    IAR Embedded Workbench 创新工具促进智能医疗设备小型化、降低功耗、提高性能、加快开发速度 2022 年 8 月 11 日 — 全球嵌入式开发软件工具和服务供应商 IAR Systems 宣布,其嵌入式软件开发工具 IAR Embedded Workbench 正被韩国 Osong Medical Innovation Foundation ( KBIO Health ) 用于开发尖端医疗设备,加快智能医疗平台发展。 Osong Medical Innovation Foundation ( KBIO Health )是隶属于韩国保健福祉部的公共机构,旨在为开发世界一流的新药和先进医疗设备打造核心支持基础设施,以振兴医疗研发,并推广研究成果。 KBIO Health 先进医疗设备开发支持中心、新药开发支持中心、非临床支持中心和先进医疗设备开发支持中心等主要研究机构均使用了 IAR Embedded Workbench 来提高各种智能医疗设备的性能。 近期,支持医疗功能的智能医疗设备的需求正在不断上升。在智能手表、智能贴片或智能手环等设备的开发过程中,功能实现已成为核心。然而,关键问题是要减少设备佩戴不便、增加电池续航以最大限度延长工作时间、缩短开发周期、加快产品发布。 IAR Embedded Workbench 为这些挑战提供了解决方案。 IAR Systems 韩国区销售经理 Lee Hyundo 表示: “IAR Embedded Workbench 是全球医疗设备开发商的首选开发工具之一,它为开发多功能和可靠的嵌入式系统进行了优化。 ” Osong Medical Innovation Foundation 先进医疗设备开发支持中心光学应用团队 Sung-Jun Hong 博士解释说: “ 得益于高质量的优化技术,通过消除对额外内存库的需求来降低硬件要求, IAR Embedded Workbench 可以缩小智能医疗设备嵌入式软件的代码体积。 ” 同时,缩小软件代码体积也能加快开发过程。一般来说,代码体积越大,再加上代码添加和修改,构建软件的时间就越长。 “ 与我在其它开发项目中使用的设备制造商提供的免费工具相比, IAR Embedded Workbench 在构建类似体积的代码时的速度,至少提高了两倍。 ”Sung-Jun Hong 博士表示。 此外, IAR Embedded Workbench 还在 Osong Medical Innovation Foundation 开发的 “KBIO-eBAND” 智能手环的功耗最小化设计中发挥了重要作用。 Sung-Jun Hong 博士指出: “ 即使尽量将硬件设计为低功耗,设备的电流消耗依然会因软件的运行而变得非常大。但利用 IAR Systems 提供的电源调试功能和 I-jet 调试器,我们能够优化设计,通过监测源代码行为引起的电流消耗变化,现在 KBIO-eBAND 的软件使用最小的电流。 ” Osong Medical Innovation Foundation 计划在未来的项目中进一步扩大与 IAR Systems 的合作,以开发先进的医疗设备,例如智能手环。据 Sung-Jun Hong 博士表示,目前有几个项目计划正处于审查阶段,包括计划引入改善代码质量的支持功能,如 C-STAT ;以及计划将 IAR Embedded Workbench 升级为功能安全版并完成 IEC 62304 认证,为加强医疗设备的认证做准备。 IAR Systems 韩国销售经理 Lee Hyundo 表示: “ 我们非常高兴 IAR Systems 的各种嵌入式软件开发工具被 Osong Medical Innovation Foundation 采用,助力创新智能医疗设备的设计和开发。我们也承诺将继续提供更全面的支持,帮助先进医疗设备开发支持中心取得更多的创新成果。 关于 IAR Systems IAR Systems 为嵌入式开发提供世界领先的软件和服务,帮助世界各地的公司创造满足当前需求和未来趋势的创新产品。自 1983 年以来, IAR Systems 的解决方案已经辅助了超过一百万个嵌入式应用的开发,保证了其质量、可靠性和效率。公司总部位于瑞典乌普萨拉,并在世界各地设有销售分公司和支持办事处。自 2018 年起,深耕设备安全、嵌入式系统和生命周期管理领域的国际企业 Secure Thingz 也加入了 IAR Systems 集团。目前, IAR Systems 集团在纳斯达克 OMX 斯德哥尔摩交易所上市。
  • 热度 10
    2022-5-31 18:48
    1118 次阅读|
    0 个评论
    在IAR Embedded Workbench开发工具中如何实现堆栈保护来提高代码的安全性
    作者: IAR Systems 随着越来越多的嵌入式产品连接到外部网络,嵌入式产品的信息安全性( Security )越来越多地被人们关注。其中既包括直接连接到外部网络,比如通过 Wi-Fi 连接;也包括间接连接到外部网络,比如汽车中的 ECU 通过 CAN 总线与 T-box 相连,而 T-box 通过移动网络可以连接到外部网络。特别是对于一些高功能安全性( Safety )要求的产品,如工业,汽车,医疗产品等,信息安全成为了功能安全的前提( There Is No Safety Without Security )。 在 C/C++ 中,堆栈缓存溢出( Stack Buffer Overflow )是一种常见的错误:当程序往堆栈缓存( Stack Buffer )写数据时,由于堆栈缓存通常采用固定长度,如果需要写的数据长度超过堆栈缓存的长度时,就会造成堆栈缓存溢出。堆栈缓存溢出会覆盖堆栈缓存临近的堆栈数据,其中可能包含函数的返回地址,就会造成函数返回时异常。如果堆栈缓存溢出是攻击者利用代码的漏洞蓄意造成的,它就称为堆栈粉碎( Stack Smashing )。堆栈粉碎是常用的一种攻击手段。 堆栈金丝雀( Stack Canaries ) , 因其类似于在煤矿中使用金丝雀来感测瓦斯等气体而得名,它可以用于在函数返回之前检测堆栈缓存溢出来实现 堆栈保护 (Stack Protection) ,从而提高代码的安全性。 相对于很多更加关注发挥器件性能的原厂开发工具,一些在行业中被广泛使用的商用开发工具更加关注性能和安全性的平衡性和完整性。 本文 以过去数十年来在行业中被广泛采用的商用工具链 IAR Embedded Workbench 为例,介绍如何在工具 中实现堆栈保护 ,从而提高代码的安全性 。 堆栈粉碎 在 C /C++ 中,堆栈( S tack ) 用于保存程序正常运行(比如函数调用或者中断抢占)的临时数据,可能包含如下数据: · 没有存储在寄存器中的函数参数和局部变量 · 没有存储在寄存器中的函数返回值和函数返回地址 · CPU 和寄存器状态 由于堆栈保存的是保证程序正常运行的临时数据,堆栈缓存溢出会覆盖堆栈缓存临近的堆栈数据,这些数据可能包含函数的返回地址,如果发生时一般会造成程序运行异常。攻击者经常利用这一点来进行堆栈粉碎攻击。 下面通过一个简单的例子来说明堆栈粉碎攻击: void foo(char *bar) { char c ; strcpy(c, bar); // no bounds checking } foo() 函数将函数参数输入复制到本地堆栈变量 c 。如下图 B 所示:当函数参数输入小于 12 个字符时, foo() 函数会正常工作。 如下图 C 所示: 当函数参数输入大于 11 个字符时, foo() 函数会覆盖本地堆栈的数据,将函数返回地址覆盖为 0x80C03508 ,当 foo() 函数返回时,会执行地址 0x80C03508 对应的代码 A ,代码 A 有可能包含攻击者提供的 shell 代码,从而使攻击者获得操作权限。 A 数据复制前 B "hello" 作为函数参数输入 C "AAAAAAAAAAAAAAAAAAAA\x08\x35\xC0\x80" 作为函数参数输入 图:堆栈粉碎示例 _ 堆栈保护 因其功能类似于在煤矿中用来发现瓦斯的金丝雀而得名的堆栈金丝雀( Stack Canaries ),可以用于在函数返回执行恶意代码之前检测堆栈缓存溢出。其检测原理是:当调用函数时,将需要保存的临时数据保存到堆栈,然后放置一个堆栈金丝雀 , 当函数返回时,检查堆栈金丝雀的值是否发生改变;如果发生改变,说明堆栈已被篡改,否则说明堆栈没有被篡改。 下面介绍如何在 IAR Embedded Workbench 这种广受欢迎的商用工具链中实现堆栈保护,从而提高代码的安全性: 在 IAR Embedded Workbench 中,会使用启发模式( Heuristic )来决定函数是否需要堆栈保护 : 如果函数局部变量包含数组类型或者结构体成员包含数组类型,或者局部变量的地址在该函数外被使用,该函数需要堆栈保护。 IAR Embedded Workbench 安装目录下面 \src\lib\runtime 包含 stack_protection.c ,里面包含了 __stack_chk_guard 变量和 __stack_chk_fail 函数,可以作为模板使用:其中 __stack_chk_guard 变量就是堆栈金丝雀的值,在函数返回时,如果检测到堆栈金丝雀的值被篡改,就会调用 __stack_chk_fail 函数。 1. 将 IAR Embedded Workbench 安装目录下面 \src\lib\runtime 文件夹的 stack_protection.c 拷贝并添加到工程。 2. 在 IAR Embedded Workbench 中启用堆栈保护。 3. 在代码中声明堆栈保护相关的 __stack_chk_guard 变量和 __stack_chk_fail 函数。 extern uint32_t __stack_chk_guard; __interwork __nounwind __noreturn void __stack_chk_fail(void); 4. 编译工程。编译器会在需要堆栈保护的函数中添加如下操作:在函数入口处先入栈( Push ),然后再额外保存堆栈金丝雀,具体的值用户可以在 stack_protection.c 中 更改 __stack_chk_guard ; 在函数出口,会检测堆栈金丝雀的值是否还是 __stack_chk_guard ,如果不是,说明堆栈被篡改,会调用 __stack_chk_fail 函数。 调试 将断点打到需要堆栈保护的函数反汇编( Disassembly )入口,暂停后发现编译器在函数入口处入栈操作之后额外将堆栈金丝雀保存: 在函数出口处打断点,然后运行程序,在函数返回时,会先检测堆栈金丝雀的值是否还是 __stack_chk_guard ,如果不是,说明堆栈被篡改,会调用 __stack_chk_fail 函数。 改变堆栈金丝雀的值使之与 __stack_chk_guard 不一致,然后运行程序,函数返回时将会调用 __stack_chk_fail 函数: 总结 本文主要介绍了堆栈粉碎 攻击如何利用堆栈缓存溢出来影响代码的安全性。通过在 IAR E mbedded Workbench 中实现堆栈保护可以检测堆栈的完整性,从而提高代码的安全性。 参考文献: 1. https://en.wikipedia.org/wiki/Stack_buffer_overflow 2. https://cwe.mitre.org/data/definitions/121.html 3. https://en.wikipedia.org/wiki/Buffer_overflow_protection 4. https://www.iar.com/knowledge/learn/programming/stack-protection-in-iar-embedded-workbench/ 5. IAR C/C++ Development Guide ( Stack protection )
  • 热度 24
    2016-6-29 10:23
    2221 次阅读|
    0 个评论
    By Toradex Leonardo Graboski Veiga 1).  简介 物联网(Internet of Things)概念的本质其实就是关于发送数据到网络,所以称为云服务。随着时代发展和技术进步,人们可以使用尺寸更小功耗更低的电子设备并很容易的连接到云端,不过有一个问题却始终困扰着电子工程师们:如何使用这些获取的数据?而这正是物联网的主题。 在 Microsoft主页 上面有一些实际的应用例子来展示IoT的应用:一个电梯公司通过物联网来改善并提供预先维护;一个工业自动化公司通过物联网深入了解油气产业供应链,同时提供预先维护;还有一个公司通过IoT预测驾驶人员行为然后优化汽车利用。在读完这个系列文章后,我们期待读者可以拥有足够的知识和工具去部署应用来深度检视同时优化整个系统 – 不仅仅是积攒了一堆数据,而是从中获取了有用的结果! Azure 是Microsoft提供的云服务平台,提供了多种应用如数据库,虚拟机,应用服务,机器学习,数据流分析,媒体和CDN服务,大数据解决方案,以及包括IoT Hub的其他众多应用。就其提供的大量应用本身已经是使用Azure服务的很好理由,但Microsoft更进一步通过和Amazon Web Services的 对比 来进一步证明其方案是更好的 – 和前面相反,这是一个通过用户和时间来确认的强有力宣言。另外,高安全性,易于整合以及容易上手也是选择Azure服务的另一个理由。 本系列文章通过开发一个IoT应用,从读取现场传感器数据,展示数据到获取商业智能(BI)。所使用的用来连接传感器以及上传数据到云端的平台: Azure IoT certified partner  Toradex 的 Colibri VF61 计算机模块 +  Iris Carrier Board 。应用程序获取传感器数据然后上传到来自Microsoft Azure云解决方案的一个叫做Azure IoT Hub的IoT服务,然后就可以被各种所需要的Microsoft Azure服务来处理。这部分内容将在本系列文章的第二部分着重讲解,在此我们主要关注在如何配置Azure IoT Hub以及上传数据到它上面。 我们选用的IoT环境为模型车监控。为了演示方便,将Toradex平台和传感器置于遥控模型汽车内,如下图1所示;而图2则给出的目标应用的框图。   图1 :遥控汽车   图2 :应用框图 我们所选用的应用编程语言为Javascript 配合Node***: 一个服务器端(本文中即Toradex嵌入式系统)基于Chrome V8 引擎编译的Javascript解释器。这个选择是考虑到Azure IoT Hub SDKs 可以提供的开发库。但是需要注意的是现在IoT Hub SDKs正处于频繁更新中,每一次更新都会有些改变(至少Node相关),所以在使用前需要考虑清楚。本文所使用的Azure IoT Node包版本为1.0.1。 整个环境的搭建,从开发嵌入式系统应用,到配置Azure来获取数据我们分为3个主要步骤,下面会分别介绍: ./  配置Azure 环境 ./  添加设备并发送信息到IoT Hub ./ Toradex 嵌入式系统应用开发   2).  配置 Azure 环境 首先需要创建一个新的Azure账户:从Azure 网站可以申请30试用的免费账户。然后就可以使用账户里一定数目的信用额度来免费部署应用使用Azure 服务;同样,IoT Hub也有一个用于开发的包含有限资源的免费版本,且不受试用期限制。关于价格和IoT Hub的详细信息,请见 这里 。 设置好Azure账户后,需要创建IoT Hub。用新创建的Azure账户登陆Azure portal,选择 +New Internet of Things Azure IoT Hub。新的IoT Hub配置界面如下图3所示,“Pricing and scale tier”选项需要选择“Free”;然后在“Resource Group”选项创建一个新的资源组,另外“Location”选项需要和后面部署的服务保持一致;“Name”可以自由设定,而“IoT Hub Units”和”Device-to-cloud“选项在免费版本中则无法修改。点击“Create”后,服务就被部署了,这个过程可能需要几十秒时间。   图3 :从Azure Portal 创建IoT Hub 上面操作完成后,可以看到IoT Hub已经出现在控制台,也就是 Azure Portal主页 。点击后,如下图4所示页面会打开:里面包含“Essentials” 是如IoT Hub地区等基本信息;“Usage”是提供给系统管理员注册设备数目以及从设备发送信息数量的反馈信息;“Monitoring”是显示收到信息数量。   图4 :IoT Hub  主面板 仍然在IoT Hub主面板上,为了让其他应用也可以访问服务,”Settings“选项卡里面的“Shared access policies“选项需要被选中。在新打开的” Shared access policies“选项卡中,点击“iothubowner”规则选项,这个包含了本IoT Hub所有可能的权限。如下图5所示,“iothubowner”选项卡会打开,然后复制”Connection string – primary key”对应的内容留作后用:这个是下一步用于管理和监控这个IoT Hub服务的钥匙。   图5 :获取iothubowner connection string   3).  添加设备并发送信息到 IoT Hub 现在云端设置已经完成,我们需要在开发主机上面安装 iothub-explorer 工具来添加设备到IoT Hub,另外如果开发主机是Windows的话,也可以选择 Device Explorer 工具。鉴于本文所使用的开发主机系统为Ubuntu 14.04,我们采用iothub-explorer。需要注意所需Node版本为0.12.x或以上(根据说明如需全部功能工作需要4.x或以上版本),但目前apt-get工具只能安装0.10.x版本。为了解决这个问题,需要先后安装Node Version Manager(NVM)和Node 版本0.12.9. 然后在终端中使用NPM(Node Package Manager)来安装iothub-explorer。 --------------------- $ npm install iothub-explorer@latest --------------------- 然后可以运行iothub-explorer help参数来查看使用方法 --------------------- $ iothub-explorer help --------------------- 根据上面命令的打印结果,iothub-explorer 包含有create和monitor事件参数。首先,我们配合上面图5中获取的connection string使用iothub-explorer工具来创建一个设备“tdx_iot_car”。注意“--connection-string”参数用来显示设备connection string (和图5中获取的IoT Hub connection string不同),这个也需要保存下来用来连接这个新创建的设备到IoT Hub,是的可以使用Colibri VF61应用来发消息到Hub。 --------------------- $ iothub-explorer "HostName=toradex.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=putyoursharedaccesskeyfromtheconnectionstringhere" create tdx_iot_car --connection-string Created device tdx_iot_car - deviceId:                   tdx_iot_car generationId:               635931262207620183 etag:                       MA== connectionState:            Disconnected status:                     enabled statusReason:               null connectionStateUpdatedTime: 0001-01-01T00:00:00 statusUpdatedTime:          0001-01-01T00:00:00 lastActivityTime:           0001-01-01T00:00:00 cloudToDeviceMessageCount:  0 authentication: SymmetricKey:       primaryKey:   somesharedaccesskeyreturned       secondaryKey: somesecondaryaccesskeyreturned - connectionString: HostName=toradex.azure-devices.net;DeviceId=tdx_iot_car;SharedAccessKey=somesharedaccesskeyreturned ---------------------   4). Toradex 嵌入式系统应用开发 现在来设置 Colibri VF61  计算机模块 +  Iris 载板 。本文中使用Toradex发布的预编译Linux image( Colibri_VF_LinuxConsoleImageV2.5 ),如何刷写image到模块请参考 这里 。然后请参考下面步骤安装Node***, NPM 包和git – 安装过程需要一些时间,尤其是curl步骤。 --------------------- # opkg update # opkg install nodejs # opkg install tar # curl -L https://www.npmjs.com/install.sh | sh # opkg install git --------------------- 本文所展示的例程(send_data***)相关packages installer和node文件存放于 这里 ,可以通过下面命令将其clone到目标板上面并安装node packages --------------------- # git clone https://github.com/leograba/azure-iot-car.git # root@colibri-vf:~# cd azure-iot-car # root@colibri-vf:~# npm install --------------------- 现在我们可以在目标板上面运行例程向IoT Hub发送数据,但有几点需要解释下:例程使用HTTP协议通讯,但AMQP和MQTT协议也是支持的;变量“connecionString”数值必须和上面用iothub-explorer工具创建新设备时候所保存下来string一致: --------------------- var connectionString = "HostName=toradex.azure-devices.net;DeviceId=tdx_iot_car;SharedAccessKey=somesharedaccesskeyreturned" --------------------- Setinterval()循环函数随机产生数值发送到IoT Hub, 用来模拟传感器数据,如温度,声纳传感器距离数据,加速度和陀螺仪传感器,一些gps坐标数据和来自目标板的时间日期等。如何从真实传感器获取数据将在这个系列文章的下一篇进行说明。JSON Stringify() 函数用来产生一个JSON编码数据串,然后封装于Message object用于发送。下面是一个JSON格式数据串示例: --------------------- {"ObjectName":"toradex2", "ObjectType":"SensorTagEvent", "temp":24.889683, "acceleration: {"accel_x":10.018892,"accel_y":0.039468,"accel_z":-0.081328}, "gyroscope": {"gyro_x":-0.0532362,"gyro_y":-0.01597086,"gyro_z":0}, "distance":0.17017, "boardTime":1458064972706} --------------------- 正常情况下,在程序运行时候sendEvent()函数里面的callback函数不应打印任何串口输出。下面是在Colibri VF61上面运行程序并正常工作时候的串口打印输出: --------------------- # node send_data*** sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub --------------------- 为了确保数据被收到,在Azure Portal IoT Hub面板会显示每天的消息计数,同时监控图表上面会有尖峰显示,如下图6所示。需要注意这些信息大概需要几十秒才会在portal上面显示出来。   图 6:  在Azure Portal 中确认数据被收到 另外,也可以使用iothub-explorer工具通过“monitor-event”参数配合device id来查看发送到IoT Hub的数据流,不过需要Colibri VF61程序要同步运行,而通过Azure Portal查看则不需要。下面图7展示了iothub-exploer收取目标板发送数据情况,上面是具体监测数据命令: --------------------- $ iothub-explorer "your_iothub_connection_string" monitor-events yourdevice ---------------------   图7 :用iothub-explorer 收取目标板发送数据   5).  总结 Microsoft Azure网站上面提供了很多文档用于帮助用户开发更复杂和稳固的应用。参考这些文档可以从中获取更多有用信息,如创建一个设备,或者从Hub获取设备发送的数据是可以通过编程来完成的。另外,在接下来的文章中我们将侧重连接真实传感器到Colibri VF61 + Iris载板,并传输真实传感器数据到IoT Hub, 这个也可以用作其他Azure 服务来给设备部署应用提供深度检视或变量操控。 我们希望通过本文可以让用户了解并最终使用Toradex 嵌入式系统方案配合Auzre IoT Hub服务,然后从中获益。同时,我们也想在这里感谢来自巴西的Grupo Viceri团队在Azure and Business Intelligence上面的丰富经验最终促成了这个IoT Car 项目。 本文最初发表于Embarcados.com, Portuguese,详见这里。
  • 热度 21
    2016-5-16 11:08
    1549 次阅读|
    0 个评论
    By Toradex 秦海 随着ARM平台处理能力的日益强大,越来越多的工业智能/机器人应用在ARM平台上面实现,在这个过程中不可避免的就涉及到将机器人应用开发框架移植到ARM平台来运行,因此本文就着重示例基于 Openembedded 环境,将ROS(Robot Operating System)编译集成到嵌入式Linux中运行。 ROS 是一种为机器人应用设计的分布式处理框架,集成了大量相关库和工具,目的是为了提高机器人应用开发时代码复用率。目前ROS发布版本官方只支持Ubuntu Linux等安装,但由于在Openembedded框架下维护了meta-ros layer,使得我们可以将ROS集成到同样基于Openembedded框架的嵌入式Linux中运行。 本文所使用硬件为Toradex  Colibri T20  基于nVidia Tegra2的ARM核心板配合 Colibri 开发板 ,软件即为Toradex官方发布的基于Openembedded框架的 Yocto Project 兼容 Linux 系统。 1).  编译配置 roscore a).  下载配置基本的Openembedded 环境 详细的关于Toradex Openembeded配置说明请见 这里 ,如下下载配置Opembedded 和Toradex Linux release V2.5相关meta layer数据 --------------------- $ mkdir oe-core $ cd oe-core $ repo init -u http://git.toradex.com/toradex-bsp-platform.git -b LinuxImageV2.5 $ repo sync --------------------- b).  下载meta-ros layer --------------------- $ cd oe-core/stuff $ git clone  https://github.com/bmwcarit/meta-ros.git //默认head为ROS indigo,如需hydro请继续如下操作 //cd meta-ros git checkout v0.2 cd .. --------------------- c).  修改配置文件 ./ 生成相关配置文件 --------------------- $ cd oe-core $ . export --------------------- ./ 修改oe-core/build/conf/bblayers.conf --------------------- BASELAYERS ?= " \ ...... + ${TOPDIR}/../stuff/meta-ros \ " --------------------- ./ 修改oe-core/build/conf/local.conf文件 --------------------- MACHINE ?= "colibri-t20"        //设备配置为colibri-t20,这里也可以改为其他产品型号 ...... + IMAGE_INSTALL_append = "roslaunch"   //安装roscore --------------------- d).  编译image --------------------- bitbake -k angstrom-lxde-image --------------------- e).  部署image 编译成功后,在oe-core/build/out-glibc/deploy/colibri-t20/images目录下找到生成的image Colibri_T20_LinuxImageV2.5_xxxxxxxx.tar.bz2,然后按照这里的方法更新到Colibri T20模块上面。 f).  启动roscore 环境 ./ 配置环境变量 --------------------- export ROS_ROOT=/opt/ros/ indigo export PATH=$PATH:/opt/ros/ indigo/bin export LD_LIBRARY_PATH=/opt/ros/ indigo/lib export PYTHONPATH=/opt/ros/ indigo/lib/python2.7/site-packages export ROS_MASTER_URI=http://localhost:11311 export export ROS_HOSTNAME=localhost export CMAKE_PREFIX_PATH=/opt/ros/ indigo touch /opt/ros/ indigo/.catkin --------------------- ./ 启动roscore --------------------- roscore ---------------------   2).  编译配置 ros-world a).  重新修改oe-core/build/conf/local.conf 文件 --------------------- ...... IMAGE_INSTALL_append = "packagegroup-ros-world""   //安装roscore 以及完整的相关package --------------------- b).  编译部署 方法和上面roscore一致,由于meta-ros问题编译前请修改oe-core /stuff/meta-ros/recipes-ros/geometry-experimental/geometry-experimental.inc --------------------- SRC_URI = "063484906d1c2f1a4ee961680e43b559" SRC_URI = "011b77bc33afea927bab2707ddda585df8de5f1fc6e387081f6bf1ea12d2323b" --------------------- 第一次编译可能会遇到一些错误,请编译退出后做如下修改 ./ oe-core_v25_ros/build/out-glibc/work/armv7at2hf-vfp-angstrom-linux-gnueabi/ 目录下面 修改所有 tf2/0.5.12-r0/geometry-0.5.12/  和 tf2-xxx/0.5.12-r0/geometr-0.5.12/ 目录名均修改为geometry_experimental-0.5.12 ./ 修改oe-core_v25_ros/build/out-glibc/work/armv7at2hf-vfp-angstrom-linux-gnueabi/pluginlib/1.10.1-r0/build/CMakeFiles/plugin_tool.dir/link.txt --------------------- ……/arm-angstrom-linux-gnueabi-g++ -pthread –mfpu=vfpv3-d16 ……  //编译器添加” –pthread”参数 --------------------- c).  后续生成部署image 则和roscore 一致。   3).  总结 本文着重展示了在基于Openembedded框架的嵌入式Linux上面编译运行ROC core以及相关组件的方法,具体关于ROC的使用请参考其官方网站和网上相关资料。
  • 热度 25
    2016-5-5 17:15
    1950 次阅读|
    0 个评论
    By Toradex 秦海 1).  简介 随着ARM平台性能的日益强大和嵌入式设备的发展,对于多媒体处理如音视频播放,摄像头,流媒体处理等需求也日益增多,本文就通过几个基于嵌入式Linux下多媒体应用的示例来简单展示下使用Gstreamer框架进行多媒体处理的方法. Gstreamer 是一个基于Pipeline的多媒体框架,基于GObject,以C语言写成,目前是嵌入式Linux最为常用的处理多媒体应用框架. Element是Gstreamer最重要和基本的对象类,通过Plugin的形式提供,多个Elements可以组合为bin,并进一步聚合形成一个Pipeline完成一个多媒体应用处理. 2).  硬件准备 ./ 本文测试所使用平台为Toradex  Colibri i.MX6  ARM计算机核心板模块, 基于NXP i.MX6 SoC, 配合 Colibri开发板 . ./ 摄像头作为多媒体输入源使用Logitech 720P USB摄像头 3).  软件准备 ./ OS为Toradex官方Ycoto project兼容嵌入式 Linux发布  V2.5 beta3. ./ Gstreamer-0.10, 系统自带 ./ 安装gstreamer相关插件包 ---------------- root@colibri-imx6:~# opkg update root@colibri-imx6:~# opkg install gst-plugins-base-meta gst-plugins-good-meta   root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavcodec54_9.16-r0.9_armv7ahf-vfp-neon.ipk root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavutil52_9.16-r0.9_armv7ahf-vfp-neon.ipk root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavformat54_9.16-r0.9_armv7ahf-vfp-neon.ipk   root@colibri-imx6:~# opkg install libavutil52_9.16-r0.9_armv7ahf-vfp-neon.ipk root@colibri-imx6:~# opkg install libavcodec54_9.16-r0.9_armv7ahf-vfp-neon.ipk root@colibri-imx6:~# opkg install libswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk root@colibri-imx6:~# opkg install libavformat54_9.16-r0.9_armv7ahf-vfp-neon.ipk   root@colibri-imx6:~# opkg install gst-ffmpeg ---------------- 4).  测试 gstreamer Gstreamer提供了两个非常方便的工具gst-launch和gst-inspect,在真正将Gstreamer pipeline集成到你的程序里面前,可以使用这两个工具在命令行下面进行pipeline的准备和测试,本文也主要基于这种模式进行演示,而详细的关于Gstreamer在程序中使用方法请参考 这里 . gst-inspect可以用来查看当前系统已经安装的plugin或者具体查看某个element的属性来判定pipeline中elements互联兼容性,详细说明请见 这里 . gst-launch 用于编译和运行一个pipeline,可以方便的对pipeline进行不同组合尝试并测试,如下面用来显示一个视频测试图案. ---------------- root@colibri-imx6:~# gst-launch videotestsrc ! 'video/x-raw-rgb, width=(int)640,height=(int)480' ! ximagesink ----------------     5).  应用示例 a).  播放摄像头   使用v4l2src元件采集摄像头视频,视频格式为YUY2/帧率30/分辨率640x480; 使用imxv4l2sink元件利用GPU加速播放采集的视频; 如果使用ximagesink元件来播放则没有硬件加速. ---------------- root@colibri-imx6:~# gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)YUY2' ! imxv4l2sink disp-width=640 disp-height=480 ---------------- 目标板CPU占用率: 37.5%   b).  采集摄像头保存为文件 同样使用v4l2src元件采集摄像头视频; ffmpegcolorspace元件转换颜色格式为I420; vpuenc元件调用硬件VPU进行H.264编码; matroskamux元件进行mkv mux;  filesink元件输出到文件 ---------------- root@colibri-imx6:~# gst-launch -v v4l2src device=/dev/video0 ! ffmpegcolorspace ! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)I420' ! queue max-size-buffers=2 ! vpuenc codec=6 ! matroskamux ! filesink location=output.mkv ---------------- 目标板CPU占用率: 40%   c).  回放视频文件 使用filesrc元件读取视频文件; aiurdemux元件进行demux; vpudec元件通过硬件VPU进行H.264解码; imxv4l2sink元件播放. ---------------- root@colibri-imx6:~# gst-launch filesrc location=/home/root/output.mkv typefind=true ! aiurdemux ! queue ! vpudec ! imxv4l2sink disp-width=640 disp-height=480 ---------------- 目标板CPU占用率: 3.5%   d). RTP 摄像头流媒体到远程主机 使用v4l2src元件采集摄像头; ffmpegcolorspace转换颜色格式; vpuenc元件调用硬件VPU进行H.264编码;rtph264pay元件进行h264流rtp封装; udpsink元件进行udp传输. ---------------- //Ubuntu主机IP: 10.20.1.116 //Colibri i.MX6目标板IP: 10.20.1.122   /* Colibri i.MX6 */ gst-launch -v v4l2src device=/dev/video0 ! ffmpegcolorspace! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)I420' ! vpuenc codec=6 ! rtph264pay ! udpsink host=10.20.1.116 port=5000   /* Ubuntu 主机 */ //Ubuntu 14.04, 安装gstreamer-ffmpeg wget http://ppa.launchpad.net/mc3man/gstffmpeg-keep/ubuntu/pool/main/g/gstreamer0.10-ffmpeg/gstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb sudo dpkg -i gstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb //播放流媒体, caps设置从目标板获得 gst-launch-0.10 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z0JAHqaAoD2QAA\\=\\=\\,aM44gAA\\=\", payload=(int)96, ssrc=(uint)1172839120, clock-base=(uint)784846202, seqnum-base=(uint)58343" ! rtph264depay ! ffdec_h264 ! ximagesink ---------------- 目标板CPU占用率: 35%   6). Gstreamer1.0 应用示例 Colibri i.MX6 最新Linux发布版本V2.6beta1已经支持gstreamer1.0,升级方法请见这里 ./ 软件准备 安装相关插件包 ---------------- opkg update opkg install gstreamer1.0-plugins-base-meta opkg install gstreamer1.0-plugins-good-meta opkg remove --force-depends libgstimxcompositor0 //目前版本中需要移除否则无法使用gstreamer ---------------- ./ 应用示例 a).  播放摄像头 ---------------- root@colibri-imx6:~# gst-launch-1.0 imxv4l2src device=/dev/video0 ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)YUY2' ! imxv4l2sink overlay-width=640 overlay-height=480 ---------------- 目标板CPU占用率: 30%   b).   采集摄像头保存为文件 ---------------- root@colibri-imx6:~# gst-launch-1.0 imxv4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2 ! vpuenc_h264 ! matroskamux ! filesink location=output.mkv ---------------- 目标板CPU占用率: 16%   c).  回放视频文件 ---------------- root@colibri-imx6:~# gst-launch-1.0 filesrc location=/home/root/output.mkv typefind=true ! matroskademux ! queue ! vpudec ! imxv4l2sink overlay-width=640 overlay-height=480 ---------------- 目标板CPU占用率: 4%   d). RTP 摄像头流媒体到远程主机 ---------------- //Ubuntu主机IP: 10.20.1.116 //Colibri i.MX6目标板IP: 10.20.1.122   /* Colibri i.MX6 */ gst-launch-1.0 imxv4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2 ! vpuenc_h264 ! rtph264pay ! udpsink host=10.20.1.116 port=5000 /* Ubuntu 主机 */ //Ubuntu 14.04, 安装libav (同0.10 ffmpeg) sudo apt-get install gstreamer1.0-libav   //播放流媒体 gst-launch-1.0 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! avdec_h264 ! videoconvert ! ximagesink ---------------- 目标板CPU占用率: 13%   e).  摄像头连接到远程主机tcp 视频流到目标版再rtp 回远程主机播放 ---------------- //Ubuntu主机IP: 10.20.1.116 //Colibri i.MX6目标板IP: 10.20.1.122   /* Ubuntu 主机 */ //采集摄像头并建立tcp server gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! jpegenc ! tcpserversink host=10.20.1.116 port=5000   /* Colibri i.MX6 */ //从tcp server获取摄像头视频流,并进行H.264压缩后rtp回远程主机 gst-launch-1.0 tcpclientsrc host=10.20.1.116 port=5000 ! jpegdec ! queue max-size-buffers=2 ! vpuenc_h264 ! rtph264pay ! udpsink host=10.20.1.116 port=5001   /* Ubuntu 主机 */ //播放rtp视频流 gst-launch-1.0 udpsrc port=5001 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! avdec_h264 ! videoconvert ! ximagesink ---------------- 目标板CPU占用率: 31%   7).  总结 由上面示例可见Gstreamer是一个非常强大且配置灵活的多媒体处理框架,并且配合相应的plugin,也可以充分调用硬件GPU/VPU加速,使其能够在嵌入式设备上面利用有限的资源高效的实现广泛的多媒体应用.
相关资源