本文介绍了嵌入式软件开发需要考虑的诸多因素中的一些,包括1)操作系统(高级通用OS还是RTOS,是商业的WinCE还是免费的Linux、Android);2)图形处理和图形用户界面开发,OpenGL、Qt,X-11, GTK,DirectFB等HMI/GUI图像编程开发框架;3).加密安全性;4).供应商工具:IDEs, EVMs, and SDKs选择;5).开源软件OpenMax/Gstreamer/Eclipse IDE (TI's Code Composer Studio)/OpenGL/OpenCV/Yocto/Linaro等;6).代码结构:代码重用、定制和调试;7).中间件框架和应用相关工具;8).多媒体处理中的音视频codec选择、内存带宽的考虑,AV同步、延时、通信质量以及OpenMax/Gstreamer多媒体框架等;9).嵌入式多线程MP:多处理器、多核和多线程编程,OpenMP和EZFlo、EZRun/EZAccel等C6000系列DSP的多核多处理器编程工具。
综述 Overview
设计、开发、集成和部署一个完全的嵌入式应用软件系统包含众多相互关联的问题和优化折中。用适当的计划,这种挑战可以有效地转化为一个高度差异化的解决方案。作出任何决定而不考虑结果会导致剩下的开发项目效率低下,更可能导致需要调整以前完成的工作或者完全返工。在最基本的层次上的一个很基本的问题通常驱使在漫长的嵌入式软件开发项目中做许多的决定, 这个问题就是项目的目标是什么。这个简单和明显的问题掩盖了一个完整的回答的复杂性。紧紧抓住项目目标不放意味着需要充分理解导致终端产品市场成功的所有因素。而正是这些因素会驱动在软件开发中的很多决定。如产品差异化程度将对产品的进入市场时间和价位产生影响。这两个因素又会影响软件开发采用什么类型的IDE,系统集成开源还是商业软件,什么类型的操作系统(高级通用OS还是实时OS)等诸多决定。没有对项目目标的全面理解,嵌入式软件开发团队可能无法考虑诸多因素。为了指导你的嵌入式软件开发,有如下的专题:
操作系统(OS, Operating systems)
软件设计中第一个需要考虑的就是是否以及采用何种操作系统OS,很多嵌入式应用提供简单的非常有限的功能,因而不用操作系统,如微控制器一般不用高级OS,而且具有与实时系统RTOS其他编程接口很简单。TI为ARM微控制器以及DSP提供了这种实时系统工具,即ARM和DSP StarterWare,其提供了抽象层的库,诸如网卡Ethernet,图形和USB等外设编程实例。如果采用操作系统,那么是用如Windows? CE这样的商业系统还是Linux这种开源的呢还是Android这种免授权费的呢?设计团队采取何种OS对于随后的软件开发至关重要。因为这决定了开发工具链。
商业OS vs开源 vs 免版税
采用商业OS,利用其提供的培训和技术支持能加快学习曲线,加速开发进程。另外商用OS,其工具和第三方插件等都是经过验证的,减少了集成第三方软件的风险。开源OS不用为系统内核以及其他的软件模块付费,社区维护Linux并提供插件和控件供集成,但开发人员需要评估和集成这些第三方代码。很多OS厂商如MontaVista, Red Hat, RidgeRun, Timesys, Wind River等都有商用的Linux版本。这种OS有相应的支持,并且向第三方代码开放。Android OS,Google谷歌提供,免授权费,基于Linux而又集成了很多诸如多媒体处理能力的插件,因而和开源Linux相比,更容易集成第三方代码。真实世界的软件开发项目一般会把一个混合使用几种类型的OS相关代码。一个商业操作系统并不能排除使用开源的第三方插件。也没有一个开源软件比如Linux操作系统的发布不允许使用商用软件模块。
实时 OS还是高级OS
嵌入式处理应用中另外关于OS的话题是选择实时OS还是通用OS。一些OS设计给实时系统使用,即最坏响应时间可以预测,确定的响应时间对于有些实时系统而言是生死的差别。如汽车的刹车系统。通用OS通常会把命令放在一个队列,然后根据流程提供命令服务,而在RTOS中需要识别一些命令,并及时处理响应。因为RTOS注重响应时间,因而一般不提供通用的HLOS(High-level OS)如windows那么多的服务。RTOS支持的任务呗限制在一些时间敏感的任务,而HLOS则符合另外的需求。需要系统易用性的应该采用HLOS,如Windows CE (Microsoft)、Android (Google)、Linux等,因为HLOS相比RTOS在用户和计算或者通信系统间的抽象层次更深,比RTOS能自动处理的任务类型更多,也就是说HLOS比RTOS更复杂。反过来说,这些特性让HLOS不能及时响应不能提供可预期的反应时间。常见的RTOS有VXWorks? (WindRiver)、Nucleus? (Mentor Graphics)、QNX?/Rim等。
图1. 不同的OS(高级和实时OS)对比
图形编程以及用户界面UI开发
GUI(graphical user interface)是设计项目起始阶段就需要考虑的问题。在嵌入式系统里图像处理变得更为重要如果是消费者的应用程序。人机交换接口HMI(human machine interfaces)或者图形用户界面GUI影响最终消费者的用户体验和购买意愿。因而UI设计和操作简单易用都是需要考虑的问题。嵌入式系统的图形处理包括3个部分,创建、构图和显示,创建是指如窗口、图标等图形元素;设计构图是窗口、桌面等元素在显示屏上的变化模式,显示是通过接口把构图显示在屏幕上。
图形设计是艺术活,但为特定嵌入式系统设计的UI将取决于系统的硬件处理能力,如很多消费系统有专门的显卡或者多媒体协处理器但嵌入式系统往往没有这些硬件加速。硬件加速器能减轻主CPU因为巨量图像处理的负荷,提高显示性能。另外一个关键点是考虑差异化的HMI/GUI对应用的成功是否重要,这就需要结合市场和系统成本、功能和性能来做折中了。另外就是考虑是嵌入式团队还是外包给专业的UI设计团队来做UI设计。
图像编程工具
有很多供HMI/GUI项目使用的开源和商业的图像编程开发框架。OpenGL是由Khronos Group(http://khronos.org )提供的跨平台的图形框架,适用于与OS无关的2D/3D图形处理。其他如Linux系统支持的包括Qt,X-11, GTK,DirectFB等图形编程框架,每个框架有不同的实现选择和硬件抽象,Linux内核不提供这些图形处理框架,集成这些框架,编译模块在特定的嵌入式平台上执行时相当耗费时间的。还有一些商业的嵌入式操作系统,如Windows Compact Embedded, Wind River VxWorks和QNX包括了GUI框架。一些OS无关的GUI如Mentor Graphics' Inflexion能在开源和商业的操作系统上使用。
加密安全Security
嵌入式应用怎么考虑安全问题呢?电子设备受到病毒、恶意软件、黑客攻击,对于保存有用户个人信息的嵌入式设备而言,也要考虑身份窃取、钓鱼陷阱、恶意攻击等。一些嵌入式系统的稳定性如医疗系统和急救响应对于用户和公众的安全至关重要。因而嵌入式软件开发者必须在项目起始就要用安全措施来包含他们的系统。从黑客的角度来考虑可能容易受到攻击的系统部分。多媒体播放器还要保护数字版权,终端用户的声音和数据通信设备则要包含通信通道以防止用户信息泄露。嵌入式开发团队需要回答如下问题来保证重要的软件部分:
根据这些问题,开发团队可以发现哪些数据需要保密,哪些信道需要加密。第三方的应用程序也要注明其安全信息。并非所有的嵌入式系统都需要相同级别的安全,因而需要采用的技术也不同。大众市场消费级应用,加密加速器、贾母启动过程以及保护系统的调试通道构成了基本的防护。除此之外,其他的嵌入式应用采用实时运行环境下的加密,来发掘队电压和时钟的篡改来保护通信信道。
供应商工具:IDEs, EVMs and SDKs
当开始开发时,你会发现很多的开发工具和资源可以利用,包括集成开发环境IDEs,仿真模块EVM以及软件开发套件SDKs。这些可选工具可以大幅降低开发周期并提供测试平台。IDE把很多工具集成到一个环境里,有相同的用户界面、命名和命令规则。不同的IDE的性能不同,比如代码可见度,调试跟踪便宜性可能都不同。IDE有开源和商用的,如开源的Eclipse Foundation (http://eclipse.org ),为一个多语言的IDE,能支持Java, Ada, C, C++, COBOL, Python, Ruby等,Google的Android?采用Eclipse,TI的CCSv4和CCSv5也采用了Eclipse的IDE框架。大部分的EVMs包含一部分的PCB(printed circuit board),能够通过软件资源来仿真硬件平台。支持EVM的软件资源各有不同,有丰富软件资源支持的EVMs能快速的搭建demo,带有SDK的EVM一般还包含IDEs、代码库、高级OS,如Linux?, Android和Windows? CE。SDKs通常由芯片供应商免费提供,会包含代码生成工具,即编译器,一定应用的参考设计代码,如带codec编解码器的多媒体框架,I/O协议栈,I/O接口驱动如USB、网卡。用户可以只关心开发上层应用即可。一个全面的SDK的不好的地方是大部分底层都是相同的,把开发放在上层,因而差异化设计很难。如果能提供大部分源码的SDK倒是能修改并定制。方便定制的SDK必须有完善的文档支持,如软件各层的API,还要能提供钩子hook来在系统里插入某些软件模块。
开源的软件开发
开源的软件开发需要一定的移植工作,首先工具链和框架必须移植到相应的处理芯片上,对TI而言,有很多的开源中间件框架和工作可用。以下是TI的微控制器和微处理器的开源软件协议栈:
TI还维护了针对其ARM处理器的Android仓库,包括OS、中间件框架以及其他可移植的工具。支持的芯片包括TI的ARM微处理器、DSP+ARM处理器、DSPs,数字多媒体处理器Davinci系列DM,以及OMAP应用处理器。这些都在http://arowboat.org,还涵盖了一些有益的参考信息,如社区wiki、技术论坛等。嵌入式系统的工具链:Yocto和Linaro,Yocto项目(http://yocto.org )是提供与硬件架构无关的基于Linux的嵌入式系统的工具和开发方法,由TI, Dell, Mentor Graphics, MontaVista Software, Panasonic等组织一起维护,致力于提供完整的嵌入式Linux环境。Linaro (http://linaro.org )是由TI, ARM, IBM等成立的非盈利的软件工程和开源社区,致力于开发Linux软件开发工具和基于ARM的SoC软件。
代码结构:重用、定制和调试
嵌入式应用程序编程,代码结构非常重要,考虑如何组织代码会影响软件架构、设计的定制和调试方便性。
代码重用
软件开发的回报率会随着越来越多的代码、模块和整个系统在多个应用程序里的重用而提高。如制造商会有产品线策略,包括提供不同价位不同功能、不同处理能力的产品,入门级的低价位产品提供基本功能和较低的处理能力,高端的功能全面处理能力强,最大化软件开发回报率ROI就是要在不同应用程序里重用软件,因而代码重用的优先级很高,需要很好的规划产品线众多的处理器和软件兼容性。最理想的是为一个处理器开发的软件可以很容易的移植到其他的系统里。为达到这个目标,软件开发商需要考虑处理能力的宽度和深度以及软件的兼容性。在不同处理器间软件可移植。有些工具可以在不同处理器平台重用,如C语言编译器,为细分市场制定的产品线产品,结构良好、文档清晰的API都能给不同平台不同处理器提供可扩展性。不幸的是,很多APIs非常臃肿,其代码足迹会影响系统性能。最后,当软件开发团队有一系列的工具,软件模块、软件集成封装时可以采用高层次的软件重用。利用之前开发的代码进行加减功能和特性能很快的满足一个特定产品的需求。
代码定制
差异化产品特性需要代码的定制,软件开发团队需要在使用开源软件集成定制差异化能力非常小心,除非这个软件系统已经充分的划分和结构化来满足特定的开源软件授权license协议,能允许差异化软件来商用,否则可能还需要把定制部分再提交给开源社区。另外就是对软件系统的划分和架构设计了。这些定制一方面避免开源的法律风险,另外就是针对自己软件的权益保护。
代码调试
软件项目一般不会没有不包含调试信息来追踪不可预见的错误或者失败信息。实际上设计成容易调试的软件能加快开发进度。软件系统的架构以及单独处理节点的构成部分能给调试开发带来更多的代码可见性。开发人员能更快的定位错误,很快修复有问题的代码。芯片供应商也提供一些硬防的调试工具,如TI的全系列的emulator仿真器连接了TI的IDE CCS和特定的开发平台来定位错误和调试。
中间件框架和应用相关的工具
大量的资源可以用来协助嵌入式软件开发,如特定OS下都会有很多的软件开发资源,包括中间件框架和其他的工具。如WinCE下授权给特定第三方的开发资源、开源OS Linux下则有众多可选的软件和工具,项目组需要的是把这些开源的软件移植到硬件上,虽然有些硬件厂商如TI会提供这些移植好的软件。Android是基于Linux的,所以很多开源的Linux软件同样适用于Android项目。另外一些硬件厂商还提供特定的开发工具,如TI的DVSDK。开源的中间件包括GStreamer, Open CV和OpenMax非常流行,其他的工具链如Yocto和Linaro也不断得到应用。中间件是一系列已经定义好并且完成一定软件功能的组合,可以从中间件选取特定功能来实现系统应用。一个框架包含任务集成的一系列规则,简化系统集成。典型的中间件框架是为特定处理功能应用的,如Gstreamer聚焦在多媒体处理,需要多媒体处理协议栈的如视频解码模块以及音频处理插件可以直接采用该框架。很多的配合TI的微控制器和没处理器的软件开发套件已经移植到众多中间件里,这减少了项目周期里的系统集成工具链,不用考虑把这些框架再次移植到特定硬件平台了。
Multimedia programming多媒体处理
多媒体编程包括对视频、音频、图像图形的处理,需要考虑的因素一般会包括基本的编解码codec、I/O接口(A/V) I/O ports, A/D、D/A、数字音频接口SPDIF (Sony/Philips Digital Interconnect Format) and HDMI (High-Definition Multimedia Interface),模拟视频接口RF (radio frequency), Composite符合, S-Video和Component分立,显示接口HDMI/DVI/VGA/DisplayPort,采集设备CMOS、CCD传感器)、实时性能、通道数、码率、帧率、显示分辨率、多媒体处理质量、内存空间大小和带宽等。因而首先需要使能I/O接口的驱动,接下来是对音视频处理、包括编解码、系统文件处理(从硬盘或者USB、SD/MMC、网络设备读写)、多媒体压缩算法容器格式(TS-Transport Stream、PS- Program Stream,Audio/Video Interleave (AVI),Motion Pictures Experts Group-4 (MPEG-4),Advanced System Format(ASF))。软件模块需要demuxer解复用处理这些容器格式,然后交给音视频解码器。常用的音视频算法如下,视频H.264 (AVC), MPEG-4, MPEG-2, VC1, VP6/7/8, RealVideo、音频AAC, MP3, WMA, MLP, AC3, Vorbis、图像JPEG, PNG, GIF, TIFF,语音Speech G.723、G.722、G.711/G.723等。
内存因素
DDR内存是提高系统性能的重要因素,需要考虑内存成本和带宽的权衡针对特定的多媒体应用。因而首先要确定系统需要的DDR带宽。通常视频需要很大的dDR带宽,把视频流发给I/O接口进行解码编码、后处理、显示都需要很高的带宽,尤其对于高清应用而言,不足的带宽要么降低帧率要么显示体验很差。
图形视频的混叠blending
很多应用视频需要和图形混叠然后显示。很多嵌入式处理器的显示子系统能硬件处理这种,但并不都如此,一个2D的图形引擎能硬处理,但如果需要3D的应用呢?视频需要转换成3D的图形,很多的图形框架能把2D的转换成3D。
延时
很多系统对于端到端的延时非常敏感,如视频会议要求低延时,否则延时的视频或者音频通道会造成参会者的混乱。一个减少延时的方法是减少缓冲区buffer的数量和处理的流水线,每个流水线的阶段也要尽可能的优化。包括流水线每个阶段指定处理时间限制来保证最终流水线时间满足要求。
AV sync同步
同步音视频码流是在音视频解码中必须要考虑的。如对口型的lip-sync,更为复杂的同步算法来处理需要严格和编码端同步的情况如广播级视频应用。和编码器同步时为了避免帧不丢失或者重复以及消除码流缓冲区的溢出。
处理质量
应用需要各种不同级别的多媒体质量,高级的音视频质量可以采用软件算法或者硬件加速器,这些都需要充足的多媒体处理能力来保证编解码器处理质量。
多媒体框架:OpenMAX/GStreamer
OpenMax(http://khronos.org )和GStreamer(http://gstreamer.freedesktop.org )都是免授权费的跨平台/能迅速把多媒体处理模块嵌入系统的多媒体框架。框架内的子函数都是用高级语言如C/C++写的,提供了抽象的编程接口非常方便系统集成。OpenMAX源于Khronos Group,由致力于多媒体处理的Evans & Sutherland, ARM, TI, NVIDIA, SGI, Oracle/Sun组成的非盈利机构, GStreamer是一个开源项目,被TI、Nokia等采用。
嵌入式多处理:多处理器、多核、多线程编程
多处理MP是指面向多处理器或者多个处理核的多线程软件的系统设计。多处理MP主要源于时下不断涌现的针对多处理器和多核平台提出的,单核往往因频率和功耗的限制处理能力有限,MP系统能提供更好的系统吞吐率和更高的性能功耗比。但嵌入式应用的实时特性让针对通用处理器的多处理软件开发有所不同。MP架构需要各个处理单元的通信和多线程软件的各个线程协调处理,从硬件层次来说,必须有相互通信的机制来驱动系统模块的通信,如message消息传递和共享存储通信方式。消息传递通信包括配置为被所有处理器都能访问的私有的存储区的分布处理,数据通过各个处理器私有存储空间的包信息的形式在各个处理单元间传递。共享内存是所有处理器有一个共享空间,数据通过放置在共享空间来传递,共享内存方式需要解决诸如cache一致性、存储一致性模型以及同步的问题。从嵌入式软件开发角度来说,MP的架构又带来了如何在各个处理器间平衡处理负载的问题,怎么协调哪个处理过程放在哪个处理单元的问题,如何在多处理单元间划分多线程。
OpenMP
OpenMP (Open Multiprocessing)是共享内存的并行编程的事实标准工具,由TI提供支持并且已经移植到TI的处理器系列上,是一种高级的自动解决MP系统多线程编程中的问题编程构想。用OpenMP,用户可以用并行策略在高层次通过编译器指定那段代码在那个特定的线程组内执行。编译器来完成具体的处理流程到处理单元的映射,OpenMP可以在嵌入式实时OS内执行。
EZ 工具
嵌入式系统保护非对称MP架构,即一个通用GPU和DSP的架构,DSP处理单元用来加速像codec等功能和多媒体应用的处理,而ARM等GPU用来运行系统和资源管理。TI为其C6000系列的DSPs提供了EZ工具:EZFlo, EZRun和EZAccel。
EZFlo针对DSP开发者,图形化的UI给用户拖拉的方式来选择功能单元的代码生成和应用原型。EZRun允许ARM/Linux开发者迅速的把C代码编程ARM可执行的调用DSP进行加速的二进制可执行文件或者库文件。EZAccel是应用TI的codec engine的框架进行系统开发的,对codec层次加入DSP的加速处理。
无论你开发的什么应用程序,都有很多的因素在嵌入式软件编程中需要考虑。更多信息可以参考TI的支持论坛http://www.ti.com/e2e.
http://www.ti.com.cn/cn/lit/wp/spry189/spry189.pdf
http://houh-1984.blog.163.com/
本文介绍了嵌入式软件开发需要考虑的诸多因素中的一些,包括1).操作系统(高级通用OS还是RTOS,是商业的WinCE还是免费的Linux、Android);2)图形处理和图形用户界面开发,OpenGL、Qt,X-11, GTK,DirectFB等HMI/GUI图像编程开发框架;3).加密安全性;4).供应商工具:IDEs, EVMs, and SDKs选择;5).开源软件OpenMax/Gstreamer/Eclipse IDE (TI's Code Composer Studio)/OpenGL/OpenCV/Yocto/Linaro等;6).代码结构:代码重用、定制和调试;7).中间件框架和应用相关工具;8).多媒体处理中的音视频codec选择、内存带宽的考虑,AV同步、延时、通信质量以及OpenMax/Gstreamer多媒体框架等;9).嵌入式多线程MP:多处理器、多核和多线程编程,OpenMP和EZFlo、EZRun/EZAccel等C6000系列DSP的多核多处理器编程工具。