多层模型在嵌入式软件开发中的应用研究
2017-04-26张智慧
张智慧
摘 要: 分层架构已经在软件开发中得到广泛应用,促进了软件开发的工程化管理,提高了软件的质量和效率。文将多层软件框架模型引入到嵌入式应用开发,按照系统功能进行分层隔离封装,降低功能模块间的耦合关系,设计出包含应用管理层、算法协议层、功能拓展层和硬件驱动层等四层架构模型,明确各层间的接口和调用关系,较好地解决了软件开发的复用性和可靠性问题。文章给出了应用案例。
关键词: 多层模型; 嵌入式系统; 软件开发; 可靠性
中图分类号:G424 文献标志码:A 文章编号:1006-8228(2017)04-17-04
Abstract: The layered architecture has been widely used in software development, to facilitate the engineering management of software development, and improve the quality and efficiency of the software. In this paper, the multilayer software framework model is used in the development of embedded application software, and the functions of the system are separated and encapsulated to reduce the coupling between the modules. The four-layer architecture model is designed, which includes application management layer, algorithm protocol layer, function extension layer and hardware driver layer, the interface and calling method between different layers are defined, and the problems of reusability and reliability of embedded application software development are solved quite good, which are shown with a case study.
Key words: multilayer model; embedded system; software development; reliability
0 引言
随着嵌入式应用的快速发展,嵌入式软件系统的规模和复杂度日益增长,对软件开发的质量和效率提出更高要求。从软件工程角度来看,嵌入式软件开发主要面临两类问题,一是如何尽可能地提高软件的可复用性,二是如何适应用户需求、硬件环境变化快速调整。分层架构已经在软件开发中得到广泛应用,能够有效降低功能模块间的耦合关系,提高软件开发效率,如基于物理架构划分的C/S和B/S模式,基于逻辑架构划分的MVC、MVP、MVVM模式等。随着处理器性能的提升、对外接口的丰富,传统软件开发方法已经远远不能满足嵌入式应用软件的开发要求。本文研究探讨了多层模型在嵌入式软件开发中体系架构设计方法,并给出了应用案例。
1 多层软件开发模型
在软件开发中,合理确定软件体系架构的重要性已经远远超过了特定算法和数据结构的选择。软件体系架构设计包含了从软件框架、功能设计、程序开发到应用软件部署的完整解决方案。通过分层技术,很多复杂的问题得以分割、简化,转化成具体的程序实现。分析嵌入式软件开发特点,合理设计软件体系架构、划分功能层次,有助于提高软件开发质量。
1.1 软件开发中的分层技术
分层技术就是通过对用户需求问题进行梳理,抽象出软件结构中不同功能领域,合理界定内部各层次之间的依赖关系,简化功能模块的开发实现,最终将系统问题转变为软件设计,支持软件系统需要完成的所有功能。在软件开发过程中,面向的应用场景越复杂,解决问题需要的层次划分就越多,层次间的依赖关系、接口关系设计难度就越大。分层方法有多种,但并没有具体的标准,在保证软件功能实现前提下,一是各层解决不同的问题,简化软件实现,能够为上层应用提供支撑;二是某一层的软件设计出现问题,只会影响到该层次的上下结构,不会影响软件系统的整体;三是每层内部再进行纵向或横向上的功能划分,尽量实现软件功能的高内聚、低耦合。
1.2 嵌入式系统的分層结构
通常将嵌入式应用系统从技术结构上分为四个层次,包括硬件平台、BSP及设备驱动层、调度系统层和应用层,如图1所示。
⑴ 硬件平台层。核心微处理器包括嵌入式微处理器(如ARM系列),以及基于DSP或CPLD/FPGA的开发,微处理器一般具有丰富的对外接口,如UART、I2C等。外围功能电路包括键盘、数码管、液晶屏、控制电路、高频电子、开关电源等。
⑵ 设备驱动层。实现处理器片内硬件外设和片外硬件外设驱动的API,同时提供底层算法API,包括GPIO、定时器、ADC/DAC、SPI、I2C、CAN等片内外设的驱动及API实现,片外外设(水平仪、温度传感器、UART)的驱动及API实现。设备驱动层相对比较独立,一般是基于操控底层硬件的低级语言建立硬件的抽象层,为上层应用提供接口。
⑶ 调度系统层。采用嵌入式操作系统(如Linux、android等)或直接编写调度器。一般包括嵌入式操作系统和部分基础应用裁剪,或在现有调度器(如Protothread)基础上编写内存管理、电源管理等专用系统。
⑷ 应用层。包括人机接口与GUI开发、核心算法及业务应用,很多应用还包括数据库、网络通信、RFID、蓝牙通信等应用开发。
1.3 嵌入式应用软件开发的分层模型
嵌入式应用软件对功能、可靠性有着严格的要求。传统结构化的软件开发方式,主要是针对外设硬件电路功能,完成相应的软件功能模块开发,当硬件或应用需求发生变化时,很多模块都需要重新开发,代码重用性低,开发调试难度大,软件的适应性和维护性也不好。随着嵌入式应用系统越来越复杂,这一矛盾变得日益突出。采用分层技术,对嵌入式应用软件系统进行逻辑上的合理设计,成为提高软件开发效率、执行效率和维护效率的关键。
按照“高内聚,低耦合”的原则,对嵌入式应用软件系统输入/输出、应用调度、设备驱动、算法模型、接口访问、网络通信和数据库等功能进行重新划分,降低应用逻辑和业务模型、软件功能和硬件电路的耦合性和依赖关系,可以区分为应用管理层、算法协议层、功能拓展层、硬件驱动层等四个层次。四层结构模型如图2所示。
从图2可以看出,经过重新分层后,使得整个应用程序的结构变得更加清晰和灵活,一个成熟的模型算法能够支持多个应用逻辑,一个成熟的软件功能模块能够适应不同的硬件环境,最大限度地提高了软件的可复用性。对于一个项目,采用上述分层模型后,其后期维护扩展只需对应用管理层进行修改并根据需要完善功能拓展层;新上项目可以复用算法协议层和功能拓展层的相关功能模块,大大简化项目开发,而且随着模块的不断积累,成熟的功能模块会越来越完善,软件开发质量和效率能够得到很大提升。由于在硬件驱动层实现了硬件无关,故只需完善硬件驱动层就可以实现不同硬件之间的移植。
2 基于C语言的软件框架设计
由于C语言具备良好的跨平台特性,并提供了许多低级处理的功能,在嵌入式应用开发中得到了广泛应用。但C语言作为一种结构化的程序设计语言,主要是依据功能进行模块划分,在实现分层模型的过程中,需要制定相应的开发策略。
2.1 框架设计
按照分层模型,在软件开发文件规划时,要避免不同层次的功能模块放在同一个实现文件中,影响代码重用,同时由于C语言没有面向对象的封装特性,数据和功能函数相对分离,应尽量将操作数据相同的函数放在一起。
⑴ 应用管理层。主要包括用户主程序main以及实现输入交互、任务调度、时间管理等功能模块,通过调度相应的功能模块,实现实际任务的运行。一般包括以下几部分:
初始化各类硬件;
初始化各类软件参数;
While(1) {
调用功能函数(算法协议层相关功能模块);
响应中断;
按照业务逻辑修改状态数据;
等待; }
应用管理层的各功能模块可以放在一个main.c文件中,也可以放在不同的实现文件,在main.c中进行引用。
⑵ 算法协议层。主要包括模型算法、协议解析、文件管理、数据库管理等功能模块,实现系统应用所有功能。该层功能模块从应用管理层接收状态参数,按照业务处理逻辑进行处理,并调用功能拓展层的功能模块,完成系统运行功能,并返回状态和结果数据。
核心算法和业务应用设计基本上都在该层完成,也包括已有的协议栈、软件包、标准库等功能模块。
⑶ 功能拓展层。主要实现器件的无关性,提供各种拓展功能和器件的通用性处理、接口访问等功能模块。该层功能模块主要实现特定器件相关的通用功能,如LCD的线、圓、矩形等处理,一般不同的器件采用不同的实现文件,通过文件名进行区分。
⑷ 硬件驱动层。主要实现硬件的无关性,提供硬件的基本功能操作。如LCD的初始化、定位、写点、写字节等。为了保证代码的通用性,针对不同硬件的相同功能的外部函数都尽量一致,一种特定硬件对应一个实现文件,并通过文件名进行区分。
2.2 模块化设计
标准的C语言并不提供软件框架管理,需要用户自己来管理工程文件,实现对各类功能模块的分层管理。
⑴ 工程文件结构。将系统功能模块按照文件夹在工程项目内进行组织,一般应用管理层的功能模块放在根目录,其他三个层的功能模块分别存放在ModelFuc、ComFuc、Hardrv文件夹,文件的命名遵循统一的规范。开发过程中,可以充分利用分层模型的优势,各层功能的开发人员在不同的文件夹内进行并行工作,实现工程化管理。每层功能模块的开发调用下一层的功能模块,尽量避免交叉调用或越级调用。
⑵ 模块内部设计。为了实现模块化设计的高内聚性,应少用或不用全局变量,尽量通过函数参数来传递数据。在编程过程中,要采用一定的技术措施,提高代码的可重用性,比如在头文件中增加防止重复包含处理,在函数内部增加错误处理机制等。
3 应用案例
本案例是利用角速度传感器制作一个电子罗盘,在LCD显示屏上实时显示手持设备的方位。由于已经开发过类似的应用,硬件也沿用了原来的硬件设计,算法协议层、功能拓展层、硬件驱动层的功能模块直接复用原来的代码,通过在应用管理层实现罗盘显示位置、大小和延时设定,增加显示X、Y、Z轴数值,就完成了项目开发,而且运行稳定可靠。
整个工程文件结构如图3所示。Hardrv文件夹存放LCD、角速度传感器,以及电源设备的硬件驱动模块。ComFuc文件夹存放LCD画图、字体显示、罗盘数值转换等功能模块。ModelFuc存放罗盘显示功能模块,在进行模块设计时已经考虑到复用,可以通过参数设定罗盘显示大小比例、指针显示位置。在compass.c模块中,读取传感器的X、Y、Z轴数值,调用罗盘显示功能模块,并调用字体显示功能进行各个方向轴的数值显示,实现电子罗盘应用功能。LCD显示功能在各层分部的示例代码如下:
应用管理层→uint Show_Compass( uint x, uint y, uint
z,uint pcolor); //显示当前x、y、z轴数值对应的罗盘,显示区域大小设为全局变量,完成显示逻辑转换后调用画罗盘指针函数。
算法模型层→uint Draw_Compass(uint cx, uint cy, uint
len, uint angle, uint pcolor); //画罗盘指针,cx、cy为中心位置,转换成直角坐标后调用画线函数。
功能拓展层→uint Lcd_Line(uint x1, uint y1, uint x2,
uint y2, uint pcolor);//画线,调用画点函数。
硬件驱动层→uint Lcd_Pixel(uint x, uint y, uint pcolor);
//驱动LCD进行画点。
从该案例可以看出,硬件驱动层实现对硬件功能的封装,功能拓展层实现软件功能的通用化,对硬件功能和数据的进一步封装,提供简单有效的访问手段,能够供不同的业务处理使用。算法协议层对业务逻辑进行封装,能够成为可直接解决应用问题的功能模块。应用管理层负责整个应用系统的调度、控制和管理。层与层之间耦合性大大降低,提高了软件功能模块的开发效率和可复用性。
4 结束语
多层模型提供了嵌入式应用软件开发良好的架构,功能模块划分更加合理、规范,软件可复用性大大提高。本文给出的软件框架設计,能够有效解决使用C语言进行复杂系统编程时框架结构分散问题,使得开发人员的思路更加清晰,便于工程化管理。在嵌入式应用软件开发过程中采取多层模型,具有较高的可扩展性,能够不断积累成熟软件功能模块,降低软件后期维护难度,提高项目开发的质量和效率。
参考文献(References):
[1] 李小遐,刘惠梅.C语言程序设计能力教程[M].北京理工大学出版社,2011.
[2] 程欣宇,张丽,王忠德.数据结构实验的三层模型[J].计算机教育,2014.12:65-67
[3] 陈伟.基于MVC模式的安卓系统工程结构设计[J].中国科技信息,2016.19:47-48
[4] 杨柯.分层技术在计算机软件开发中的应用效果分析[J].软件,2013.10:47-48
[5] 林越,王翠珍.浅谈面向对象开发思想与软件设计架构分析[J].信息通信,2016.3:152-154