-
Notifications
You must be signed in to change notification settings - Fork 5.3k
feat[can][gd32]: Implement non-blocking send mechanism #10796
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
| } | ||
| return freebox; | ||
| } | ||
| rt_ssize_t _can_sendmsg_nonblocking(struct rt_can_device *can, const void *buf) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
不同函数后需要加一个换行
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
不同函数后需要加一个换行
已修改
| return RT_EOK; | ||
| } | ||
|
|
||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
删除一个换行
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
删除一个换行
已经修改
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR implements a non-blocking send mechanism for CAN devices on GD32F5 platforms. The implementation allows CAN message transmission without blocking when transmit mailboxes are full.
- Adds a helper function to check available transmit mailboxes
- Implements non-blocking message transmission with immediate failure when no mailboxes are available
- Integrates the new functionality into the CAN operations structure
| if (CAN_STAT(can_x) & CAN_TSTAT_TME0 != 0U) | ||
| { | ||
| freebox++; | ||
| } | ||
| if (CAN_STAT(can_x) & CAN_TSTAT_TME1 != 0U) | ||
| { | ||
| freebox++; | ||
| } | ||
| if (CAN_STAT(can_x) & CAN_TSTAT_TME2 != 0U) |
Copilot
AI
Oct 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Operator precedence issue / 运算符优先级问题: The bitwise AND operation has lower precedence than the inequality comparison. This will evaluate as CAN_STAT(can_x) & (CAN_TSTAT_TME0 != 0U) which is incorrect. Add parentheses around the bitwise operation. / 按位与运算符的优先级低于不等比较运算符。这会被计算为 CAN_STAT(can_x) & (CAN_TSTAT_TME0 != 0U),这是错误的。需要在按位运算周围添加括号。
| if (CAN_STAT(can_x) & CAN_TSTAT_TME0 != 0U) | |
| { | |
| freebox++; | |
| } | |
| if (CAN_STAT(can_x) & CAN_TSTAT_TME1 != 0U) | |
| { | |
| freebox++; | |
| } | |
| if (CAN_STAT(can_x) & CAN_TSTAT_TME2 != 0U) | |
| if ((CAN_STAT(can_x) & CAN_TSTAT_TME0) != 0U) | |
| { | |
| freebox++; | |
| } | |
| if ((CAN_STAT(can_x) & CAN_TSTAT_TME1) != 0U) | |
| { | |
| freebox++; | |
| } | |
| if ((CAN_STAT(can_x) & CAN_TSTAT_TME2) != 0U) |
| if (CAN_STAT(can_x) & CAN_TSTAT_TME0 != 0U) | ||
| { | ||
| freebox++; | ||
| } | ||
| if (CAN_STAT(can_x) & CAN_TSTAT_TME1 != 0U) | ||
| { | ||
| freebox++; | ||
| } | ||
| if (CAN_STAT(can_x) & CAN_TSTAT_TME2 != 0U) |
Copilot
AI
Oct 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Operator precedence issue / 运算符优先级问题: Same operator precedence issue as above. Add parentheses around the bitwise operation: (CAN_STAT(can_x) & CAN_TSTAT_TME1) != 0U. / 与上面相同的运算符优先级问题。需要在按位运算周围添加括号:(CAN_STAT(can_x) & CAN_TSTAT_TME1) != 0U。
| if (CAN_STAT(can_x) & CAN_TSTAT_TME0 != 0U) | |
| { | |
| freebox++; | |
| } | |
| if (CAN_STAT(can_x) & CAN_TSTAT_TME1 != 0U) | |
| { | |
| freebox++; | |
| } | |
| if (CAN_STAT(can_x) & CAN_TSTAT_TME2 != 0U) | |
| if ((CAN_STAT(can_x) & CAN_TSTAT_TME0) != 0U) | |
| { | |
| freebox++; | |
| } | |
| if ((CAN_STAT(can_x) & CAN_TSTAT_TME1) != 0U) | |
| { | |
| freebox++; | |
| } | |
| if ((CAN_STAT(can_x) & CAN_TSTAT_TME2) != 0U) |
| { | ||
| freebox++; | ||
| } | ||
| if (CAN_STAT(can_x) & CAN_TSTAT_TME2 != 0U) |
Copilot
AI
Oct 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Operator precedence issue / 运算符优先级问题: Same operator precedence issue as above. Add parentheses around the bitwise operation: (CAN_STAT(can_x) & CAN_TSTAT_TME2) != 0U. / 与上面相同的运算符优先级问题。需要在按位运算周围添加括号:(CAN_STAT(can_x) & CAN_TSTAT_TME2) != 0U。
| if (CAN_STAT(can_x) & CAN_TSTAT_TME2 != 0U) | |
| if ((CAN_STAT(can_x) & CAN_TSTAT_TME2) != 0U) |
| { | ||
| RT_ASSERT(can); | ||
|
|
||
| can_trasnmit_message_struct transmit_message; |
Copilot
AI
Oct 13, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in variable type / 变量类型拼写错误: The type name contains a typo. It should be can_transmit_message_struct instead of can_trasnmit_message_struct. / 类型名称包含拼写错误,应该是 can_transmit_message_struct 而不是 can_trasnmit_message_struct。
| can_trasnmit_message_struct transmit_message; | |
| can_transmit_message_struct transmit_message; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个也修改下吧,很有用
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
官方的编码规范问题,出现过很多次了,需要注意下其他系列是不是也有这个问题,然后从rtt的软件包中统一一下命名

拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
为GD32F5适配can 不阻塞发送
你的解决方案是什么 (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