基于多进程架构的嵌入式软件框架研究与实现

摘要:

本文针对中高端嵌入式软件产品的开发,提出了一种多进程的开发框架。使用该框架,可以实现多人并行开发,加快产品开发周期,提供产品稳定性,是一种有益的尝试。

关键字:框架 多进程 嵌入式软件

0 引言

  伴随着计算机软件技术的发展,嵌入式软件开发也在不断的变化更新。软件的发展离不开硬件的进阶。从早期的51单片机到高性能的dsp芯片再到当今基于ARM的高性能soc芯片遍地开花,嵌入式硬件的发展经历了快速化高性能化低功耗化,普适化,多核化发展,甚至当今部分soc芯片的性能已远远高于早期pc上的x86系列cpu,而且内存的使用也都向着通用PC的目标看齐。依附于硬件,嵌入式软件技术也经历着快速的发展。从早期的c加汇编的方式,到如今的android,都是用Java进行应用软件的开发了。总的来看,软件的发展向着复杂化,庞大化,专业到普适化,深度定制化的方向发展。硬件外设也越来越多,软件管理也趋向于完善统一。不过随着cpu性能的不断提升,内存不断增大,整机价格不断降低,嵌入式软件的开发面临尴尬的地位。一方面对于低性能低成本,复杂度要求不高的领域,早期研究和进行的软件开发,仍然可以适用,另一方面,对于高性能,高复杂度领域,许多开发工作已经转向使用android,采用android+专有功能的方式来实现。原来的主体功能此时充当了一个应用。对于这一领域,使用android是明智的选择,在硬件能力满足的前提下,使用android就有了稳定的基础平台,简化了对外设的管理,产品多了许多功能和卖点等等。但是有许多中间领域,一方面硬件cpu性能和内存成本限制,无法使用android庞大的系统,另一方面软件功能又有一定的复杂度,底层操作系统采用了Linux,一些功能可以完整使用开源组件,不再需要裁剪,但是上层软件主体功能都是自己设计开发来实现,如下图。针对这一领域的开发,本文提出了一种基于多进程架构的软件框架,能够针对不同的具体需求来构建软件原型,快速完成功能开发。

基于多进程架构的嵌入式软件框架研究与实现_第1张图片

1 约束及目标

嵌入式系统领域的软件开发,有几个地方需要特别的考虑。一是一般都需要适配硬件。这是由嵌入式系统本身的特性决定的。不同领域,解决不同需求,硬件可能有非常大的差别,有时可能又有多种多样的外设,所以了解硬件的特性是进行开发工作前的第一个要求。其次,嵌入式软件一般都有实时性的要求。这也是嵌入式系统固有的特性,因为嵌入式设备一般功能比较单一,跟PC平台的通用性完全不一样,需要针对问题域对软件进行精心设计,充分发挥硬件性能。还有一个嵌入式系统软件都有定制化的特性,具体原因前面已经给出来了。针对这些特性,设计一个通用的软件框架,有一定的难度。试图设计一个框架来一统天下,包揽解决所有的问题,是不可能的。只能在一个层面解决一部分问题,目标就达到了。这就是这里要提的设计的约束条件。

首先,该框架是在Linux系统基础上进行的,也就是底层的操作系统为Linux,框架的运行需要底层系统调用的支持。这基本排除了硬件的特性,也就是框架完全是在纯软件的基础上进行的,不会涉及到某个特定的硬件支持。这里选择Linux操作系统,也是基于现在Linux在嵌入式系统的开发中越来越普遍的应用。

排除硬件的相关性后,考虑软件的限定条件。这里不进行具体内容的限定,比如要支持无线或者摄像头,或者限定具体应用创建的数量等,因为面对复杂的问题域和多样的需求,这些限定都没有什么实际意义。这里提出下面几个特性要求来适应通用性和灵活性:

  a. 要能够满足功能开发需求。这也是最基本的需求。

  b. 要满足模块化需求。也就是各个功能要按照模块开发,分割开,能够一个模块一个模块开发,并设计高内聚低耦合的模块接口。

  c. 要满足可扩展需求。这是为功能的扩展准备,要能够在部分功能完成的基础上比较容易添加,并对已有模块影响较小。

  d. 要满足并行开发需求。这其实是前面几个的综合。满足前面几条的基础上,尽量减少相互依赖,从而加快研发进度,缩短产品研发周期。

  e. 最后,力求结构简单清晰,并且高效。一方面可以减少大家的理解偏差,另外也便于共同协作开发。

  Brooks说过,向进度落后的项目添加人手,只会使项目更加延迟。支持这一观点的重要理由就是开发人员的培训和沟通耗费大量时间。所以,并行化和简单清晰的结构上相辅相成的。

2框架实现

2.1基础模块构建

这里所说的基础模块,也就是作为基础组建,提供完善的底层支撑的一些开源组件。嵌入式软件开发,虽然面对着多种多样的硬件外设和丰富多样的功能需求,但是有一些功能还是具有相对的通用性的。构建基础模块,就是将这些通用的功能前期添加到框架中,夯实底层支撑。这块主要由两部分构成,一是开源软件,二是自己开发的具有通用功能的模块。随着互联网的不断普及,许多嵌入式设备都具备联网功能,这里像无线连接管理、pppoe拨号管理、数据的上传下载等都可以使用开源软件来完成。另外像数据的加密解密,也有现成的开源软件来实现。对于自己开发的模块,包括像对操作系统调用的封装,与设备配置相关的统一数据管理,任务的管理,比如任务启动暂停停止等。

  需要指出的是,这里的开源软件移植,跟我们以前研究的对开源软件的剪裁不同。这里我们定位系统硬件的性能为中高端,并不是早期内存受限系统,所以不需要对开源软件进行裁剪或者专门找裁剪版来代替。很多功能都可以使用跟Linux发行版使用同样的版本。

  将这些公共基础模块作为底层支撑,就更容易搭建上层应用,并且更加稳定高效。所有上层应用都可以使用底层模块提供的功能,从而专注于自有逻辑的实现。

  一个基础模块的实例如下图所示:

基于多进程架构的嵌入式软件框架研究与实现_第2张图片

2.2 应用的构建模式

完成原型构建后,就需要考虑应用层的细节了。在到底是采用单进程模式还是多进程模式这一条上,可以说是没有十全十美,只有更好。考虑框架需要满足并行开发以及能够灵活应对多种需求,系统在整个应用层采用了多进程多线程结合的结构。这可以叫应用的构建模式。这一设计结构有力的支撑了我们在约束条件中提到的5项需求。简单来说,应用主体所有功能以进程为运行单位。进程由多个子线程构成,其中主线程完成主要的消息接收和控制处理,子线程来完成辅助处理。子线程间通过消息队列进行通信,进程间(也就是应用间)通过进程间消息来通信。这样整体来看,系统通过两级通信机制将各个部分衔接起来,应用间采用进程间的消息通信机制,应用内采用消息队列的通信机制。另外,使用多进程应用开发模式,多个应用可以多人同时单独调试开发,加快产品开发进度。

这里强调并行开发的重要性,基于很多原因。很多任务的开发具有单线性,需要依赖之前的任务完成才会进行下一轮的开发。所以,如果能够并行开发,则在加快产品开发上将十分有利。

一种应用层功能开发的模式如下图所示:

基于多进程架构的嵌入式软件框架研究与实现_第3张图片

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操作系统,带多种外设驱动。

   基于操作系统提供框架层,封装部分系统调用接口,对上提供管理和支撑和部分扩充模块。

   最上层是应用层的开发,可以是自己开发的应用,也可以说中间件的集成。整个应用层的开发,按照多进程多线程模块开发。主线程注册消息通信系统,注册事件接收系统等,接收消息,处理消息。接收事件,处理事件,完成进程间的消息通信。子线程完成应用功能的实现。

   基于该框架,开发者能够很容易添加新的功能,封装接口,添加消息完成同其他模块的通信。基于框架开发的一个实例如下图所示:

基于多进程架构的嵌入式软件框架研究与实现_第4张图片

2.7关键技术及瓶颈

   从整体上来看,系统是一个消息驱动系统,包含了复杂的多样的消息流动。这里面既有应用自身产生的消息,也包括诸如定时、按键以及网络等系统消息。而且就应用自身产生的消息来说,也十分的不一样,有多又少,有大有小。这就像人体的大脑和神经,各个模块是各种脏腑,有不同的器官构成,通过大脑和神经统一协调起来。具体的消息内容就像是血液,流动于全身。整个系统可以通过消息网络提挈起来。设计完善的消息网络,就是关键技术。

该框架作为嵌入式软件开发的一个框架,实时性是其需要保证的一条基本特性。在本框架中,实时性主要受限于消息通信,包括进程间的消息通信和线程间的消息通信,相对而言进程间消息通信更为要紧一点。因此,这里所提的瓶颈也就在于如何实现高效的进程间通信。进程间通信在Linux中有多种方式来实现,框架中选择socket模式来完成。不过这块不是本文的重点,其具体实现也是可以根据不同的需求,很方便的变换的,这里就不多述。具体可查阅Linux进程间通信的相关资料。

3 结束语

  本文讨论了一种应用于基于Linux操作系统之上的嵌入式软件框架的设计和实现。该框架是基于实践开发总结出来的,并成功应用于iptv和视频监控系统的开发中。另外基于该框架的许多模块都可以复用。基于该框架,开发人员可以快速构建系统原型,并专注于应用逻辑的开发。

  使用该框架减少了开发周期,提高了系统的稳定性,取得了很好的效果。当然,它也并非完美无缺。首先它被限制在了使用Linux作为操作系统的嵌入式中,其次就是基于消息的通信,需要高效的通信机制,来满足嵌入式实时性的特定要求。

  总的来说,该框架还是具有很好的通用性和良好的可移植性。适用面广,简单高效稳定。

你可能感兴趣的:(嵌入式开发,嵌入式,软件框架,framework)