chore(全仓): @build/@test 旧文档别名清退为技能调用名
现状口径:/keil-build 与 /serial-boot-test 是 DSH 会话的技能调用名, 不是 shell 命令;「名 + 命令行参数」的命令形态改为可执行体 run_boot_test.py 的真实调用。 - AGENTS.md:别名说明重写为「技能调用名不是 shell 命令」,两条目改 「编译(/keil-build)」「串口回归(/serial-boot-test)」 - keil-build / serial-boot-test 两 skill 调用名与示例同步;task-worktree 方案文档去掉 @build/@test 惯例从句;@task 保留(不在点名范围) - 123 文件现状陈述全改;台架捕获、变更记录/时间线、rename 映射输入 等 41 行历史证据保留旧名 - gen_memory_svg.py 6 处措辞随改,3 张 SVG 产物同批重跑 - 顺手补并行方案同行漏网计数 51→52 钩子 验证:提交期快钩子对 123 文件实跑全 Passed;check_doc_links --all rc=0(3038 处、无法判定 0);check_mermaid --all rc=0;YAML 解析 52 钩子不变;skill-size rc=0;py_compile 全过;字节卫生零漂移。
This commit is contained in:
+1
-1
@@ -223,7 +223,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
|
||||
路径——**别拿旧副本当本次产物**(踩过:拷过一次之后没刷,别人读到的是上一轮的字节)。
|
||||
|
||||
### 4.3 板端
|
||||
`@build` 0 错误 0 警告 → `@test` 看 `[ADC_TASK]` 首拍 / 心跳(`phasor(...)`、`freq(...)`、
|
||||
`/keil-build` 0 错误 0 警告 → `/serial-boot-test` 看 `[ADC_TASK]` 首拍 / 心跳(`phasor(...)`、`freq(...)`、
|
||||
`cal: ua_mv=… vl=0x00 cl=0xE6 rail=…`、`ring` / `skip` / `adc1_*` / `tgap`);
|
||||
健康判据 = **零 `[ERR]`**(健康告警与标定哨兵全以 `[ERR]` 开头,误报会被闭环直接抓住;
|
||||
`vl` 在未标定默认构建必须为 0x00,未标定即闭锁落地后 `cal:` 行就是台架期望的直接证据)。
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "wave_ring.h"
|
||||
|
||||
/* ARMCC 的 stdint.h 不提供 NULL,而主机侧 gcc / MSVC 会传递性把它拉进来 ——
|
||||
* 这个差别主机单测照不出来(2026-10-29 台基线实跑 @build 才暴露:本层
|
||||
* 这个差别主机单测照不出来(2026-10-29 台基线实跑 /keil-build 才暴露:本层
|
||||
* wave_ring.c 报 22 条 identifier "NULL" 未定义)。与 App/algo/sample_ring.c、App/algo/freq.c
|
||||
* 同一口径:谁用 NULL 谁自己 include stddef.h,不往公共头里塞(少波及别人的 TU)。 */
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "wave_store.h"
|
||||
|
||||
/* ARMCC 的 stdint.h 不提供 NULL,而主机侧 gcc / MSVC 会传递性把它拉进来 ——
|
||||
* 这个差别主机单测照不出来(2026-10-29 台基线实跑 @build 才暴露:本层
|
||||
* 这个差别主机单测照不出来(2026-10-29 台基线实跑 /keil-build 才暴露:本层
|
||||
* wave_store.c 报 22 条 identifier "NULL" 未定义)。与 App/algo/sample_ring.c、App/algo/freq.c
|
||||
* 同一口径:谁用 NULL 谁自己 include stddef.h,不往公共头里塞(少波及别人的 TU)。 */
|
||||
#include <stddef.h>
|
||||
|
||||
+1
-1
@@ -130,7 +130,7 @@ int app_main_init(void) {
|
||||
|
||||
/* 固件身份戳(2026-10-10):__DATE__/__TIME__ 由编译器展开,与前面的字面量做
|
||||
* C 字符串拼接 → .rodata 里是一段连续 ASCII,可直接在 .hex 里原样搜到。
|
||||
* 用途:@test 把"芯片里正在跑的镜像"和"刚编出来的镜像"对上号。此前开机标记
|
||||
* 用途:/serial-boot-test 把"芯片里正在跑的镜像"和"刚编出来的镜像"对上号。此前开机标记
|
||||
* 全是固定串(App init OK / Network Init / ...),旧镜像也照样全中,于是
|
||||
* "反复重下载、芯片一直是旧镜像"这类事故在自动闭环里完全不可见
|
||||
* (AGENTS.md 烧录铁律记的正是它)。代价:1 条 DBG ≈ 90 B Flash + 30 B 常量。
|
||||
|
||||
@@ -427,7 +427,7 @@ void dbg_console_tx_end(void) {
|
||||
* · 拿到所有权 -> 整行一次发完,中途不会有别人的字节插进来;
|
||||
* · 拿不到 -> **本行不丢**,改投既有环形缓冲延后发。竞争失败不该变成丢行,更不该
|
||||
* 变成 [ERR]:台架那个未注册窗口每 3 次启动命中 2 次,按"丢弃 + [ERR]"处理只会
|
||||
* 把静默缺陷换成常红的门禁([ERR] 是 @test 的 Forbidden 标记)。
|
||||
* 把静默缺陷换成常红的门禁([ERR] 是 /serial-boot-test 的 Forbidden 标记)。
|
||||
* 入环的是**同一批字节原文**,本模块与 drain 都不补前缀、不重打时间戳(DBG_* 的
|
||||
* 前缀在调用点就已 snprintf 进调用方缓冲)-> 延后发出去的行与它当场直发时
|
||||
* 逐字节相同(判据⑦),取证时不会出现"证据说谎";
|
||||
|
||||
@@ -50,7 +50,7 @@ extern "C" {
|
||||
* (道G task-23)。诊断;[ERR] CONSOLE dropped 行报的就是它。
|
||||
* ⚠ 抢不到所有权但成功让路入环的那条行**不入本账**(它没丢,
|
||||
* 只是晚一点发)——这本账必须保持"红得有意义",因为
|
||||
* [ERR] 是 @test 的 Forbidden 标记)
|
||||
* [ERR] 是 /serial-boot-test 的 Forbidden 标记)
|
||||
* dbg_console_tx_fault - 因僵尸通道软复位自愈的次数(诊断,语义不变)
|
||||
* dbg_console_tx_timeout - 写者排空时观察到的块超时次数(TXE / TC 两条硬上界都算)。
|
||||
* 三本账分开:看日志有没有在丢 -> dropped;看外设自愈了几次
|
||||
|
||||
@@ -181,7 +181,7 @@ static uint32_t s_quiet_reported; /* drain 侧已上报水位(唯一
|
||||
* 的那一支),一旦成立,后面每一次取锁都零互斥;若"计数每前进一次报一条"
|
||||
* 就等于每轮 drain 一条记录 + 一次 NAND 写——诊断自己变成负载,正是上面 s_quiet_drop
|
||||
* 那条纪律要避免的事(同款先例另有 App/fs/vol_idle_sync.c 的 s_vol_sync_fail_latch)。
|
||||
* ⚠ **不打 DBG 错级、不打 [ERR]**:[ERR] 在本仓是"设备出故障"的唯一信号通道(@test 的
|
||||
* ⚠ **不打 DBG 错级、不打 [ERR]**:[ERR] 在本仓是"设备出故障"的唯一信号通道(/serial-boot-test 的
|
||||
* Forbidden 标记也依赖它,四个 Fault 的崩溃日志都以 [ERR] 开头)。把一个可观测性事件
|
||||
* 塞进 [ERR],它就同时不再是故障、也不再是禁令,两边一起失去意义——与 task-23 里
|
||||
* "日志让路不计 [ERR]"是同一根判据。机器判据 = TC-SYSLOG-137 里的 g_sys_err_count == 0。
|
||||
|
||||
+2
-2
@@ -576,7 +576,7 @@ void adc_task_func(void *arg) {
|
||||
s_wave_bench_on = 1u;
|
||||
s_wave_bench_t0 = now;
|
||||
s_wave_bench_next = now + WAVE_BENCH_PERIOD_MS;
|
||||
/* [WARN] 进正文(本仓无 WARN 级;用 ERR 级会带 [ERR] 误触 @test 禁用标记) */
|
||||
/* [WARN] 进正文(本仓无 WARN 级;用 ERR 级会带 [ERR] 误触 /serial-boot-test 禁用标记) */
|
||||
DBG_INFO("[WARN] wave bench autocap ON: 1 seg / %u ms, auto-stop %u s (BENCH BUILD ONLY)",
|
||||
(unsigned int)WAVE_BENCH_PERIOD_MS,
|
||||
(unsigned int)(WAVE_BENCH_MAX_MS / 1000u));
|
||||
@@ -621,7 +621,7 @@ void adc_task_func(void *arg) {
|
||||
}
|
||||
|
||||
/* 4) 首拍相量上报:攒满一周波(20 ms)后立即落一次,作为 全周傅氏相量链路的开机证据。
|
||||
* 不依赖 10 s 心跳 → 台架 @test 的 settle 窗口内即可见(否则会被静默判据
|
||||
* 不依赖 10 s 心跳 → 台架 /serial-boot-test 的 settle 窗口内即可见(否则会被静默判据
|
||||
* 截断,见 docs/测试说明/流程与规范/自动化测试流程.md 的 settle 口径)。 */
|
||||
if ((first_phasor_logged == 0u) && (dbg_console_writer_ready() != 0u)) {
|
||||
phasor_t p;
|
||||
|
||||
@@ -359,7 +359,7 @@ void default_task_func(void *argument) {
|
||||
* 节奏:首次 STACK_PROBE_FIRST_MS 后报告(bring-up 深链已跑过),此后每
|
||||
* STACK_PROBE_PERIOD_MS 采样一次,只在出现更深峰值时打印——既不改串口静默
|
||||
* 窗口,也不漏掉之后才走到的更深分支(如卷修复/配置保存路径)。
|
||||
* 输出(纯 ASCII,便于 @test 采集):
|
||||
* 输出(纯 ASCII,便于 /serial-boot-test 采集):
|
||||
* [STACK] <task> peak_used=<B>/<cfg> free_min=<B> (<pct>%)
|
||||
* [STACK] heap free=<B> min_ever=<B>
|
||||
* 未覆盖 idle/timer 任务(内核静态小栈、纯循环,未取句柄)。
|
||||
@@ -826,7 +826,7 @@ static void wave_store_drain(void) {
|
||||
s_wheld_ms_max = held_ms;
|
||||
}
|
||||
if ((skip_ack == 0u) && (held_ms > (uint32_t)WAVE_DRAIN_HELD_WARN_MS)) {
|
||||
/* 本仓 dbg_log 无 WARN 级(宏只有 ERROR/INFO/DEBUG,ERR 级自动带 [ERR] = @test
|
||||
/* 本仓 dbg_log 无 WARN 级(宏只有 ERROR/INFO/DEBUG,ERR 级自动带 [ERR] = /serial-boot-test
|
||||
* 禁用标记):[WARN] 按 console_log.c 先例进正文,慢不是错(真失败另有 seg drop) */
|
||||
DBG_INFO("[WAVE][WARN] seg held %lu ms (idx=%u)",
|
||||
(unsigned long)held_ms, (unsigned)s_wnext_idx);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#ifndef IEC104_SERV_H
|
||||
#define IEC104_SERV_H
|
||||
|
||||
#include <stdint.h> /* uint32_t(观测计数声明):头文件自含——2026-10-27 @build 实测
|
||||
#include <stdint.h> /* uint32_t(观测计数声明):头文件自含——2026-10-27 /keil-build 实测
|
||||
* 本头此前全靠包含者先带 stdint,feed 换 include 即断链报 #20 */
|
||||
/* 监听端口的宏出口已删除(道G task-9 收口 task-8 交接痕):运行期真源 =
|
||||
* [comm] 段 getter(App/protocol/iec104/iec104_comm.h 的 iec104_comm_port(),
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* (eng=0),拿去比二次值定值必然错判 → 复位元件 + 本拍不 eval。
|
||||
* 默认构建(未标定)恒闭锁是**期望行为**:边沿用 DBG_INFO 而非
|
||||
* [ERR](未标定是出厂常态、不是故障;每次开机都走这条沿,
|
||||
* [ERR] 还会误触 @test 禁用标记);台架旁路只走编译期宏
|
||||
* [ERR] 还会误触 /serial-boot-test 禁用标记);台架旁路只走编译期宏
|
||||
* DTU_BENCH(「数据可信」§4.3:不进 cfg、不进 104,本仓任何
|
||||
* 提交目标都不定义它),且该宏**只作用于判定本体**
|
||||
* adc_cal_prot_blocked()(App/algo/adc_cal.c,全仓唯一一处 #ifndef;
|
||||
@@ -37,7 +37,7 @@
|
||||
* VALID 口径,docs/任务规划/数据可信.md §4.3):
|
||||
* 采样恢复分支内、巡检/压板之前判;边沿 INFO 对
|
||||
* + SOE_T_CAL_BLOCK/RESUME(不用 [ERR]:未标定是
|
||||
* 常态非故障,且 @test 禁用 [ERR]);DTU_BENCH
|
||||
* 常态非故障,且 /serial-boot-test 禁用 [ERR]);DTU_BENCH
|
||||
* 编译期旁路(本仓目标不定义 = 产品恒强制闭锁)
|
||||
* v1.3 2026-10-26 DTU 项目组 道F task-16:本文件的三路判定 s_cal_locked()
|
||||
* 删除,改调 App/algo/adc_cal.c 的 adc_cal_prot_blocked()
|
||||
@@ -234,7 +234,7 @@ void protect_task(void *argument) {
|
||||
/* 启动锚点行:控制台写者注册后首拍补打(2026-10-10 门控纪律,adcTask
|
||||
* 首帧同款)。写者注册前 con_append 走无锁裸发,与 defaultTask 启动日志
|
||||
* 逐字节交错——B6 台架实证:本行曾损坏为 "st[art: cycle=220ms elm=70"
|
||||
* 致 @test 锚点 MISS(控制台单写者日志设计说明.md §3.4)。 */
|
||||
* 致 /serial-boot-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);
|
||||
|
||||
@@ -101,7 +101,7 @@ const char *boot_stats_cause_str(uint8_t cause);
|
||||
* 本函数做 1 次 I2C 读 + 至多 1 次 I2C 写:I2C1 与 RTC 同总线,严禁再把它
|
||||
* 搬进 iec104/adc 任何关键链或 ISR。重复调用直接返回,不重复计数。
|
||||
* 函数说明:① 全程**不打日志**:I2C 失败/电池换过都是可观测性事件,不是装置故障;
|
||||
* `[ERR]` 在本仓是"设备出故障"的唯一信号通道(@test 的 Forbidden 依赖它),
|
||||
* `[ERR]` 在本仓是"设备出故障"的唯一信号通道(/serial-boot-test 的 Forbidden 依赖它),
|
||||
* 把可观测性事件塞进去就变成第二个信号源——与"日志让路不计 [ERR]"、
|
||||
* 卷锁 fail-open 只投自检记录是同一条口径。状态一律留在结构体里。
|
||||
* ② 落盘只写 8 字节到 RTC 用户 SRAM:无 FTL 写放大、不取卷锁、不进 /log;
|
||||
|
||||
Reference in New Issue
Block a user