docs: dev log sec.51 - Boot download mode design (UART CLI + OTA in bootloader, not yet implemented)

This commit is contained in:
evan.liu 2026-09-05 17:00:08 +08:00
parent e0253d1bbf
commit 15ae64172a

View File

@ -1285,3 +1285,44 @@ APP2 链接的镜像发向 APP1 区。设备端 END 校验(向量表 Reset PC
新 banner 打印 "Last reset: IWDG watchdog!"。 新 banner 打印 "Last reset: IWDG watchdog!"。
- 附带修正:`uartinfo` 输出里 RX 描述更新为 DMA ring(此前还是 RXDNE 队列 - 附带修正:`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<n>`(脚本据此选
非活动区载荷);`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 是否越界,越界则裁剪命令。