板子是自己画的,i.MX RT1052,跑FreeRTOS 10.3,LPUART3用DMA收,波特率115200,接的是产线上的扫码枪。现在批量老化测试,大概每200次扫码会丢1~2个字节,帧头对不上整帧就废了。产线那边天天催,说再搞不定这周出货要延期。
现象是丢的字节位置不固定,有时候是帧头,有时候是中间。已经排查过:DMA环形缓冲开的是半满+全满中断,缓冲8K,任务优先级给到最高了,临界区也加了。用逻辑分析仪抓过线上数据是完整的,问题应该在接收侧。怀疑过是DMA和CPU抢总线,也把MPU配置里那块RAM改成non-cacheable了,还是偶发。
现在怀疑两个方向:一是FreeRTOS的任务切换时机导致半满中断响应延迟,DMA指针跑过读指针;二是cache一致性问题,虽然关了cache但不确定配置对不对。有没有跑过RT1052 LPUART DMA的兄弟?边界条件这块到底该怎么卡才稳?在线等,比较急。
先别急着怀疑RTOS,你这现象我修板子见多了——八成是DMA描述符或缓冲对齐的问题。三个点你查一下:
1. LPUART的DMA接收描述符数组和缓冲有没有按32字节对齐?RT1052的eDMA对描述符对齐很敏感,没对齐偶尔会跳描述符,丢字节就这么来的。
2. 半满/全满中断里你读的是TC还是DONE?LPUART空闲中断有没有开?扫码枪一帧结束有空闲间隔,不开IDLE中断靠DMA满中断拼帧,边界处最容易丢。
3. 量一下LPUART3的供电和时钟使能顺序,先量供电再查信号——这话不是白说的,外设时钟没稳就配DMA,偶发丢字节很典型。
先把描述符对齐和IDLE中断补上,八成能好。