test(b6): 台架 @test 闭环复测收口 + 启动行门控修复 + PC 104 主站

B6 台架 @test 闭环复测(B4/B5 验收窗口)完成,DoD 全判据过。

门控修复(首跑 FAIL 实锤的 B5 遗留竞态):
- 现象:protect task start 锚点行字节级交错损坏
  (st[art: cycle=220ms elm=70,两次开机同形复现)
- 根因:启动行在控制台写者注册前打印走无锁裸发,与
  defaultTask 启动日志交错——违反 2026-10-10 门控纪律
  (控制台单写者日志设计说明.md §3.4,adcTask 同款先例)
- 修复:启动锚点行改 dbg_console_writer_ready() 首拍补打

台架与工具:
- .serialtest/config.json:Required 增 protect task start /
  i104 listening on 2404 / [STACK] protect|iec104|heap
- test/host/iec104_master.py:纯标准库 104 主站客户端
  (STARTDT→总召四组+actterm→C_SE 两段写触发 YX15/16 变位
  COT=3→恢复复归→YK11 两段正答→C_RD 读回),往返 18/18
  PASS(d3107f3 与 B7+fix 两版固件)
- 复测 @test PASS:锚点完好 +577ms、9/9 Required、零 [ERR]、
  回读一致;protect free_min 1220(59%)、iec104 2136(83%)、
  新 56KB 堆 min_ever=10000(N-33 抬栈背书就绪)

证据与文档回填:
- boot_log_data 四份快照(含缺陷复现 MISS 件)+ README 登记
- 保护规划 §7 B6 行(B5 台架遗留闭环);控制台单写者 §3.4
  纪律示例 + §11 变更记录;IEC104 §7/§8 主站工具就绪;
  W1 卡 B6 ✅ + N-33 背书 + B7 台架腿注;登记簿 N-33
- 内存台账:+16 B 构建后 ram_baseline/check_mem_numbers 回填

验证:@build 0 错 0 警(Code=205516);ci_local 全绿
(L0 30 钩子 + L0.5 13 套件 826 断言)。
This commit is contained in:
2026-10-12 16:31:33 +08:00
parent 1fe163ba7b
commit dafcf8098b
17 changed files with 706 additions and 15 deletions
+13 -3
View File
@@ -22,6 +22,7 @@
#include "dbg_log.h"
#include "adc_health.h"
#include "console_log.h" /* dbg_console_writer_ready():启动锚点行门控(B6) */
#include "prot_elm.h"
#include "prot_set.h"
#include "task_watchdog.h"
@@ -69,15 +70,24 @@ static void s_log_active_edge(uint32_t active) {
* 每拍喂看门狗(TASK_WD_PROTECT,产品 required_mask 0x1F7)。
*/
void protect_task(void *argument) {
(void)argument;
uint8_t start_logged = 0u; /* 启动锚点行留痕(writer-ready 门控,B6) */
DBG_INFO("protect task start: cycle=%ums elm=%u",
(unsigned)PROTECT_TASK_CYCLE_MS, (unsigned)PE_COUNT);
(void)argument;
for (;;) {
uint32_t now = osKernelGetTickCount();
uint32_t hf = adc_health_flags();
/* 启动锚点行:控制台写者注册后首拍补打(2026-10-10 门控纪律,adcTask
* 首帧同款)。写者注册前 con_append 走无锁裸发,与 defaultTask 启动日志
* 逐字节交错——B6 台架实证:本行曾损坏为 "st[art: cycle=220ms elm=70"
* 致 @test 锚点 MISS(控制台单写者日志设计说明.md §3.4)。 */
if ((start_logged == 0u) && (dbg_console_writer_ready() != 0u)) {
DBG_INFO("protect task start: cycle=%ums elm=%u",
(unsigned)PROTECT_TASK_CYCLE_MS, (unsigned)PE_COUNT);
start_logged = 1u;
}
if ((hf & PROT_HF_LOCK_MASK) != 0u) {
/* L5-4:测量链不可信 → 复位元件(本任务上下文,直接 init 合法)
* 并跳过判据;stall 自愈后下一拍自动恢复 */