基于嵌入式系统的C语言编程软件设计研究

2019-12-22 21:23徐玉莲
微型电脑应用 2019年10期
关键词:罗盘C语言嵌入式

徐玉莲

(新疆农业职业技术学院 信息技术分院, 昌吉 831100)

0 引言

随着计算机程序复杂化程度逐渐提高,对系统软件更新速度的需求逐渐提升,C语言兼具高初级语言特性,支持对硬件的直接操作,在普遍应用的嵌入式软件开发过程中使用较多的便是C语言,在提高灵活性的同时易增加复杂代码管理和维护的难度,在特定硬件平台上建立的嵌入式系统编程需解决复杂的硬件操作问题,并实现应用层次上的通用性,需采用良好的软件框架完成软件开发过程,提高程序代码的重用性、拓展性,实现工程化管理,提高软件系统的开发和维护效率。

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

分层技术可将复杂问题转化成具体的应用功能,随着嵌入式系统应用越来越复杂,对嵌入式系统采用分层技术进行设计,可使软件开发效率得以有效提升。

1.1 分层原则

为实现复杂的软件系统功能,需有效分解开发需求,将软件按照概念层次、功能等的不同划分为相应的软件模块,在此基础上确定不同模块间的关系。对软件逻辑架构进行分层时需遵循的原则为:兼顾功能颗粒度和可重用性,各层针对不同的问题能够提供相应的解决方案,上层应用能够从下层获取相应支撑,以监测环境温度功能为例,根据概念的不同将其划分为采集层、处理层、显示层等,确保整体功能递进实现;最大程度降低层与层间的相关性,避免某一层出现问题后对软件系统的整体性能产生影响,如显示层没有处理或修改温度数据的权限,使处理层的逻辑实现更加独立快速;确保软件功能的高内聚、低耦合,进行各层内部模块划分时需按照任务分解、功能优化、重用程度完成[1]。

1.2 分层设计方法

遵循最优模块化的设计思路,详细设计系统逻辑架构,针对嵌入式应用软硬层次比较明显等特点,对软件功能模块进行梳理和划分:梳理嵌入式系统应用需求(采取自顶向下的方法),逻辑功能抽象化处理后得到明确的概念层次,在此基础上转化为软件层次,属于渐进过程,以电子罗盘开发为例,为了确定具体的方向,首先需对方位数据进行准确采集,通过传感器数据的采集(包含x、y、z轴)实现方位数据的转换,最后在显示屏上显示输出,整个过程的逻辑层次可划分为硬件访问、硬件驱动、数据采集及处理、页面显示等;抽象处理硬件功能,细化应用开发所需硬件操作原语(采取自底向上方式),开发嵌入式系统时相应专用功能的实现大多通过软件驱动底层硬件完成,为了简化系统开发过程,提高程序代码的复用性,对硬件功能进行封装处理,降低硬件的相关性,以传感器采集数据为例,开发时分为硬件驱动和功能拓展两个层次,降低了系统的耦合性;对于邻层间的调用关系和信息交互的检验则需逐层检测(结合使用自顶向下和自底向上方式),通过合并整合各层的功能,尽量实现最优模块化[2]。

1.3 分层技术的应用

在面向对象对嵌入式系统进行“去中心化”设计的基础上,可将系统逻辑架构区分为:应用管理层(负责界面交互的实现及调度业务逻辑等)、算法协议层(负责协议解析、文件及数据库管理等)、功能拓展层、硬件驱动层(实现与硬件的无关性),为降低业务应用的耦合性,提高软件功能模块的开发效率,实现功能在使用同类或相似技术时,通过聚合处理降低模型算法及硬件操作间的耦合性,多个应用逻辑可由一个成熟的模型算法实现,从而使功能在分析设计过程中更加清晰明确,所构建的应用程序的结构具备较高的灵活性、可重用性和拓展性,能够适应不同的硬件环境。

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

为提高项目开发效率,基于C语言的嵌入式系统需灵活运用C语言的编程模式,提高代码编写质量及维护效率。

2.1 代码管理

C语言的优势在于其使用的灵活性,但易出现文件组织混乱、降低代码可阅读性等问题,可依据上述系统逻辑架构设计(C语言不提供软件框架管理)完成工程文件管理原则的构建,从而使代码文件的开发和管理能力得以有效提升,代码管理主要涉及到两部分:文件目录管理,文件目录的组织同样需按照分层原则,遵循统一规范对各文件命名,在根目录存放主程序、全局变量文件,在Apfunc中存放应用管理层文件,在Modelfunc中存放算法协议层,在Hardext中存放功能拓展层,在Hardopt中存放硬件驱动层文件,可通过建立Comfuc文件夹用来存放涉及到的第三方通用函数库,利用分层模型的优势完成开发过程,不同文件夹可并行开发工作,满足工程化管理需求;功能模块管理,最大程度降低全局变量的使用量,通过函数参数实现数据的传递,以实现模块化设计的高内聚性,聚合相同或相似的业务应用功能、硬件操作功能,使其能够在同一文件内实现[3]。

2.2 面向对象设计

充分运用C语言的结构类型和函数指针,实现类似面向对象的重要特性。

对象属性的继承可通过结构嵌套实现,以罗盘对象参数继承为例[4]。

typedef struct_compassbase{ //罗盘基类

Int radius; //罗盘半径

Int centerx, centery; //罗盘中心

} compassbase;

Typedef struct_compass {

Struct _ compassbase ;

Int handle; //指针位置

Int handle //指针位置

}

利用函数指针可封装对象属性和对象实现,罗盘基类封装如下:

struct_compassbase;

void (* drawcompass) (struct _compassbase * p com-base) ;

struct _ compassbase { //罗盘基类

Int radius ; //罗盘半径

Int centerx, centery; // 罗盘中心

Draw compass pdrawcompass ;

}

2.3 模块重用设计

通过函数模块实现重用功能,函数定义实现方式:宏定义,宏是类型无关,降低额外开销;函数,作为可重复使用的代码,函数能够独立实现某功能。通过使用角速度传感器制作电子罗盘,函数的调用关系描述如下[5]。

当前方位的实时显示在LCD显示屏上完成,可对功能模块(算法协议层、功能拓展层、硬件驱动层)进行复用,

通过罗盘角度函数(位于算法模型层)的调用获取angle,通过画线函数(位于功能拓展层)的调用获取画指针函数,应用管理层示例代码为:unit draw_ compass (unit angle, unit pcolor)

通过计算将传感器获取数据(xyz值)转换为指针角度,以确定罗盘指针方位,算法模型层示例代码为:uint cac_ compass (unit x, unit y, unitz );

功能拓展层的画线、调用画点函数示例代码为:uint lcd_ line (unit x 1, unit y1, unit x2, unit y2, uint pcolor);

硬件驱动层驱动LID进行画点的示例代码为:uint lcd_pixel(unit x, unit y, unint pcolor)。

3 系统语言的使用函数表达

C语言涉及到较多的含有参数和函数的表达式,在程序研究中关于main函数的变化较为关键,在main可编辑函数中的参数的含义及个数由agent表示,分析判断作为指导性参数值的agent能够获取函数相关的即时数组信息。操作系统的函数变化决定着函数的配置启动,因此对其初始变化值要求较为严格,需先进行函数的归零处理,通过不同数值的参数的提取(在各函数变换模块中)使计算机程序进入有效运行状态,main语言在程序进入预定设计轨道后能够对程序的下一步运行进行自动控制(即嵌入式的系统模式),在嵌入过程中通过交叉比对实现相关参数原有数据值的保留,自动地删除无用的数据,并修改运行错误和编辑错位,在嵌入交汇过程中系统自动甄别所出现的语言混乱情况,重新拟定新main函数获取相应的函数编辑式,若仍无法完成重新定义则自动划分函数为初始程序处理,从而确保函数间的有效串接,使系统程序能较好的适应新的语言环境[6]。

4 总结

本文主要研究了C语言编程软件在嵌入式系统中开发过程的实现路径,依据分层设计的原则,完成了功能模块划分,对系统软件的编程思路进行了详细阐述,介绍了软件开发过程中的程序框架、模块重用等设计过程的实现方法,结合C语言编程使用的函数表达功能,提高了C语言的灵活性,同时满足了软件开发工程化的需求,为在嵌入式系统开发中使用C语言提供参考。

猜你喜欢
罗盘C语言嵌入式
基于IMX6ULL的嵌入式根文件系统构建
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
基于FPGA的双通道无线电罗盘激励器的设计
互联网+教育背景下的C语言程序设计教学改革探究
基于Visual Studio Code的C语言程序设计实践教学探索
基于ARM嵌入式的关于图像处理的交通信号灯识别
51单片机C语言入门方法
TS系列红外传感器在嵌入式控制系统中的应用
数学王国大闯关
不宜上课