diff --git a/docs/开发日志.md b/docs/开发日志.md index f96ddb0..47a6eab 100644 --- a/docs/开发日志.md +++ b/docs/开发日志.md @@ -1285,3 +1285,44 @@ APP2 链接的镜像发向 APP1 区。设备端 END 校验(向量表 Reset PC 新 banner 打印 "Last reset: IWDG watchdog!"。 - 附带修正:`uartinfo` 输出里 RX 描述更新为 DMA ring(此前还是 RXDNE 队列 的旧文案)。 + +## 51. Boot download 模式:设计定稿(2026-09-05,代码未落地) + +- 目标:Boot 增加 USART1 功能,把 APP 的 CLI 与 UART OTA 能力移植进 Boot, + 支持 **download 模式**(该模式下有 CLI + OTA 帧升级),用于救砖与生产 + 下载。本节先记录摸底结论与设计决策,实现见后续章节。 +- 摸底结论(复用性评估): + - Boot 现状:仅 4 个源文件(startup/system/main/boot_crc32),ROM 占用 + 2KB,预算 16KB(`CAIIC_BOOT_SIZE`),IRAM 0x20004000 起(栈顶须远离 + 0x2000C000 SRAM 悬崖,§47); + - `app_ota.c`(741 行)**通道无关**:帧重组/惰性擦扇区/4B 暂存/CRC32 校验/ + bootsetting 更新全部可复用;耦合点仅 FreeRTOS tick(延迟复位)、 + `app_ble_proto.h`(帧常量 + legacy notify 应答)、`bsp_usart.h` + (UART sink)。用 `BOOT_FIRMWARE` 宏做双构建隔离,**不复制副本**, + 避免两份 OTA 引擎日后漂移; + - `app_bootset.c`(bsdump/bsset/appsw)几乎无耦合一并复用; + `cli_core.c`/`app_cli.c` 与 FreeRTOS/BLE/各 app 模块深耦合,**不搬**, + Boot 侧写一个精简的轮询行编辑器 + 命令子集; + - Qflash 驱动 = 常量数组 memcpy 到 RAM(0x324B)+ 关中断执行,裸机可用; + - flash 擦除关中断数十 ms,**RX 必须用 DMA 环形缓冲**(同 APP 方案, + 裸机轮询 DMA 写指针即可,无需 IDLE 中断),否则 460800 下擦除窗口丢字节。 +- PC 脚本兼容面(`tools/ble_ota_update.py` UART 流程,决定 Boot CLI 协议面): + 提示符 `caiic->`;`devinfo` 输出须含 `cur bank: APP`(脚本据此选 + 非活动区载荷);`ota` 命令须打印 `[ota] binary mode ON` 标记行后进入 + 二进制帧模式。**Boot CLI 全部照此实现,脚本零改动即可对 Boot 升级**。 +- download 模式设计: + - 入口:① 每次复位后 Boot 初始化 USART1(460800 8N1)打印 boot banner, + **2s 窗口**内收到字节即进入;② bootsetting 无效且 APP1 向量表 + (SP/复位 PC) sanity 检查不过 → 无镜像可跳,自动进入(救砖路径); + - 模式内:裸机 superloop(无 RTOS),SysTick 1ms 时基;命令子集: + help / version / devinfo / bsdump / bsset / appsw / ota / reset / + uartinfo;`ota` 进入 0xCA 二进制帧模式(复用 app_ota 引擎,语义与 + APP 完全一致:OTA_ABORT 立即退出 / 3s 空闲退出 / OTA_END 成功后延迟 + 复位——应答被取走 +300ms 或 2s 超时兜底); + - **目标 bank 规则**:写 bootsetting 非活动区并翻转到新区;bootsetting + 无效时写 APP1 并置活动。boot 的 `devinfo` 按此规则报告 "cur bank" + (无效记录时报告 APP2,使脚本选 APP1 载荷,与 boot 目标一致); + - download 模式内开 IWDG 兜底(superloop 喂养),跳转 APP 前不动 IWDG + (APP 自理,§50)。 +- 风险提示:Boot 16KB 尺寸预算紧张(printf + USART/DMA/GPIO/RCC 驱动 + + qflash + OTA 引擎 + CLI),构建后核对 map 是否越界,越界则裁剪命令。