如何提高单片机程序的可靠性、实时性、测量准确性

发布日期:2022-12-30
如何提高单片机程序的可靠性、实时性、测量准确性

电工优优今天要和大家分享的如何提高单片机程序的可靠性、实时性、测量准确性相关信息,接下来我将从如何提高单片机程序运行效率,如何提高单片机程序计时精度,如何提高单片机抗干扰这几个方面来介绍。

可靠性单片机程序可靠性这个这个话题比较大,但是也还是有可行的方法来操作的

开发流程标准化,可以尽量往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;

//do something here

}

void task_5ms(void){

foo();

}

上述这种就是死等延时,这种设计实时性很差,我们完全可以通过状态机的方式,让for循环这个延时释放出来做别的事。改进例子如下:

uint32_t delayCounter = 0;;

void foo(void){

if(delayCounter{

delayCounter++;

}else{

//do something here

delayCounter=0;

}

}

void task_5ms(void){

foo();

}

运用这种异步方法,可以大大提高系统实时性。还有就是像写flash,EEPROM这种操作,也可以先更新内存值,再统一10ms左右更新一次这样异步实现,来提高实时性。

测量准确性

测量准确性这块主要分三个方向分析和改善

硬件元器件,尽量选精度高的电阻电容,降低元器件引入的误差。

电路设计,PCB 布板时尽量降低由于布线引入的干扰,保证参考电压源和地不会因为干扰源发生抖动。

软件滤波。如果硬件已经成型,可以通过多个采样周期后求平均值,或者搞一个一阶滤波或者多阶滤波算法,甚至FFT采样然后去掉分频量的方法提高采样的准确度。还有就是对于一些明显的错误值,可以考虑丢弃掉,当前周期暂时使用上一个周期的有效值的方式去做计算。

以上就是"电工优优"为大家介绍的如何提高单片机程序运行效率的相关信息,想了解更多"如何提高单片机程序的可靠性、实时性、测量准确性,如何提高单片机程序运行效率,如何提高单片机程序计时精度,如何提高单片机抗干扰"相关知识,请收藏电工无忧吧。