实机测试规划改造为执行判据说明:删除一次性台架窗口状态(§0.5取证记录)与规划框架,A1~A4代码状态按代码核对改写,16处外部引用重指向模块文档
This commit is contained in:
+2
-1
@@ -124,7 +124,8 @@ int app_main_init(void) {
|
||||
/* 0b) round 8 取证:上报上一轮 defaultTask 主循环的**最后进段**。
|
||||
* 轨迹槽在 .noinit(scatter UNINIT_CCM),IWDG/引脚复位不清 SRAM →
|
||||
* 误复位后开机第一时间可见 `PREVRUN seg=N`,直接指向主循环阻塞点
|
||||
* (round 7 结论:判定分支未执行 = poller 自身停摆,见 实机测试规划.md §0.5.4)。
|
||||
* (round 7 观察"判定分支未执行"经 round 8b 更正:真因是 IWDG 超时被静默
|
||||
* 配成复位默认值,见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录)。
|
||||
* 裸 UART 直发,且一次复位只报一次(内部清 magic)。 */
|
||||
task_wd_seg_report();
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* 保证喂狗节奏 ≤ ~300ms。根治(USART1 TX-only 灭 ORE 机制)
|
||||
* 另行推进(.ioc 结构性修改 + CubeMX 重生成,见待处理内容①)。
|
||||
* 2026-10-02 王建锋 round 8b 加固:发送超时判据改用 DWT CYCCNT(时间源无关)。
|
||||
* 台架 round 8a 取证(实机测试规划.md §0.5.4.2)定位到:defaultTask
|
||||
* 台架 round 8a 取证(见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录)定位到:defaultTask
|
||||
* 冻结在 console 突发行内、无 STALL、复位为 IWDGRSTF。唯一自洽机理 =
|
||||
* HAL_UART_Transmit 的超时判据 `HAL_GetTick() - Tickstart` 依赖
|
||||
* TIM7 的 uwTick —— TIM7 一旦停摆,超时永不成立 → 写者死等 TXE →
|
||||
|
||||
+1
-1
@@ -125,7 +125,7 @@ void syslog_drain(void);
|
||||
* 返回值:0 - 成功;-1 - 卷占用或写失败(证据可能回滚,**不阻断判定**) int
|
||||
* 限定条件:poller(defaultTask)上下文调用;卷锁一律 try(绝不阻塞,
|
||||
* 本上下文 = 看门狗喂狗点)
|
||||
* 函数说明:round 7 取证通道(设计见 docs/测试说明/实机测试规划.md §0.5.4:
|
||||
* 函数说明:round 7 取证通道(设计见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录:
|
||||
* 误复位后 RAM 态随复位消失、stall 行经僵尸串口丢失,故证据必须落盘)。
|
||||
* 内部在释放卷锁后立刻追加一条 s_append(SYSLOG_RUN, ...) 写另一个
|
||||
* 文件——FTL 单页缓存语义为"写到不同 LPN 才把前一脏页刷进 NAND",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* (本任务 = 看门狗喂狗点,绝不阻塞等锁)
|
||||
* v1.3 2026-10-02 王建锋 新增 sys_log_evidence():把看门狗停喂现场
|
||||
* 证据落 /log/wdev.log(掉电不丢)+ flush 诱导
|
||||
* (round 7 纯取证,见 实机测试规划.md §0.5.4)
|
||||
* (round 7 纯取证,见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录)
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
|
||||
@@ -168,7 +168,8 @@ void default_task_func(void *argument) {
|
||||
for (;;) {
|
||||
/* round 8 取证:进段打点——每步前记录段号到 .noinit 槽(复位不丢)。
|
||||
* 误复位后开机 `PREVRUN seg=N` 即"上一轮主循环死在哪个调用点"
|
||||
* (round 7 结论 = poller 自身停摆,见 实机测试规划.md §0.5.4)。 */
|
||||
* (round 7 初判"poller 自身停摆"经 round 8b 更正:真因是 IWDG 超时被静默
|
||||
* 配成复位默认值,见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录)。 */
|
||||
task_wd_seg(TASK_WD_SEG_POLL);
|
||||
/* 心跳抽样与喂狗判定(内部节流至 100ms;全员到位才喂,否则累计停喂) */
|
||||
task_wd_poll();
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* v1.1 2026-10-02 王建锋 round 7 纯取证埋点:近 8 次抽样位图环 + 最大喂狗
|
||||
* 间隔统计 + 停喂现场落 /log/wdev.log(掉电不丢);
|
||||
* 全部在 TASK_WATCHDOG_UNIT_TEST 守卫内,判定状态机
|
||||
* 与主机侧单测逐字不变(见 实机测试规划.md §0.5.4)
|
||||
* 与主机侧单测逐字不变(见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录)
|
||||
* v1.2 2026-10-02 王建锋 round 8 取证:复位不丢的"进段打点"(.noinit 槽 +
|
||||
* PREVRUN 开机上报 + STALL 行附 seg)——round 7 结论为
|
||||
* "poller 自身停摆",需定位 defaultTask 主循环阻塞点
|
||||
@@ -19,7 +19,7 @@
|
||||
* (TIM7 ISR 每 1ms 写 uwTick/FreeRTOS tick/计数)+
|
||||
* TICKRUN 开机上报(含相对进段时刻的增量 duw/dfr)——
|
||||
* round 8a 定位到 console 通道后,需钉死是 TIM7(HAL tick)
|
||||
* 还是 SysTick(FreeRTOS tick) 停摆(实机测试规划.md §0.5.4.3)
|
||||
* 还是 SysTick(FreeRTOS tick) 停摆(见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录)
|
||||
*
|
||||
* v1.4 2026-10-02 王建锋 **P0 修复**:wd_platform_start() 补写 IWDG 的
|
||||
* PR/RLR(= WD_IWDG_PRESCALER / WD_IWDG_RELOAD,即设计值
|
||||
@@ -108,7 +108,7 @@ static uint32_t s_started; /* 1 = IWDG 已启动 */
|
||||
static uint32_t s_last_tick; /* 上次抽样时刻(100ms 节流基准) */
|
||||
|
||||
/* ==== round 7 纯取证状态(仅 MCU 构建;判定状态机逐字不变)====
|
||||
* 设计见 docs/测试说明/实机测试规划.md §0.5.4:误复位后 RAM 态随复位消失,
|
||||
* 设计背景见 docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录:误复位后 RAM 态随复位消失,
|
||||
* 故把"停喂现场"快照落盘(/log/wdev.log)供复位后回读定性。 */
|
||||
#ifndef TASK_WATCHDOG_UNIT_TEST
|
||||
#define WD_SNAP_HIST_DEPTH 8u
|
||||
@@ -265,8 +265,9 @@ static void wd_stall_evidence(uint32_t snapshot) {
|
||||
}
|
||||
|
||||
/* ==================== round 8 取证:复位不丢的"进段打点" ====================
|
||||
* 见 task_watchdog.h 的说明与 实机测试规划.md §0.5.4 round 7 结论(假设 2:
|
||||
* poller 自身停摆 → 需定位 defaultTask 主循环死在哪个调用点)。
|
||||
* 见 task_watchdog.h 的说明(round 7 初判"poller 自身停摆"经 round 8b 更正:
|
||||
* 真因是 IWDG 超时被静默配成复位默认值,见 docs/子系统设计/看门狗设计说明.md
|
||||
* 2026-10-02 变更记录)→ 需定位 defaultTask 主循环冻结在哪个调用点。
|
||||
* 槽放 .noinit(scatter UNINIT_CCM):IWDG/引脚复位不改变 SRAM,复位后仍可读。 */
|
||||
|
||||
/*
|
||||
|
||||
@@ -83,10 +83,11 @@ uint32_t task_wd_is_armed(void); /* 1 = IWDG 已启动 */
|
||||
|
||||
/*
|
||||
* ==================== round 8 取证:复位不丢的"进段打点" ====================
|
||||
* 背景(实机测试规划.md §0.5.4 round 7 结论):误复位时判定分支(STALL)从未
|
||||
* 执行 → **喂狗点 task_wd_poll 自身停摆**(假设 2:poller 被阻塞),而非某个被
|
||||
* 监视任务饿死。RAM 态随复位消失、串口又可能来不及打,故需要一条**复位后仍可读**
|
||||
* 的"defaultTask 主循环最后走到哪一段"轨迹。
|
||||
* 背景(2026-10-02 台架 round 7~8 取证,完整链条见
|
||||
* docs/子系统设计/看门狗设计说明.md 2026-10-02 变更记录):误复位时判定分支(STALL)从未
|
||||
* 执行,当时判为**喂狗点 task_wd_poll 自身停摆**(round 8b 已更正:真因是 IWDG 超时
|
||||
* 被静默配成复位默认值),而非某个被监视任务饿死。RAM 态随复位消失、串口又可能来不及打,
|
||||
* 故需要一条**复位后仍可读**的"defaultTask 主循环最后走到哪一段"轨迹。
|
||||
*
|
||||
* 实现:轨迹槽放在 .noinit(scatter 的 UNINIT 执行区,见
|
||||
* MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct 的 UNINIT_CCM)——IWDG/引脚复位
|
||||
@@ -152,7 +153,8 @@ void task_wd_tick_snapshot(void);
|
||||
* 限定条件:TIM7 中断上下文调用(`HAL_TIM_PeriodElapsedCallback` 内,每 1ms)
|
||||
* 函数说明:更新 cur 槽 = [magic, uwTick, 本轮 TIM7 中断计数, 0](纯 SRAM 写,无阻塞)。
|
||||
* 与 task_wd_seg 的"进段打点"配合,复位后由 task_wd_seg_report() 上报。
|
||||
* 背景(实机测试规划.md §0.5.4.3 第 2 条):HAL_UART_Transmit 的超时判据
|
||||
* 背景(2026-10-02 台架 round 8b 取证,见 docs/子系统设计/看门狗设计说明.md
|
||||
* 2026-10-02 变更记录):HAL_UART_Transmit 的超时判据
|
||||
* 依赖 uwTick,时间源停摆即死等——必须先把"TIM7 是否停摆"钉死再定向修复。
|
||||
* ⚠ **本函数内严禁调用任何 FreeRTOS/CMSIS-RTOS API**:TIM7 在 HAL_Init
|
||||
* 阶段即开始中断(远早于 xPortStartScheduler),此时 ISR 版内核 API 会触发
|
||||
|
||||
Reference in New Issue
Block a user