🛠️ MCAL 连续两帧相同ID CAN 报文丢帧Bug
-
问题描述
在连续发送两帧命中同一个邮箱(Message Buffer, MB)时,若用户的中断处理函数耗时较长,可能会出现第二帧丢失的情况。
复现方法
- 使用 CAN 总线设备向目标 CAN Driver 发送一帧报文,数据为全
0x00
; - 在
TxConfirmation
回调函数中打断点; - 当断点命中后,再发送一帧相同 ID 的报文,数据改为全
0xFF
; - 全速运行程序,观察断点不会再次命中;
- 此时暂停程序,检查 RAM 会发现数据已写入 MB,但未触发中断,导致丢帧。
原因分析
-
接收中断触发后,驱动的处理流程为:
- 复制 MB 数据,解锁邮箱;
- 调用用户层回调函数;
- 清除 IFLAG 中断标志位。
-
在 步骤 1 完成后,邮箱已解锁,可接收下一帧报文;
-
如果此时下一帧报文迅速到达并命中相同邮箱,会重新置位 IFLAG;
-
然而,在 用户回调函数执行完后才清除 IFLAG,会将刚才置位的中断标志也一并清除;导致第二帧虽然数据已被写入,但中断未触发,用户层未能感知,出现丢帧。
修复方案
在调用用户的中断处理函数前,先清除邮箱的中断标志位,避免误清除后续帧的中断标志。
影响版本
以下版本存在该问题(之前的版本也会存在该问题):
YTM32B1HA0_1_0_0_HF001
YTM32B1MC0_1_0_0
YTM32B1ME0_2_2_0
YTM32B1MD1_2_2_0
- 使用 CAN 总线设备向目标 CAN Driver 发送一帧报文,数据为全
-
F Frankie 从 中的 MCAL BUGS 移动了该主题
-
改动挺多的,没有提供示例代码,建议直接升级。
-
那是需要我这边出一个针对影响版本的修复方案吗?
-
-
J jiankang_wang 被引用 于这个主题
-
J jiankang_wang 被引用 于这个主题
-
J jiankang_wang 被引用 于这个主题
-
E Enwei 从 MCAL Private Issues 移动了该主题
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...