feat(CAN): 实现CAN FD协议栈优化和发送队列机制

- 将CAN收发缓冲区扩展至64字节以支持CAN FD协议
- 添加发送队列机制防止高负载时消息丢失
- 优化中断处理流程,直接读取消息数据避免DMA竞争
- 修改编译配置指向Release版本目录
- 调整OTA处理逻辑将Flash擦除操作移至主循环执行

BREAKING CHANGE: 缓冲区大小调整可能影响现有CAN通信协议实现
This commit is contained in:
cbb
2026-04-26 02:27:34 +08:00
parent 26cf5af14f
commit d019b41ed6
20 changed files with 1783 additions and 1579 deletions
+18 -3
View File
@@ -138,6 +138,20 @@ void OTAHandler::init() {}
* @retval 无
*/
void OTAHandler::process() {
// 执行待处理的Flash擦除操作(在主循环中执行,避免中断中耗时操作)
if (pending_flash_erase) {
pending_flash_erase = false;
#if DEBUG_OTA
printf("Executing pending Flash erase...\r\n");
#endif
eraseApplicationArea();
#if DEBUG_OTA
printf("Flash erase completed.\r\n");
#endif
// Flash擦除完成后,更新状态为接收固件
ota_state = OTA_STATE_RECEIVING_FIRMWARE;
}
if (ota_state == OTA_STATE_IDLE) {
ota_time = 0; // 重置计时器
static u8 zero[1] = {0};
@@ -444,12 +458,13 @@ void OTAHandler::handleOTAMessage(u32 id, u8 *data, u8 len) {
send_error_frame(OTA_ERROR_INVALID_SIZE);
return;
}
// 设置待执行的Flash擦除标志,在process()中执行(避免中断中耗时操作)
pending_flash_erase = true;
// 注意:不立即改变状态,等待Flash擦除完成后在process()中改变
// 发送确认信号,告诉上位机可以开始发送数据
u8 send_data[6] = {0xBA, 0xC0, 0x00,
0x00, 0x00, 0x00}; // 确认开始传输
eraseApplicationArea();
// 发送接收包0请求
CAN0_transmiter.CANFD_AsyncSend(CANFD_OTA_ACK_ID, 6, send_data);
ota_state = OTA_STATE_RECEIVING_FIRMWARE;
} else if (len == 2 and ota_state == OTA_STATE_FINISHED) {
#if DEBUG_OTA
printf("stage--:OTA_STATE_FINISHED\r\n");