fix(vd960DBN): OTA 刷写成功误判未启动 — 状态回 idle + 补 ota_report 主动上报
现场: 远程平台发起 OTA, 设备物理刷写成功 (70块全ACK, flash DONE), 但平台 ota_status 轮询只见 state=ready → 误判'刷写未启动'。 根因: 1. ota_flash_done 刷写成功后台侧状态置 READY (与协议状态机 'FLASHING──成功──▶IDLE(清槽/保留)' 不符), 平台无法区分 '待刷 ready' 与 '已刷完' → 持续 ready 判未启动 2. 固件漏实现协议 §5.5 ota_report 主动上报 (done/failed 重发 3次×5s), 平台收不到成功信号, 只能靠 ota_status 轮询兜底 修复 (协议 V1.09 + 固件): - 协议: 刷写成功状态明确回 idle (镜像保留, last_result=0, 可重刷); ota_report 升级为刷写结果主依据; 平台判定指引 (idle+size>0+last_result=0 =成功; 不得以轮询未见 flashing 或持续 ready 判未启动) - ota_srv.c: ota_flash_done → OTA_STATE_IDLE (镜像保留) + 上报 done; ota_flash_fail → 补 ota_report failed (保留 event_report 告警); ota_cmd_begin 兼容 idle+size/crc32 一致 → 直接回 ready (免下载重刷) - iot_mqtt_srv.c: 新增 ota_report 上报状态机 (立即首发 + 5s×3 重发, 同 msg_id/ts), 共享 _iot_pub_payload (event_report 复用, RAM 零新增) - 单测: test_flash_flow/test_flash_ready_timeout 断言 ota_report 上报, state 断言 READY→IDLE; 新增 test_begin_reflash; 10/10 全过 + 22 py 断言
This commit is contained in:
@@ -53,6 +53,7 @@ void iot_mqtt_handle_sock_int(uint8_t socketid, uint8_t intstat); // Socket
|
||||
void iot_mqtt_publish_sensor(void); // 推送传感器数据到 MQTT
|
||||
void iot_evt_handle_ack(uint32_t msg_id, int code); // event_report 平台应答入口 (V1.04)
|
||||
void iot_evt_report_ota_error(uint32_t err); // OTA 刷写失败告警入队 (V1.08, 走 event_report 闭环)
|
||||
void iot_ota_report_result(uint8_t ok, uint32_t err); // OTA 刷写结果上报 ota_report (V1.09: ok=1 done / ok=0 failed)
|
||||
uint8_t iot_any_car(void); // 任一通道有车 (ota_flash 安全窗口检查)
|
||||
void iot_watchdog_init(void); // 初始化硬件 IWDG (无条件, 主循环卡死兜底)
|
||||
void iot_watchdog_kick(void); // 喂硬件 IWDG (主循环调用)
|
||||
|
||||
Reference in New Issue
Block a user