Repository navigation
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: componentsReviewers: @Maihuanyi Changed Files (Click to expand)
🏷️ Tag: components_driver_canReviewers: @wdfk-prog Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-03-19 16:06 CST)
📝 Review Instructions
|
BernardXiong
left a comment
There was a problem hiding this comment.
或许可以对can收发过程中的中断屏蔽机制做个整体的重构?一个是一些计数++的部分,可以使用原子操作的方式;其他部分是否可以semaphore或spinlock进行处理?
|
Rbb666
left a comment
There was a problem hiding this comment.
当前非阻塞发送路径仍可能覆盖已经接受的 CAN 消息,需要修正后再合并。
components/drivers/can/dev_can.c 第 369~374 行在判断软件队列为空后恢复中断,再尝试硬件发送。存在以下交错:线程 A 在恢复中断后被线程或 ISR B 抢占;B 填满硬件邮箱及软件发送队列;A 恢复后硬件发送失败,直接调用 rt_ringbuffer_put_force(),覆盖 B 已入队的旧消息,但仍增加 sent_size 并向调用者报告成功。上层非阻塞写路径没有互斥锁,不能排除这种交错。
原来的此处使用容量检查和普通入队,队列满时返回短写;这次引入的强制覆盖会造成静默丢消息。原评审线程 虽已标记解决,当前 head 中该调用仍然存在。
请重新检查队列容量,禁止覆盖已接受但尚未发送的消息,并保证队列检查、硬件发送和入队之间的同步关系覆盖线程及 ISR 场景。请验证双发送者抢占、硬件邮箱满及软件队列满时,不会丢弃旧消息,返回长度也与实际接受的消息数一致。
这个不好修的,机制在这里决定了修起来很困难 |
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
当调用CAN通信连续发送N包数据(如序号1 2 3 4 5 6 7 8 ),当发送超过硬件缓存区(3个)时,会将多余的 4 5 6 7 8依次存入ringbuff,并在发送完成中断再次从ringbuff中取出数据写入硬件缓存区,但是由于_can_nonblocking_tx中处理逻辑,每次优先请求硬件是否有空间,再考虑写入缓存区,后发的数据可能先进入硬件缓存区而发送出去
在中断处理RT_CAN_EVENT_TX_DONE中检测ringbuff中是否有数据,先弹出再尝试发送,如果失败又重新压入队列中,也导致了顺序错乱
你的解决方案是什么 (what is your solution)
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up