fix(boot): 修复SPI OTA协议中的ACK丢失死锁和缓冲区管理问题

- 修复ACK丢失导致的死锁问题:修改onCsRelease()逻辑,只有在ESP32发送
  有效v2请求帧时才清除s_txPending,避免dummy poll误清待发ACK

- 优化缓冲区管理和信用机制:实现增量式flash缓冲区排空(drainFlashBufferOne),
  避免一次性排空阻塞主循环;CREDIT计算同时考虑ISR DATA队列待处理数量

- 添加重复序列处理增强:当DATA仍在主循环排队时优先回复ACK(type=0x80),
  避免ESP32长时间接收WAIT导致连接中断

- 修复缓冲区满时的数据包丢失:在handleLinkMessage中同步排空已写入槽位,
  腾出空间后继续处理当前包,防止永久DUP-SEQ错误

- 优化主循环处理顺序:先处理ISR DATA队列并及时回复ACK,再进行flash写入,
  减少ESP32超时重发导致的断续问题

- 增加FLASH写入错误检查:验证fmc_word_program返回状态,写入失败时及时
  返回避免数据损坏
This commit is contained in:
cbb
2026-07-14 12:10:25 +08:00
parent c644c29a4b
commit 1223be9ca9
5 changed files with 176 additions and 68 deletions
+6
View File
@@ -82,6 +82,12 @@ public:
/** @brief 取消当前按铃请求,释放 SPIready。 */
static void cancelRing();
/** @brief CREDIT 从 0 恢复为 >0 时发送 CREDIT_UPDATE 事件并拉低 DATA_READY。 */
static void notifyCreditRestore();
/** @brief ISR DATA 队列中待处理包数(供 OTA.cpp 计算 CREDIT 用)。 */
static u8 pendingDataCount();
/** @brief 主循环入队 TX 后装载 DMA + 更新 DATA_READY(擦除中途刷 WAIT 用)。 */
static void servicePendingTx();