基于多进程架构的嵌⼊式软件框架研究与实现
摘要:
本⽂针对中⾼端嵌⼊式软件产品的开发,提出了⼀种多进程的开发框架。使⽤该框架,可以实现多⼈并⾏开发,加快产品开发周期,提供产品稳定性,是⼀种有益的尝试。
关键字:框架 多进程 嵌⼊式软件
0 引⾔
伴随着计算机软件技术的发展,嵌⼊式软件开发也在不断的变化更新。软件的发展离不开硬件的进阶。从早期的51单⽚机到⾼性能的dsp 芯⽚再到当今基于ARM的⾼性能soc芯⽚遍地开花,嵌⼊式硬件的发展经历了快速化⾼性能化低功耗化,普适化,多核化发展,甚⾄当今部分soc芯⽚的性能已远远⾼于早期pc上的x86系列cpu,⽽且内存的使⽤也都向着通⽤PC的⽬标看齐。依附于硬件,嵌⼊式软件技术也经历着快速的发展。从早期的c加汇编的⽅式,到如今的android,都是⽤Java进⾏应⽤软件的开发了。总的来看,软件的发展向着复杂化,庞⼤化,专业到普适化,深度定制化的⽅向发展。硬件外设也越来越多,软件管理也趋向于完善统⼀。不过随着cpu性能的不断提升,内存不断增⼤,整机价格不断降低,嵌⼊式软件的开发⾯临尴尬的地位。⼀⽅⾯对于低性能低成本,复杂度要求不⾼的领域,早期研究和进⾏
的软件开发,仍然可以适⽤,另⼀⽅⾯,对于⾼性能,⾼复杂度领域,许多开发⼯作已经转向使⽤android,采⽤android+专有功能的⽅式来实现。原来的主体功能此时充当了⼀个应⽤。对于这⼀领域,使⽤android是明智的选择,在硬件能⼒满⾜的前提下,使⽤android就有了稳定的基础平台,简化了对外设的管理,产品多了许多功能和卖点等等。但是有许多中间领域,⼀⽅⾯硬件cpu性能和内存成本限制,⽆法使⽤android庞⼤的系统,另⼀⽅⾯软件功能⼜有⼀定的复杂度,底层操作系统采⽤了Linux,⼀些功能可以完整使⽤开源组件,不再需要裁剪,但是上层软件主体功能都是⾃⼰设计开发来实现,如下图。针对这⼀领域的开发,本⽂提出了⼀种基于多进程架构的软件框架,能够针对不同的具体需求来构建软件原型,快速完成功能开发。
1 约束及⽬标
嵌⼊式系统领域的软件开发,有⼏个地⽅需要特别的考虑。⼀是⼀般都需要适配硬件。这是由嵌⼊式系统本⾝的特性决定的。不同领域,解决不同需求,硬件可能有⾮常⼤的差别,有时可能⼜有多种多样的外设,所以了解硬件的特性是进⾏开发⼯作前的第⼀个要求。其次,嵌⼊式软件⼀般都有实时性的要求。这也是嵌⼊式系统固有的特性,因为嵌⼊式设备⼀般功能⽐较单⼀,跟PC平台的通⽤性完全不⼀样,需要针对问题域对软件进⾏精⼼设计,充分发挥硬件性能。还有⼀个嵌⼊式系统软件都有定制化的特性,具体原因前⾯已经给出来了。针对这些特性,设计⼀个通⽤的软件框架,有⼀定的难度。试图设计⼀个框架来⼀统天下,包揽解决所有的问题,是不可能的。只能在⼀个层⾯解决⼀部分问题,⽬标就达到了。这就是这⾥要提的设计的约束条件。
⾸先,该框架是在Linux系统基础上进⾏的,也就是底层的操作系统为Linux,框架的运⾏需要底层系统调⽤的⽀持。这基本排除了硬件的特性,也就是框架完全是在纯软件的基础上进⾏的,不会涉及到某个特定的硬件⽀持。这⾥选择Linux操作系统,也是基于现在Linux在嵌⼊式系统的开发中越来越普遍的应⽤。
排除硬件的相关性后,考虑软件的限定条件。这⾥不进⾏具体内容的限定,⽐如要⽀持⽆线或者摄像头,或者限定具体应⽤创建的数量等,因为⾯对复杂的问题域和多样的需求,这些限定都没有什么实际意义。这⾥提出下⾯⼏个特性要求来适应通⽤性和灵活性:
a. 要能够满⾜功能开发需求。这也是最基本的需求。
b. 要满⾜模块化需求。也就是各个功能要按照模块开发,分割开,能够⼀个模块⼀个模块开发,并设计⾼内聚低耦合的模块接⼝。
c. 要满⾜可扩展需求。这是为功能的扩展准备,要能够在部分功能完成的基础上⽐较容易添加,并对已有模块影响较⼩。
d. 要满⾜并⾏开发需求。这其实是前⾯⼏个的综合。满⾜前⾯⼏条的基础上,尽量减少相互依赖,从⽽加快研发进度,缩短产品研发周期。
e. 最后,⼒求结构简单清晰,并且⾼效。⼀⽅⾯可以减少⼤家的理解偏差,另外也便于共同协作开发。
Brooks说过,向进度落后的项⽬添加⼈⼿,只会使项⽬更加延迟。⽀持这⼀观点的重要理由就是开发⼈员的培训和沟通耗费⼤量时间。所以,并⾏化和简单清晰的结构上相辅相成的。
2框架实现
2.1基础模块构建
这⾥所说的基础模块,也就是作为基础组建,提供完善的底层⽀撑的⼀些开源组件。嵌⼊式软件开发,虽然⾯对着多种多样的硬件外设和丰富多样的功能需求,但是有⼀些功能还是具有相对的通⽤性的。构建基础模块,就是将这些通⽤的功能前期添加到框架中,夯实底层⽀撑。这块主要由两部分构成,⼀是开源软件,⼆是⾃⼰开发的具有通⽤功能的模块。随着互联⽹的不断普及,许多嵌⼊式设备都具备联⽹功能,这⾥像⽆线连接管理、pppoe拨号管理、数据的上传下载等都可以使⽤开源软件来完成。另外像数据的加密解密,也有现成的开源软件来实现。对于⾃⼰开发的模块,包括像对操作系统调⽤的封装,与设备配置相关的统⼀数据管理,任务的管理,⽐如任务启动暂停停⽌等。
需要指出的是,这⾥的开源软件移植,跟我们以前研究的对开源软件的剪裁不同。这⾥我们定位系统硬件的性能为中⾼端,并不是早期内存受限系统,所以不需要对开源软件进⾏裁剪或者专门裁剪版来代替。很多功能都可以使⽤跟Linux发⾏版使⽤同样的版本。
将这些公共基础模块作为底层⽀撑,就更容易搭建上层应⽤,并且更加稳定⾼效。所有上层应⽤都可以使⽤底层模块提供的功能,从⽽专注于⾃有逻辑的实现。
⼀个基础模块的实例如下图所⽰:
2.2 应⽤的构建模式
完成原型构建后,就需要考虑应⽤层的细节了。在到底是采⽤单进程模式还是多进程模式这⼀条上,可以说是没有⼗全⼗美,只有更好。考虑框架需要满⾜并⾏开发以及能够灵活应对多种需求,系统在整个应⽤层采⽤了多进程多线程结合的结构。这可以叫应⽤的构建模式。这⼀设计结构有⼒的⽀撑了我们在约束条件中提到的5项需求。简单来说,应⽤主体所有功能以进程为运⾏单位。进程由多个⼦线程构成,其中主线程完成主要的消息接收和控制处理,⼦线程来完成辅助处理。⼦线程间通过消息队列进⾏通信,进程间(也就是应⽤间)通过进程间消息来通信。这样整体来看,系统通过两级通信机制将各个部分衔接起来,应⽤间采⽤进程间的消息通信机制,应⽤内采⽤消息队列的通信机制。另外,使⽤多进程应⽤开发模式,多个应⽤可以多⼈同时单独调试开发,加快产品开发进度。linux内核设计与实现 pdf
这⾥强调并⾏开发的重要性,基于很多原因。很多任务的开发具有单线性,需要依赖之前的任务完成才会进⾏下⼀轮的开发。所以,如果能够并⾏开发,则在加快产品开发上将⼗分有利。
⼀种应⽤层功能开发的模式如下图所⽰:
2.3应⽤看门狗机制
稳定性在嵌⼊式软件开发中如何强调都不过分。许多嵌⼊式操作系统都将稳定性作为⾃⾝特⾊⽽加以⼤⼒宣扬。嵌⼊式⾏业流⾏的vxworks操作系统,据说已经进⾏了所有功能的完整全⾯的测试,⼏乎是零BUG。但是软件开发终究是⼀种思想的产物,俗话说智者千虑,必有⼀失。随着问题域越来越庞⼤,功能越来越复杂,难免有⼀些bug隐藏⼗分隐蔽。为了最⼤程度保证软件的稳定性,参考硬件看门狗机制,在框架中加⼊了软件看门狗机制。基本原理应⽤在启动时,将⾃⼰注册到监控管理程序,监控模块不断的向各个应⽤狗喂⾷,如果⼀段时间内某个应⽤不响应,那么就认为该应⽤陷死或者挂掉了,将其重启。另⼀⽅⾯,将各个应⽤设计为单独的进程运⾏⽅式,可以将某⼀个应⽤的down掉,对其他模块产⽣的影响降到最低。
2.4 事件通知链机制
框架中的事件通知链机制,参考了Linux内核的⼀些做法。应⽤如果对某种事件感兴趣,可以将⾃⼰注册到该事件的通知链上。当对应的事件发⽣时,事件产⽣器回向通知连发送消息,这样所有挂到通知连上的应⽤都将接收到事件。在嵌⼊式系统中,常见的⼀些事件包括遥控器和按键的输⼊,外设的插拔,⽐如⽹线和usb。除此,还有其他⼀些事件。
2.5 统⼀的debug收集模块
Debug模块⽤来完成调试信息的收集,也包括软件的执⾏流程和⼀些错误信息。嵌⼊式软件开发,由于其平台多样,不像PC上开发程序,有很⽅便的集成开发环境,能够很⽅便的进⾏调试,很多时候打印成为了调试程序简便有效的⽅法。为了⽅便程序的调试,框架设计了统⼀的debug收集模块。应⽤程序在开发时,调⽤debug模块提供的接⼝作为打印接⼝,就可以⽅便的做到:a将打印信息在串⼝输出显⽰;b将打印信息发送到远端的监控端,实现远程调试;c可以远程控制打印输出级别和输出模块,从⽽过滤不需要的等级的打印和不需要的模块的打印。这样可以减少打印信息,⽅便调试。
在现有功能基础上,开发者可以对该模块进⾏扩充,实现⾃⼰独特的打印控制。
2.6 基于框架的系统构建
使⽤该框架,系统的构建就如下图所⽰。
xxxxxxxxxxxxxxxxxxxx
最底层是硬件层,包括cpu,内存flash以及各种外设。
之上时操作系统层,使⽤Linux操作系统,带多种外设驱动。
基于操作系统提供框架层,封装部分系统调⽤接⼝,对上提供管理和⽀撑和部分扩充模块。
最上层是应⽤层的开发,可以是⾃⼰开发的应⽤,也可以说中间件的集成。整个应⽤层的开发,按照多进程多线程模块开发。主线程注册消息通信系统,注册事件接收系统等,接收消息,处理消息。接收事件,处理事件,完成进程间的消息通信。⼦线程完成应⽤功能的实现。
基于该框架,开发者能够很容易添加新的功能,封装接⼝,添加消息完成同其他模块的通信。基于框架开发的⼀个实例如下图所⽰:
2.7关键技术及瓶颈
从整体上来看,系统是⼀个消息驱动系统,包含了复杂的多样的消息流动。这⾥⾯既有应⽤⾃⾝产⽣的消息,也包括诸如定时、按键以及⽹络等系统消息。⽽且就应⽤⾃⾝产⽣的消息来说,也⼗分的不⼀样,有多⼜少,有⼤有⼩。这就像⼈体的⼤脑和神经,各个模块是各种脏腑,有不同的器官构成,通过⼤脑和神经统⼀协调起来。具体的消息内容就像是⾎液,流动于全⾝。整个系统可以通过消息⽹络提挈起来。设计完善的消息⽹络,就是关键技术。
该框架作为嵌⼊式软件开发的⼀个框架,实时性是其需要保证的⼀条基本特性。在本框架中,实时性主要受限于消息通信,包括进程间的消息通信和线程间的消息通信,相对⽽⾔进程间消息通信更为要紧⼀点。因此,这⾥所提的瓶颈也就在于如何实现⾼效的进程间通信。进程间通信在Linux中有多种⽅式来实现,框架中选择socket模式来完成。不过这块不是本⽂的重点,其具体实现也是可以根据不同的需求,很⽅便的变换的,这⾥就不多述。具体可查阅Linux进程间通信的相关资料。
3 结束语
本⽂讨论了⼀种应⽤于基于Linux操作系统之上的嵌⼊式软件框架的设计和实现。该框架是基于实践开发总结出来的,并成功应⽤于iptv和视频监控系统的开发中。另外基于该框架的许多模块都可以复⽤。基于该框架,开发⼈员可以快速构建系统原型,并专注于应⽤逻辑的开发。
使⽤该框架减少了开发周期,提⾼了系统的稳定性,取得了很好的效果。当然,它也并⾮完美⽆缺。⾸先它被限制在了使⽤Linux作为操作系统的嵌⼊式中,其次就是基于消息的通信,需要⾼效的通信机制,来满⾜嵌⼊式实时性的特定要求。
总的来说,该框架还是具有很好的通⽤性和良好的可移植性。适⽤⾯⼴,简单⾼效稳定。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。