YTM32B1HA0 FlexCAN Legacy Rx FIFO DMA 开启 D-Cache 时的 Cache 维护时序确认
-
芯片型号:YTM32B1HA0x
SDK版本:1.4.0
应用场景:FlexCAN Legacy Rx FIFO + DMA,Cortex-M7 D-Cache开启问题现象:
FlexCAN Legacy Rx FIFO通过DMA接收报文后,SDK会解析ID、DLC,
并对Data执行字节序转换。如果应用在FLEXCAN_EVENT_DMA_COMPLETE回调中对接收缓冲区执行
SCB_InvalidateDCache_by_Addr(),偶发出现每4字节反转的现象。例如:
期望数据:
00 11 04 00 00 00 2D 0C

异常数据:
00 04 11 00 0C 2D 00 00

目前分析认为,DMA直接写SRAM,而CPU通过D-Cache访问缓冲区。
SDK完成ID/DLC解析和字节序转换后,应用再次Invalidate,
可能会丢弃CPU在Cache中完成但尚未回写SRAM的修改,
导致后续重新读到DMA写入的原始格式。计划将Cache维护放到SDK的DMA所有权切换位置,时序如下:
CleanInvalidate接收缓冲区
-> 配置并启动DMA
-> DMA完成
-> 停止DMA通道或确认DMA不再访问缓冲区
-> Invalidate接收缓冲区
-> SDK读取CS/ID/Data
-> 解析ID和DLC
-> 执行Data字节序转换
-> 触发用户回调SCB_CleanInvalidateDCache_by_Addr(rxBuffer, 16U); DMA_DRV_StartChannel(channel); /* DMA完成回调 */ DMA_DRV_StopChannel(channel); SCB_InvalidateDCache_by_Addr(rxBuffer, 16U); ParseIdAndDlc(rxBuffer); SwapDataByteOrder(rxBuffer); UserCallback(rxBuffer);

应用回调中不再对rxBuffer执行Cache操作,并且先处理或复制当前报文,
最后再重新调用FLEXCAN_DRV_RxFifo()挂接下一次DMA接收。typedef struct ALIGNED(32)
{
uint32_t cs;
uint32_t msgId;
uint8_t data[64];
uint8_t dataLen;
} flexcan_msgbuff_t;想请确认以下问题:
-
上述CleanInvalidate -> DMA -> Invalidate -> SDK解析 -> 用户回调
的Cache维护顺序是否合理? -
DMA完成后,Invalidate是否必须放在SDK第一次读取CS、ID和Data之前?
-
用户回调中是否不应再次Invalidate当前接收缓冲区?
-
Legacy Rx FIFO的Cache维护长度使用16字节是否合适?
-
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...