feat(CAN): 实现CAN FD协议栈优化和发送队列机制
- 将CAN收发缓冲区扩展至64字节以支持CAN FD协议 - 添加发送队列机制防止高负载时消息丢失 - 优化中断处理流程,直接读取消息数据避免DMA竞争 - 修改编译配置指向Release版本目录 - 调整OTA处理逻辑将Flash擦除操作移至主循环执行 BREAKING CHANGE: 缓冲区大小调整可能影响现有CAN通信协议实现
This commit is contained in:
+18
-3
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user