浅析C语言嵌入式系统编程软件设计架构

(整期优先)网络出版时间:2018-10-20
/ 2

浅析C语言嵌入式系统编程软件设计架构

田壮

美的洗涤电器制造有限公司528311

摘要:C语言是嵌入式软件开发使用最多的语言,主要是由于C语言兼具高低级语言的特性,简洁高效、灵活方便,支持对硬件的直接操作,但其灵活性也往往会带来复杂的代码管理和维护问题。基于此,本文就从C语言嵌入式系统编程软件设计展开分析。

关键词:C语言;嵌入式系统;编程软件设计

1、系统设计思路

1.1自顶向下与自底向上

一个方向是自顶向下,从抽象到具体,从最顶层的程序或者逻辑整体描述规范出发向下到具体的操作模块,这是目前嵌入式系统应用层开发常用的方法。在嵌入式系统设计过程中,可以将两种方法结合使用,针对硬件的操作采用自底向上,尽可能抽象出所有的元操作,应对不同上层应用的重用要求;在逻辑应用上,则采用自顶向下,对应用逻辑表达进行抽象规范,尽量使得模块划分便于开发实现、重用和维护。

1.2最优模块化

①紧凑性,封装良好的模块决不互相暴露内部信息,也不去调用其他模块的操作实现,而是通过函数接口来相互通信;

②正交性,任何模块的功能点应当是唯一的、无歧义的,在系统中以确定无疑的方式存在。在纯正交的模块设计中,每一个操作行动只限于该项功能,系统的每一属性只有一条途径改变,不影响其他功能,这有助于将复杂的设计紧凑化。

2、嵌入式系统开发的分层架构

2.1分层原则

①层次划分兼顾功能颗粒度和重用可能性,每层解决不同的问题,下层要能够为上层应用提供支撑,比如环境温度监测功能,可以从概念上划分为数据采集层、处理层、显示层等,层层递进实现;

②层与层之间的相关性尽量小,确保某一层的软件设计出现问题,只会影响到该层次的上下结构,不会影响到软件系统的整体;

③每层内部按照任务分解、功能优化、重用程度进行模块划分,尽量实现软件功能的高内聚、低耦合。理论上,功能分解得越简单,实现起来越容易,重复使用频次就会越高,但目标过度细化会使设计管理、功能调度的复杂度迅速上升,所以一般划分到概念上能够独立完成一项功能、与其他功能相关性合适的程度。

2.2分层设计方法

首先,采取自顶向下的方法对嵌入式系统应用需求进行梳理,抽象出不同的逻辑功能要求,明确概念层次,再转化成软件层次。

其次,采取自底向上的方法对涉及到的硬件功能进行抽象,应尽可能细化出应用开发需要的硬件操作原语。对于嵌入式系统而言,大量的开发工作是通过软件驱动底层硬件实现相应的专用功能,对硬件功能的封装既有利于降低当前系统开发的复杂度,又便于实现硬件的无关性,提高程序代码的复用性。

再次,采用自顶向下和自底向上相结合的方法,逐层检验相邻层次间的信息交互和调用关系,确保每一个上层的调用都能得到满足。

最后,对每一层的功能进行合并整合,优化功能模块设计,努力实现最优模块化。在实际系统开发中,最优模块化的过程也是对现有程序代码重用的优化选择过程。

2.3分层技术的应用

常见的功能模块划分是围绕中心处理器/控制器来设计系统逻辑架构,采用面向过程的设计思路,区分为输入/输出、应用调度、设备驱动、网络通信等功能模块。这样的划分方式能够充分利用系统的处理能力,进行精细化的存储空间管理,但也带来应用逻辑交叉重复、与硬件依赖关系强等缺点,很难进行功能拓展,代码重用性也较差。

①应用管理层。主要实现界面交互、业务逻辑调度等功能。

②算法协议层。主要实现模型算法、协议解析、文件管理、数据库管理等功能,如位置转换计算、罗盘指针方位计算等。

③功能拓展层。主要实现器件的无关性,提供各种器件的通用性处理、接口访问等功能,如LCD的线、圆、矩形处理,传感器数据转换等功能。

④硬件驱动层。主要实现硬件的无关性,提供硬件的操作原语功能,如LCD的定位、写点、写字节、传感器数据采集等功能。上述分层设计方案,将同类或相似技术实现的功能进行聚合,减少业务应用、模型算法和硬件操作之间的耦合性,避免功能在分析设计中的交叉混淆,整个应用程序的结构变得更加清晰和灵活,使得一个成熟的模型算法能够支持多个应用逻辑,一个成熟的软件功能模块能够适应不同的硬件环境,提高了软件功能模块的开发效率和可重用性。

3、基于C语言的系统软件设计

3.1代码管理

①文件目录管理。按照分层原则组织文件目录,主程序文件、全局变量头文件放在根目录,其他文件按照应用管理层、算法协议层、功能拓展层、硬件驱动层分别存放在AppFunc、ModelFunc、HardExt、HardOpt文件夹,所有文件命名遵循统一的规范。如果有第三方的通用函数库,可以建立ComFunc文件夹来存放。这样在开发过程中,可以充分利用分层模型的优势,各层功能的开发人员可以在不同的文件夹内进行并行工作,实现工程化管理。

②功能模块管理。为了实现模块化设计的高内聚性,应少用或不用全局变量,尽量通过函数参数来传递数据。同一类的业务应用功能、同一硬件的操作功能尽量放在同一文件内实现。上层功能模块的开发可以调用下层功能模块,下层功能模块尽量避免交叉调用或越级调用。

3.2模块重用设计

C语言代码重用一般通过函数模块来实现,包括头文件和函数实现文件,也就是.h和对应的.C文件。一是宏定义,如#definemaxi(a,b)(a>;b?a:b),而且宏是与类型无关的,不会带来额外的开销,但有些任务是无法通过宏来实现的;二是函数,函数是一段可以重复使用的代码,用来独立地完成某个功能,可以接收用户传递的数据,也可以将计算结果通过函数值返回或通过地址参数返回。

本应用案例是利用角速度传感器制作一个电子罗盘,在LCD显示屏上实时显示当前方位,可以复用已有算法协议层、功能拓展层、硬件驱动层的功能模块。其中LCD显示功能在各层的示例代码如下:

①应用管理层:uintDraw_Compass(uintangle,uintpcolor);显示当前angle角度的电子罗盘,pcolor为当前显示颜色,对angle的计算通过调用算法模型层中罗盘角度函数获取,画指针函数则调用功能拓展层的画线函数。

②算法模型层:uintCac_Compass(uintx,uinty,uintz);计算罗盘指针方位,x、y、z为传感器获取的数值,转换成指针的角度。

③功能拓展层:uintlcd_Line(uintx1,uinty1,uintx2,uinty2,uintpcolor);这是画线、调用画点函数。

④硬件驱动层:uintLcd_Pixel(uintx,uinty,uintpcolor);驱动LCD进行画点。

结束语

综上所述,嵌入式系统应用不断拓展、更新换代加速,采用良好的软件设计架构,规范软件开发过程,实现产品设计的重用,减少重复设计和分析,能够提高项目开发的质量和效率。

参考文献

[1]林越.浅谈面向对象开发思想与软件设计架构分析[J].信息通信,2016.

[2]张智慧.多层模型在嵌入式软件开发中的应用研究[J].计算机时代,2017.

[3]郭潇濛.面向对象系统工程方法改进探索[J].科学决策,2016.