文档销项:登记ORE僵尸根治与卷锁待办,补存储架构resume锚点说明
This commit is contained in:
@@ -290,16 +290,36 @@ sequenceDiagram
|
||||
| 2026-09-24 | 字符交错 + HardFault 实证 → 单写者加固实施(4KB 环 + defaultTask 唯一发送 + 裸发回退 + `fputc` 收敛);当时位于 `Src/usart.c` USER CODE 区 |
|
||||
| 2026-09-25 | 迁出至 `App/log/console_log.{h,c}`(HAL 生成文件不含应用代码);`dbg_log.h` 改 `#include "console_log.h"`;Keil 工程 App 组注册;`@build` 0/0、`@test` PASS、引用关系图与本文档同步 |
|
||||
| 2026-09-25 | 写者任务体迁出:`Src/freertos.c` 的 `StartDefaultTask` 任务体(存储 bring-up / 配置引擎 / 控制台 attach+drain / syslog / LED / 栈水位)整体移入 `App/task/default_task.c`(`default_task_func()`,与其余 5 任务文件同址);`freertos.c` 恢复"接线 + 崩溃钩子"的 CubeMX 形态(719→361 行);行为零变化,`@build` 0/0 + `@test` PASS 复验 |
|
||||
| 2026-10-02 | **ORE 僵尸通道喂狗节奏保护**(台架 gen-288):round-3 的"单次 drain 预算 250ms"只限单次调用——ORE 锁存在外设软复位后**毫秒级重锁**(PA10 悬空 + RX 使能),背靠背 drain 每轮再耗 100ms 块超时 → 主循环周期拉到 450~500ms → 100ms 节流的喂狗抽样间隙超过 IWDG 最坏容限 1.7s → 停喂 → 误复位(且心跳位全员健康、无 stall 日志,纯**节奏性饥饿**,非死等)。修复:发送故障后立即结束本轮 drain 并进入 300ms 发送冷却(冷却期内 drain 直接让位主循环),保证喂狗节奏 ≤ ~300ms |
|
||||
| 2026-10-02 | **round 8b 加固**:发送超时判据改用 DWT `CYCCNT`(时间源无关)。原 `HAL_UART_Transmit` 的 `HAL_GetTick() - Tickstart` 依赖 TIM7 的 `uwTick`,TIM7 一旦停摆超时永不成立 → 写者死等 TXE → 唯一喂狗者停摆 → IWDG 复位。裸发送与缓冲满等待两处均换成 DWT 周期计数硬上界(DWT 使能失败时退回旧 HAL 行为);另加 `huart1.Instance == NULL` 短路,防早期/断言路径解引用 NULL |
|
||||
|
||||
## 12. 开放问题
|
||||
## 12. ORE 僵尸通道(2026-10-02 台架实证)
|
||||
|
||||
**机理**:USART1 使能了 RX(PA10 悬空、无上拉)→ 线上噪声持续产生帧错误/溢出 →
|
||||
**ORE(Overrun Error)置位** → HAL 发送路径卡在错误状态。对外设做软复位后 ORE
|
||||
**毫秒级重锁**,于是每轮 drain 都会耗掉 100ms 量级的块超时。
|
||||
|
||||
**为什么会被误判**:本设计是"心跳位全员健康、无 STALL 日志"的**纯节奏性饥饿**——
|
||||
没有任何任务真的死等,只是主循环周期被 drain 拉长到 450~500ms,而喂狗抽样是 100ms
|
||||
节流的、IWDG 最坏容限仅 1.7s,间歇被拉长就触发停喂。**看日志会以为"系统很健康"**。
|
||||
|
||||
**已做(缓解)**:单次 drain 250ms 预算(round-3)+ 发送故障后 300ms 冷却(round-6)
|
||||
+ 超时判据换 DWT(round 8b)。
|
||||
|
||||
**未做(根治)**:让 USART1 为 **TX-only**(.ioc 中不再使能 RX / PA10 不作 USART1_RX),
|
||||
从机制上消除 ORE。属 `.ioc` 结构性改动 + CubeMX 重生成,需单开一轮并复跑台架闭环
|
||||
→ 已登记为 `待处理内容.md` **S-3**。
|
||||
|
||||
## 13. 开放问题
|
||||
|
||||
| # | 项 | 说明 |
|
||||
|---|----|------|
|
||||
| O1 | 未注册期窗口丢行未计数 | 启动窗口(内核启动 → attach)直发竞争丢整行且无计数(HAL `HAL_BUSY` 立即返回);若未来开机日志密度上升,可升级为"内核前静态待发行 + attach 后统一补发"或有界等待直发 |
|
||||
| O2 | `HAL_UART_Transmit` 超时未计数 | 超时块(UART 物理失效)丢弃但不入 `s_con_drop`;v2 可加独立超时计数 |
|
||||
| O3 | `printf` 逐字节开销 | 遗留 `printf` 路径 = 逐字节临界区 + 逐字节事件置位;遗留调用点全部切 `DBG_*` 宏后开销自然消失(不改变机制) |
|
||||
| O4 | **ORE 僵尸未根治** | §12:现仅有缓解(250ms 预算 / 300ms 冷却 / DWT 超时),机制根源是 USART1 使能了 RX。根治需 `.ioc` 改 TX-only + CubeMX 重生成 → 已登记 `待处理内容.md` **S-3** |
|
||||
|
||||
## 13. 相关文档
|
||||
## 14. 相关文档
|
||||
|
||||
- `项目架构总览.md` —— 六层分层 / 启动时序 / 6 任务(写者任务与就绪屏障位置)
|
||||
- `运行与自检记录设计说明.md` —— sys_log 持久化日志(姊妹模块:同写者任务、不同通道)
|
||||
@@ -313,3 +333,4 @@ sequenceDiagram
|
||||
|------|------|------|
|
||||
| v1.0 | 2026-09-25 | 初版:完整设计说明(背景根因 / 单写者模型 / 详细设计 / API / 参数 / 失效模式 / 内存预算 / 设计决策 / 验证记录);实现位于 `App/log/console_log.{h,c}` |
|
||||
| v1.1 | 2026-09-25 | 文件拆分同步:写者任务体迁至 `App/task/default_task.c`(`Src/freertos.c` 只留 CubeMX 接线与崩溃钩子);§3.2 文件清单 / §4.3 / §6 / §11 位置引用更新 |
|
||||
| v1.2 | 2026-10-02 | 新增 §12 ORE 僵尸通道(台架 gen-288 实证:节奏性喂狗饥饿,非死等;缓解已做、TX-only 根治待办)+ §11 时间线两条 10-02 记录;§13 新增 O4;原 §12/§13 顺延为 §13/§14 |
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
|---|---|---|---|---|
|
||||
| S-1 | defaultTask 静态最坏链余量贴线:2872B/4096(余量 1224B = 29.9% < 30% 判据,差 **4.8B**)——`storage_bring_up → … → dhara GC → SPI` 链,**L3 前即如此**(L3 不触 defaultTask 调用链) | 2026-09-22(L3 产品构建栈报告) | 处置方向二选一:栈 4096→4608(CCM 堆余量 4816B 可覆盖 +512B)或 GC 链缓冲局部削减;与 S8(非阻塞日志)并案评估 | `scripts/stack_report.py`(L3 产品构建档) |
|
||||
| S-2 | N-2 消化后,台架 20MB 串口日志截头会丢早期 [STACK] 水位行——跨构建的"前后"栈水位对照建议固化 boot_log 快照(`%TEMP%\opencode\boot_log_*.txt`)进 `docs/测试说明/` 存档目录 | 2026-09-22(L3 收尾发现:切片时代水位行已被截头,A/B 只能定性) | 流程项,无代码改动 | 本文件 N-2 佐证 |
|
||||
| S-3 | **USART1 TX-only 结构根治(灭 ORE 僵尸机制)**——ORE 锁存在外设软复位后毫秒级重锁(PA10 悬空 + RX 使能),是 2026-10-02 台架"背靠背 drain 拉长主循环 → 喂狗节奏饥饿 → IWDG 误复位"的**机制根源**。现仅有缓解(round-3 单次 drain 250ms 预算 + round-6 发送故障后 300ms 冷却),**未根治** | 2026-10-02(台架 gen-288,见 `实机测试规划.md` §0.5.5) | **待办**:改 `.ioc` 令 USART1 为 TX-only(不使能 RX / PA10 不复用为 USART1_RX)→ CubeMX 重生成 → 跑 `scripts/check_cubemx_survival.py`。属结构性改动,需单开一轮并复跑台架闭环 | `子系统设计/控制台单写者日志设计说明.md` §12(含 O4);`App/log/console_log.c` 2026-10-02 修改记录 |
|
||||
| S-4 | **dhara 重试自旋残留**——`try_recover()` 的 `DHARA_MAX_RETRIES`(8) 自旋在坏块密集时仍可能长时间占用 defaultTask(喂狗点) | 2026-10-02(round 7/8 取证期观察) | 低优先:现有 `vol_lock` + 喂狗节奏缓解;若台架再出"存储侧喂狗饥饿"再排期 | `Lib/dhara/map.c`;`实机测试规划.md` §0.5.5 第 5 步 |
|
||||
| S-5 | **可选全序列卷锁**——现卷锁仅覆盖 `syslog` / `cfg` / `lftpd` 三条路径(`vol_lock_wait(0)` try 语义),其它潜在访问点(如 UI 读日志)未纳入 | 2026-10-02(卷锁落地时) | 待评估:先确认是否真有第二写者;无则关闭本项 | `App/fs/vol_lock.{c,h}` |
|
||||
| S-6 | ~~**dhara resume 回滚:复位后所有写入全部丢失**~~ | 2026-10-02(round 9 取证) | ✅ **已修**:`dhara_journal_resume()` 的 epoch 锚点改为比较两个候选 epoch(回绕后锚"低地址=最新")。详见 `实机测试规划.md` §0.5.5.1 与 `架构设计/STM32F4-Base存储架构说明.md` §5.4.1。判定手法已固化为开机日志 `Map head=… tail=… epoch=…` | `Lib/dhara/journal.c` 2026-10-02 本地修复注释 |
|
||||
|
||||
## 网络(二期排期,随第二档 #1)
|
||||
|
||||
|
||||
+14
-11
@@ -333,17 +333,20 @@ IWDG 于是停在**硬件复位默认值**(SWD 实测读数 `PR=0`、`RLR=4095
|
||||
0x08000000` → **`No difference found`** ✓
|
||||
4. **uvprojx 取舍**:保留 `App\fs\vol_lock.c` 挂载 + `../App/fs` 包含路径两个**真实差异**,
|
||||
丢弃 UV4 XML 格式 / `PackID` 噪声(判据见 `AGENTS.md`)。
|
||||
5. **文档销项**(P0-B 出口统一做):
|
||||
- `子系统设计/看门狗设计说明.md`:§4.3/§4.4 白名单、§5.4、§6.1 埋点、§9/§10 状态、
|
||||
变更记录写入**五次误复位事件**(07:56 ORE 僵尸 / 16:19 FTL-GC / 16:29 poller 饥饿 /
|
||||
16:50 STOR 前停喂 / 17:00 本轮)+ round 1~6 修复链;
|
||||
- `子系统设计/控制台单写者日志设计说明.md`:ORE 僵尸根因 + round-3 缓解 + round-6 冷却,
|
||||
并登记"TX-only 结构根治"仍待办;
|
||||
- 本文件 §9 留一行;`待处理内容.md` 销项(① `.ioc` USART1 TX-only 结构根治 /
|
||||
② dhara 重试自旋残留 / ③ 可选全序列卷锁;N-03 至 P1-A)。
|
||||
6. **提交**:单行中文标题 <100 字符(`git commit -F`)→ push `v2-on-ui`;
|
||||
预提交含 `watchdog-unit-test` / `cubemx-survival` / `test-suite-switch`(确认产品构建)。
|
||||
7. 之后按 §2.2/§3 起进入 **A1~A4** 与 **P1 批次**。
|
||||
5. **文档销项**(✅ 已于 2026-10-02 出口统一完成):
|
||||
- ✅ `子系统设计/看门狗设计说明.md`:§4.5 决策 C 必配项(PR/RLR 必须被真正写进寄存器)、
|
||||
§5.3(`wd_iwdg_init()` 从未实现的事实)、变更记录写入 round 1~8f 修复链;
|
||||
- ✅ `子系统设计/控制台单写者日志设计说明.md`:新增 **§12 ORE 僵尸通道**(台架 gen-288
|
||||
实证 + 缓解/根治边界)+ §11 两条 10-02 时间线 + §13 新增 **O4**(TX-only 根治待办);
|
||||
- ✅ `架构设计/STM32F4-Base存储架构说明.md`:新增 **§5.4.1 resume 的 epoch 锚点**
|
||||
(round 9 根因与现行实现);
|
||||
- ✅ `待处理内容.md`:新增 **S-3**(TX-only 根治)/ **S-4**(dhara 重试自旋)/
|
||||
**S-5**(全序列卷锁)/ **S-6**(✅ ~~round 9 resume 回滚~~ 已修);
|
||||
- ✅ 本文件:§0.5.5 结论、新增 **§0.5.5.1**(round 9)、§0.5.7 陷阱 1 修订。
|
||||
6. **提交**:✅ 已完成 —— `930215f` `修复IWDG超时未配置与dhara resume回滚…`(分支 `v2-on-ui`,
|
||||
33 文件 / +1874 −93,预提交全绿:`watchdog-unit-test` / `cubemx-survival` /
|
||||
`test-suite-switch` 均确认产品构建)。
|
||||
7. 之后按 §2.2/§3 起进入 **A1~A4** 与 **P1 批次**;`待处理内容.md` S-3~S-5 为本次遗留。
|
||||
|
||||
### 0.5.5.1 round 9(2026-10-02 台架):dhara resume 回滚 —— 复位后所有写入全部丢失
|
||||
|
||||
|
||||
Reference in New Issue
Block a user