摘要:

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

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

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项需求。简单来说,应用主体所有功能以进程为运行单位。进程由多个子线程构成,其中主线程完成主要的消息接收和控制处理,子线程来完成辅助处理。子线程间通过消息队列进行通信,进程间(也就是应用间)通过进程间消息来通信。这样整体来看,系统通过两级通信机制将各个部分衔接起来,应用间采用进程间的消息通信机制,应用内采用消息队列的通信机制。另外,使用多进程应用开发模式,多个应用可以多人同时单独调试开发,加快产品开发进度。

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

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

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作为操作系统的嵌入式中,其次就是基于消息的通信,需要高效的通信机制,来满足嵌入式实时性的特定要求。

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

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

  1. SpringMVC——基于MVC架构的Spring框架

  2. 基于插件架构的简单的Winform框架(下)

    前言 最近事情较多,终于有时间来写完这篇.在上一篇的基础上,本篇文章我们开始着手搭建一个简单的基于插件架构的Winform框架.(其实也就是一个小例子,也是对之前写过的代码的总结) 设计思路 写这个W ...

  3. 用Python和Google AppEngine开发基于Google架构的应用软件

    用Python和Google AppEngine开发基于Google架构的应用软件 在研究了一段时间的Google AppEngine之后,我发现Google AppEngine是未来一个非常不错的开 ...

  4. 基于SOA分布式架构的dubbo框架基础学习篇

    以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...

  5. 基于《悉尼协议》框架下Java课程案例教学研究

    文章目录 基于<悉尼协议>框架下Java课程案例教学研究 一.Java课程教学存在问题 (一)Java课程目标定位不足 (二)Java课程教学存在的问题 1. 教材内容更新滞后 2. 学习 ...

  6. DeepMind用基于AI的元强化学习框架研究多巴胺在学习过程中的作用

    内容来源:ATYUN AI平台 最近,AI已经应用到一系列视频游戏中,如Atari经典的Breakout和Pong.尽管这样的表现令人印象深刻,但人工智能仍然依靠数千小时的游戏时间来达到并超越人类玩家 ...

  7. 基于RISC-V架构的开源处理器及SoC研究综述

    RISC-V是加州大学伯克利分校(University of California at Berkeley,以下简称UCB)设计并发布的一种开源指令集架构,其目标是成为指令集架构领域的Linux,应用 ...

  8. 基于GIS的省级高速公路路面管理系统框架研究

    基于GIS的省级高速公路路面管理系统框架研究 摘  要  基于GIS的省级高速公路路面管理系统是采用路面管理技术.交通地理信息系统技术和HDM-4模型建立的针对包括沥青路面和水泥混凝土路面在内的高速公 ...

  9. 基于RISC-V架构的开源处理器及SoC研究综述(一)

    RISC-V是加州大学伯克利分校(University of California at Berkeley,以下简称UCB)设计并发布的一种开源指令集架构,其目标是成为指令集架构领域的Linux,应用 ...

  10. 可持续5G环境下基于机器学习的网络分片框架

    Machine Learning-Based Network Sub-Slicing Framework in a Sustainable 5G Environment 5G环境下的物联网框架 5G切 ...

最新文章

  1. BigDecimal 类型转换、运算、比较
  2. 如何在 Outlook 2003、Outlook 2007 中管理pst 文件
  3. F - 数据结构实验之查找六:顺序查找
  4. 如何生成WebPart的部署文件(wsp文件)
  5. write up::web 实战2-注入 --sqlmap注入版
  6. HDU5697 刷题计划 dp+最小乘积生成树
  7. 改善CSS的10种最佳做法,帮助你从样式中获得最大的收益
  8. 基于php的织梦cms新闻发布,DedeCms
  9. Threading模块
  10. 熊猫烧香病毒的分析报告
  11. ExtJs教程 3.0
  12. sudo rosdep init找不到命令或失败解决办法
  13. 【紫光同创国产FPGA教程】【第三章】按键检测实验
  14. linux 内核usleep,Linux的sleep()和usleep()的使用和区别
  15. BODIPY-TR氟化硼二吡咯偶联神经酰胺/炔烃/氨基/羧基等活性基团
  16. linux 查看mapper 路径,Linux系统/dev/mapper目录
  17. Havok VS PhysX 漫谈物理加速世界!
  18. Python+selenium之下载文件
  19. 圣诞老人python代码_秘密圣诞老人分类
  20. USRP硬件平台介绍

热门文章

  1. Tupper自我指涉公式生成器
  2. 转载:声优 - 野上ゆかな
  3. linux怎么查看root权限,linux 查看当前用户是否有root权限490
  4. 瑞星千万巨款贿赂官员 制造冤狱铲除竞争对手图片
  5. 8086CPU的14个寄存器全称
  6. python精确有理数实验_有理数类实验报告
  7. Dex.top新手使用教程
  8. Python基础——模块和正则表达式
  9. 血浆/血清RNA提取试剂盒的功能和特色
  10. 带头节点 (非头指针) 双向循环链表 (doubly linked list)