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

摘要:

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

0 引言

1 约束及目标

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

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

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

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

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

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

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

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

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

2框架实现

2.1基础模块构建

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

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

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

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

2.2 应用的构建模式

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

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

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

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关键技术及瓶颈

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

3 结束语

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

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

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月4日
下一篇 2021年7月4日

相关推荐