大家好,今天小编关注到一个比较有意思的话题,就是关于单片机模块化编程架构规范优化的问题,于是小编就整理了1个相关介绍单片机模块化编程架构规范优化的解答,让我们一起看看吧。
如何提高单片机程序的可靠性、实时性、测量准确性?
题主提到的单片机程序的可靠性、实时性,
软件架构起着决定性的作用,单片机程序的软件架构有以下几点需要考虑:
1)分层分模块
单片机程序至少分为三个层次,包括硬件驱动层,中间层,和应用层。
硬件驱动层主要实现对硬件的驱动控制,包括输入按键检测,AD采样,UART/IIC/SPI的收发,系统定时时钟的产生、定时事件传送、事件销毁,输入指示灯控制,LCD显示控制,FLASH读写等等。
中间层作为硬件驱动层和应用层之间的中间处理模块,负责将应用层控制硬件驱动层的公共逻辑抽象提炼,而设计成一些能脱离应用层独立运行的模块。比如UART数据的收发,当应用层需要发送数据时,需要调用UART硬件驱动层的发送函数将数据填入发送缓存,再通过UART的发送中断或DMA将数据逐一送出,当有多个应用层都需要往UART发送数据时,需要有队列的机制,需要有先进先出的机制等等,而且有些应用层的UART数据需要有对端的应答,在超时没有收到应答时,需要超时重发。当多个应用层模块需要通过UART发送数据时,每一个应用层模块都需要处理这样的逻辑,将会使软件异常臃肿无法维护。这个时候需要有一个串口数据的收发模块,将所有应用层的数据填入队列,通过状态机按先进先出将报文从队列取出,通过硬件驱动层的接口发送出去,同时通过状态机处理数据应答,超时重发等机制,这样一来,应用层的模块只需要闭着眼睛调中间层的函数接口传送报文,并且检测中间层返回的状态,做一些事件处理即可。
应用层是根据产品的功能抽象,根据不同的功能模块划分,包括,设备设置、UI显示、应用逻辑控制等等。每一个应用层的功能模块都要配合状态机实现,状态机的每一个状态都有一个状态函数,每一个状态函数都有定时器,子状态等等,之后就是按照逻辑根据不同的事件切换状态。
这个问题太大了,未完待续
这一期,重点所讲内容主题是振弦式测缝计结构及工作原理,以下是相关内容:
结构:
VWD-J 型振弦式测缝计由护管座、护筒、位移计、后接圈、观测电缆等组成,其位移计内部由滑动测杆、振弦、激振电磁线圈、测温元件等组成。
工作原理:
当被测结构物发生位移时将会带动测缝计变化,通过前、后端座传递给振弦使其产生应力变化,从而改变振弦的振动频率。电磁线圈激振振弦并测量其振动频率,频率信号经观测电缆传输至读数装置,即可测出被测结构物的位移量。同步测量埋设点的温度值。
从接触单片机到现在,也有十几年了,从个人设计经验上来简单说一说,希望可以给你提供一点思路和参考。
可靠性
单片机程序可靠性这个这个话题比较大,但是也还是有可行的方法来操作的开发流程标准化,可以尽量往CMMI 3级标准上靠。要有系统设计文档输出,软件版本管理,bug管理系统进行bug跟进。
- 系统设计,主要是将整个系统按功能层次做好模块化设计。如果所在的公司或机构还没有一套成熟的系统功能划分方法,我建议你可以参考ARM 的 CMSIS架构来划分软件模块,然后进行系统设计。CMSIS架构如下图所示。
- 硬件,软件可靠性好,前提是它所运行的硬件系统也需要设计得可靠。这就需要设计硬件时多用你们已有的成熟电路,设计初期进行DFMEA等。
- 软件设计,提倡先写设计文档再撸代码。主要是设计的时候需要多做单元测试,提高代码质量。代码质量提高的方法有降低逻辑复杂度,模块化设计等,可以直接参考MISAR C标准做代码质量检测,这块工作有工具可以完成,不用人肉做,相关工具有polyspace,QAC,PC-Lint等。
实时性
要想实时性高,方法有两种,
简单粗暴的,直接用频率更高的MCU。
异步设计。这种设计主要是通过尽量少使用空跑循环来做延时实现的。比如这个例子,我希望foo函数延时n毫秒再做某事:
void foo(void){
uint32_t i;
for(i=0;i<delay_time;i++){};
//do something here
}
void task_5ms(void){
foo();
}
上述这种就是死等延时,这种设计实时性很差,我们完全可以通过状态机的方式,让for循环这个延时释放出来做别的事。改进例子如下:
uint32_t delayCounter = 0;;
void foo(void){
if(delayCounter<(delay_time/5ms){
delayCounter++;
}else{
//do something here
delayCounter=0;
}
}
void task_5ms(void){
foo();
}
运用这种异步方法,可以大大提高系统实时性。还有就是像写flash,EEPROM这种操作,也可以先更新内存值,再统一10ms左右更新一次这样异步实现,来提高实时性。
测量准确性
测量准确性这块主要分三个方向分析和改善
硬件元器件,尽量选精度高的电阻电容,降低元器件引入的误差。
电路设计,PCB 布板时尽量降低由于布线引入的干扰,保证参考电压源和地不会因为干扰源发生抖动。
软件滤波。如果硬件已经成型,可以通过多个采样周期后求平均值,或者搞一个一阶滤波或者多阶滤波算法,甚至FFT采样然后去掉分频量的方法提高采样的准确度。还有就是对于一些明显的错误值,可以考虑丢弃掉,当前周期暂时使用上一个周期的有效值的方式去做计算。
到此,以上就是小编对于单片机模块化编程架构规范优化的问题就介绍到这了,希望介绍关于单片机模块化编程架构规范优化的1点解答对大家有用。