如何提高单片机程序的可靠性实时性测量准确性?
题主提到的单片机程序的可靠性、实时性,
软件架构起着决定性的作用,单片机程序的软件架构有以下几点需要考虑:
1)分层分模块
单片机程序至少分为三个层次,包括硬件驱动层,中间层,和应用层。
硬件驱动层主要实现对硬件的驱动控制,包括输入按键检测,AD采样,UART/IIC/SPI的收发,系统定时时钟的产生、定时事件传送、事件销毁,输入指示灯控制,LCD显示控制,FLASH读写等等。
中间层作为硬件驱动层和应用层之间的中间处理模块,负责将应用层控制硬件驱动层的公共逻辑抽象提炼,而设计成一些能脱离应用层独立运行的模块。比如UART数据的收发,当应用层需要发送数据时,需要调用UART硬件驱动层的发送函数将数据填入发送缓存,再通过UART的发送中断或DMA将数据逐一送出,当有多个应用层都需要往UART发送数据时,需要有队列的机制,需要有先进先出的机制等等,而且有些应用层的UART数据需要有对端的应答,在超时没有收到应答时,需要超时重发。当多个应用层模块需要通过UART发送数据时,每一个应用层模块都需要处理这样的逻辑,将会使软件异常臃肿无法维护。这个时候需要有一个串口数据的收发模块,将所有应用层的数据填入队列,通过状态机按先进先出将报文从队列取出,通过硬件驱动层的接口发送出去,同时通过状态机处理数据应答,超时重发等机制,这样一来,应用层的模块只需要闭着眼睛调中间层的函数接口传送报文,并且检测中间层返回的状态,做一些事件处理即可。
应用层是根据产品的功能抽象,根据不同的功能模块划分,包括,设备设置、UI显示、应用逻辑控制等等。每一个应用层的功能模块都要配合状态机实现,状态机的每一个状态都有一个状态函数,每一个状态函数都有定时器,子状态等等,之后就是按照逻辑根据不同的事件切换状态。
这个问题太大了,未完待续