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:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user