feat(canfd): 切换 CANFD 接收为中断驱动和环形缓冲机制

- 将 CANFD 接收机制由轮询改为 FIFO0 的中断事件驱动处理
- 实现循环取空硬件 FIFO0,提高接收效率和响应速度
- 引入环形缓冲区缓存接收帧,支持多路通道多帧队列管理
- 置位解析任务标志位,实现接收数据的异步解析
- 增加接收中断统计,包括 FIFO 满和溢出计数
- 重构临界区代码,使用自定义函数保护中断状态
- 修改接收过滤器配置,支持按掩码匹配标准帧进入 FIFO0
- 使能 CAN FIFO0 多种中断标志,包括非空、满和溢出中断
This commit is contained in:
cbb
2026-05-30 00:24:31 +08:00
parent 078ea06317
commit f63114f5fd
26 changed files with 1173 additions and 121 deletions
+8 -7
View File
@@ -153,7 +153,8 @@
**当前任务节拍划分:**
- 500us:采样 VREF 原始值
- 1ms:采样温度原始值 + 计算工程值
- 10ms:CAN 接收轮询 + 接收解析
- CAN RX 中断:置位接收解析任务,主循环按预算尽快消费
- 10ms:保留系统 10ms 节拍计数
- 100ms:CAN 发送准备 + CAN 发送 + 状态灯任务
- 1s:心跳任务 + 诊断打印任务
@@ -323,20 +324,20 @@
### `device/CANFD.cpp`
**作用:**
- 初始化 CANFD 工作模式
- 轮询接收 FIFO
- 缓存接收帧
- RX0 中断批量搬空硬件 FIFO0
- 按通道缓存接收帧
- 构建状态发送帧
- 发送准备好的 FD 帧
- 维护 CANFD 诊断统计信息
**内部拆分特点:**
- RX 和 TX 已拆成两段式
- 接收侧:`poll -> cache -> consume`
- 接收侧:`rx interrupt -> queue -> consume`
- 发送侧:`prepare -> send`
**当前内部缓存:**
- `g_rx_frame`:单帧接收缓存
- `g_tx_buffer`:待发送帧缓存
- `s_rxQueues`:三路接收环形缓冲
- `s_txQueues`:三路待发送环形缓冲
- `g_can_diag`:收发与错误统计
这是当前最重要的通信模块之一。
@@ -497,11 +498,11 @@ main.cpp
- `main` 已瘦身
- 任务管理与任务执行已分离
- CANFD 收发流程已拆成两段式
- CANFD 接收已切换为中断事件驱动和环形缓冲
- ADC / 温度 / 定时器 / 串口 已模块化
### 当前仍可继续演进的方向
- 将 `task_runner.cpp` 再拆成 `task_adc.cpp / task_can.cpp / task_diag.cpp`
- 将 CANFD 单帧缓存升级为轻量环形缓冲
- 将协议帧定义抽到单独文件中
- 完善状态灯任务与心跳任务