/log 写失败修复:打开模式补 FA_WRITE 位 + 卷探针两击确认 + 自动重格式化自愈 + 错误去重

This commit is contained in:
2026-09-20 03:46:14 +08:00
parent 2bc2dcafeb
commit efe82668b7
4 changed files with 121 additions and 54 deletions
@@ -266,36 +266,3 @@ ST-LINK_CLI -c SWD -P "MDK-ARM\STM32F407-Demo\STM32F407-Demo.hex" -Rst -Run
3. 停核 = `-Rst -Halt`(停点不保证是复位向量,实测 0x08004664);一次性连接语义——断开即恢复运行。
4. **烧录路径打通**:`-P <hex>` 实测可用(1MB ≈ 6.5s,比 UV4 快得多),`reset.bat flash` 可作为快速烧录通道。
5. ✅ **问题已闭环(2026-09-20)**:09/19 启动卡死(PC=0x08000FA0)根因 = 芯片一直是合并前旧向量表镜像(09/19 之后所有下载均静默失败:裸 `-P` 不带 `-Rst -Run` 不落地)+ 内核启动前 `osMessageQueueNew` 代码缺陷;修复已提交(v2-on-ui `82411cf`),V0.1 板完整启动已验证(63 行日志 + 全片 `-CmpFile` 一致,见 §10)。
## 10. 2026-09-20 复测记录(V0.1 板:静默失败闭环 + 铁律)
### 10.1 静默失败模式(ⓞ 新实测)
- 裸 `-c SWD -P <文件>`(**不带 `-Rst -Run`**):报 `Memory programmed in 1s 906ms / Programming Complete`,但芯片 flash **不变**(回读向量表首字 = 旧镜像 SP 0x2001E998)。目标核在 flash `B .` 死循环中旋转时,"Normal 连接、不复位"会话的写入不落地。
- 同文件加 `-Rst -Run`(即 `reset.bat flash`):正常落地(6.47s / 1MB,`Programming Complete → MCU Reset → Application started`,exit=0),全片 `-CmpFile` 回读逐字节一致。
- **结论(铁律)**:任何编程命令必须以 `-Rst -Run` 收尾;**任何烧录之后必须 `-CmpFile` 全片回读校验**(`-c SWD -CmpFile <文件> 0x08000000` → `No difference found`);`Programming Complete` 单独不构成成功证据。
### 10.2 上板实测记录
| # | 时间 | 操作 | 结果 |
|---|---|---|---|
| 1 | ~00:10 | 裸 `-c SWD -P <bin> -NoPrompt`(不复位) | ❌ 报 `Programming Complete` 但芯片内容不变(向量表 = 旧镜像)→ **静默失败确认** |
| 2 | 00:24 | `reset.bat flash`(= `-P <hex> -Rst -Run`,245,704 B / 1MB) | ✅ 6.47s:`Programming Complete` → `MCU Reset` → `Application started`,exit=0 |
| 3 | 00:27 | 软件复位(`-c SWD -Rst -Run`)+ 串口采集 | ✅ 完整 63 行开机日志:`App init OK` / `Network Init` / `net init: OK` / `PHY: 100M FULL` / UI port/menu init OK / standby ready / net sink started,0 HardFault/FAIL/ERROR |
| 4 | 00:28 | `-c SWD -CmpFile <bin> 0x08000000` 全片比对 | ✅ `No difference found`(245,704 B 逐字节一致,@4MHz SWD 约 1 分钟) |
| 5 | 00:29 | `-c SWD HOTPLUG -SCore` / `-TVolt` | ✅ `Core is Running`;VDD 3.1V(PC 口供电偏低,建议 5V) |
> 09/20 开机日志含两条**非致命** ERR(与 ST-LINK 无关,固件/板级跟进项):`[ADC] Init wait BUSY timeout`(启动继续)/ `[SYSLOG] write /log/*.log fail (7)`(NAND 卷遗留旧 /log 文件不兼容,串口镜像正常)。
### 10.3 根因闭环(09/19 13:59 启动卡死 + "二分法失效")
- PC=0x08000FA0(启动区 `B .` 死循环)= 芯片上是**合并前(UI 时代)旧向量表镜像**:旧表把 DMA2_Stream2/3 处理函数值放在 v78/v79(S6/S7 槽,回读 0x9F1/0x9FD 为挪位实证),真实 DMA2_Stream3 槽(v75)无有效处理函数 → 开机第 3 行后 gd5f 第一笔 SPI1_TX DMA(DMA2_Stream3)完成中断 → 空槽 → 死循环,确定性死亡。
- **09/19 之后所有"重下载"(CLI/Keil 多次)均为静默失败**(芯片从未更新:向量表首字回读始终是旧值)→ 代码改动看似无效、二分法全程失效。
- 代码层缺陷(一并修复):`syslog_mcu_init` 在内核启动前调用 `osMessageQueueNew`(CMSIS 队列 API 内核启动前不可用)→ 改为 `syslog_drain` 内惰性创建(STORAGE_READY 之后,defaultTask 上下文)(提交 `82411cf`)。
- 新镜像(仓库现行 CubeMX 生成启动文件,该文件全程未人工改动)已逐槽核验:4 条活跃 DMA 流(SPI1 RX/TX → DMA2_Stream0/3,SPI2 RX/TX → DMA1_Stream3/4)+ EXTI9_5/TIM7/UART4 均为真实处理函数;USART1 调试 DMA(DMA2_Stream2/7)为休眠配置(代码从不启动)→ **新镜像无向量表层死点**。
### 10.4 选项字节异常(芯片状态,2026-09-20 实测,待清理)
- `0x1FFF0800 = 0x7AA16001`:RDP 字节 = **0x01**(合法出厂值仅 0xAA/0xFF/0xCC)+ WRP 残留(0x60/0xA1,nWRP 位置位)。
- 该状态**未阻碍** 09/20 的全片擦除 + 烧写(CLI/Keil 两次写入均成功),但为 09/19~09/20 烧录静默失败的头号嫌疑(疑似当时某次被中断的选项字节写入遗留)。
- 清理建议:RDP→0xAA、WRP→0x00。本机未装 STM32CubeProgrammer(ST-LINK_CLI v3.5.0.0 亦无选项字节写命令)→ 用 Keil 烧录算法的选项字节对话框操作(或升级 ST-LINK Utility / 安装 CubeProgrammer)。