项目背景:在对CT测试的过程中,模拟心电信号/数字心电信号出现偶发性丢失,ECG信号丢失导致扫描停止。
源码定位:通过日志报错信息,定位到驱动层读取指定数据字节处为000,导致无法正常解析数据。随后,对存储数据的寄存器(FIFO寄存器)读值,发现寄存器内标志位显示FIFO内数据区已满,但数据字节处为000,于是判定是FIFO溢出。
FIFO:fast-in fast-out。在排查FIFO溢出主要原因中,最符合本系统设计的原因如下:1、FPGA突发性大量数据写入,或某一信息帧写入格式出错引起解析失败进入无限等待;2、时序不对称引起读值等待,在解析FIFO数据等待期间FIFO溢出。
由于问题暂未复现,所以目前无解。但就源码中的怀疑的驱动层部分区域:1、硬件中断响应处;2、中断发出解析指令,将工作丢入工作队列,等待工作队列操作;3、工作队列解析FIFO区。三处分别加上时间戳进行观察。
本系统内ECG发送信号频率600Hz,数据帧长度为8Data,FIFO每存200Data拉一次中断,预算25条帧FIFO即满,大概41毫秒响应一次中断,通知工作队列进行解析动作。已知FIFO整个寄存器约800多毫秒便会溢出。
时间戳观察:
在第一处,硬件中断响应处。判断整个处理过程,大于300毫秒即存在风险,大于700毫秒即必然会导致FIFO溢出。
在第二处,work入队。此处需要统计中断将work入队到work开始执行的时间差。由于中断处有两个信号位同时做入队操作,所以需要对其作区分判