无阻塞日志打印 环形缓冲区与DMA
一. 引言
研发一个稳定的嵌入式系统软件需要严格的测试,而实时打印日志是一个很棒的方法。日志打印的特点包括2个:可能突发地打印一批信息;打印信息不能干扰软件的正常运行。
大部分嵌入式设备使用UART口执行日志打印,UART口是慢速通信设备,如果前一条日志没有打印完毕,打印当前日志的进程只能阻塞等待,这样就会干扰软件的正常运行。
为此,我们设计一个环形缓冲区,它结合DMA可以实现“无阻塞日志打印”。
二. 数据结构
如下图所示,该数据结构组织成“生产者/消费者”队列,其中Head记录下一个存储输入位置,Tail记录下一个打印输出位置,DMASize记录当前DMA一次输入数据的个数。
三. 时序逻辑
如上图所示:
当Process需要打印日志时,它将复制数据到缓冲区,如果DMA空闲,将启动DMA;如果DMA忙碌,将直接退出。
当DMA一次输出完毕后,ISR先清除中断标志,然后检查缓冲区是否有数据需要打印,如果有数据,再次启动DMA;如果没有数据,直接退出。
Process和ISR的逻辑流程图如下所示:
四. 程序接口
考虑“无阻塞日志打印”可以部署到大部分嵌入式设备,我们在设计程序时必须做到:与CPU无关,与OS无关。它的程序接口如下,针对不同的CPU和OS具体实现有所不同。