refactor(spi): 优化CAN反馈推送的节流机制
将CAN反馈推送改为1Hz节流,由taskHeartbeat每秒调用 canFeedbackStartRound激活新轮次,避免与CANFD刷新频率不匹配。 添加s_roundActive标志控制推送节奏,确保每轮完成后等待下一秒 再开始新的推送循环。 --- feat(spi): 实现SPI就绪状态检测和链路状态机 新增SpiLinkState类管理SPI链路状态,通过EXTI6检测PB6引脚 的上升沿来判断ESP32是否完成上一帧处理。 配置SPI Ready引脚的外部中断,实现可靠的ESP32完成信号检测, 避免在ESP32未就绪时过早发起新的SPI通信。 修复SPI接收溢出处理,改为丢弃溢出字节而非重置整个接收缓冲区, 提高SPI通信稳定性。
This commit is contained in:
@@ -251,7 +251,7 @@ void TaskRunner::taskStatusLed() { /* 预留 */ }
|
||||
* @retval 无返回值。
|
||||
* @note 当前仅保留任务入口。
|
||||
*/
|
||||
void TaskRunner::taskHeartbeat() { OtaBootRequest::process(); CanFd::refreshFeedbackSnapshot(); }
|
||||
void TaskRunner::taskHeartbeat() { OtaBootRequest::process(); CanFd::refreshFeedbackSnapshot(); canFeedbackStartRound(); }
|
||||
|
||||
/**
|
||||
* @brief 输出当前温度、电压与 CAN 诊断信息。
|
||||
@@ -378,6 +378,13 @@ void TaskRunner::runPending()
|
||||
{
|
||||
Watchdog::feed();
|
||||
|
||||
/* poll() 含按铃超时看门狗(cancelRing),必须每轮无条件执行。
|
||||
* 否则日志关闭时(CONFIG_SPI_APP_LOG_ENABLE=0) m_logPending 永远为 false,
|
||||
* TASK_SPI_LOG 永不置位,poll() 永不执行,m_ringPending 卡死导致
|
||||
* canFeedbackPushStep() 永久 return -> SPI 反馈链路死锁。
|
||||
* 放在 canFeedbackPushStep() 前确保卡死的按铃先被清掉再推送下一帧。 */
|
||||
AppSpiCommandBus.poll();
|
||||
|
||||
/* CAN 反馈主动推送:GD32 APP 循环推送 3 通道 × 2 页反馈帧到 ESP32,
|
||||
* 替代 ESP32 主动轮询。非阻塞:上一帧未读走时立即返回。
|
||||
* 每次主循环迭代调用一次,ESP32 读走一帧后 CS 释放中断唤醒主循环继续推送。 */
|
||||
@@ -405,7 +412,7 @@ void TaskRunner::runPending()
|
||||
if(pending & (1UL << TASK_STATUS_LED)) taskStatusLed();
|
||||
if(pending & (1UL << TASK_HEARTBEAT)) taskHeartbeat();
|
||||
if(pending & (1UL << TASK_DIAGNOSTIC_PRINT)) taskDiagnosticPrint();
|
||||
if(pending & (1UL << TASK_SPI_LOG)) AppSpiCommandBus.poll();
|
||||
/* TASK_SPI_LOG 的 poll() 已移至 runPending() 开头无条件调用(含按铃看门狗) */
|
||||
if(pending & (1UL << TASK_SPI_CMD_PROCESS)) taskSpiCmdProcess();
|
||||
if(pending & (1UL << TASK_ETHERCAT_PROCESS)) taskEthercatProcess();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user