From 09d61959067704caa8c70aa0d1b5c6b99246f0d8 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Mon, 12 Oct 2026 20:10:12 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=94=B6=E5=8F=A3=E5=B7=B2=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E4=BC=9A=E8=AF=9D=E9=81=97=E7=95=99=E7=9A=84=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E6=94=B9=E5=8A=A8=EF=BC=88RAM=20=E5=8F=B0=E8=B4=A6/AG?= =?UTF-8?q?ENTS/SOE=20=E6=97=A5=E5=BF=97=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 提交此前已结束会话在主工作区遗留、未提交的改动: - docs/任务规划/ 与 RAM 占用台账、快照的同步更新 - AGENTS.md 索引与 scripts/ram_baseline.tsv 更新 - docs/测试说明/boot_log_data/ 新增 B9 IEC104/SOE 台架日志与解码产物 - .pre-commit-config.yaml 微调 来源为该会话结束时的未提交快照,整体收口便于并入 master。 --- .pre-commit-config.yaml | 12 +++++++++++ AGENTS.md | 4 ++-- docs/代码规范/pre-commit使用说明.md | 13 +++++++++++- docs/任务规划/README.md | 4 ++-- docs/任务规划/W1-采集保护收尾.md | 19 +++++++++--------- docs/内存管理/RAM使用分析与优化方案.md | 6 +++--- docs/内存管理/RAM预算台账.md | 6 +++--- .../20261012_B9_iec104_soe_post_log.txt | Bin 0 -> 9163 bytes .../20261012_B9_iec104_soe_pre_log.txt | Bin 0 -> 12727 bytes .../20261012_B9_prod_boot_log.txt | Bin 0 -> 6855 bytes .../20261012_B9_soe_decode_post.txt | Bin 0 -> 9521 bytes .../20261012_B9_soe_decode_pre.txt | Bin 0 -> 7861 bytes docs/测试说明/boot_log_data/README.md | 1 + docs/算法/继电保护功能复现规划.md | 7 ++++--- scripts/ram_baseline.tsv | 2 +- 15 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 docs/测试说明/boot_log_data/20261012_B9_iec104_soe_post_log.txt create mode 100644 docs/测试说明/boot_log_data/20261012_B9_iec104_soe_pre_log.txt create mode 100644 docs/测试说明/boot_log_data/20261012_B9_prod_boot_log.txt create mode 100644 docs/测试说明/boot_log_data/20261012_B9_soe_decode_post.txt create mode 100644 docs/测试说明/boot_log_data/20261012_B9_soe_decode_pre.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c26255e..ce620cd4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -402,6 +402,18 @@ repos: files: ^(App/protocol/iec104/iec104_(asdu|pts|link)\.(c|h)|App/algo/(prot_set|prot_elm|phasor|sample_ring|adc_input|freq)\.(c|h)|test/host/iec104/.*|test/host/common/unit_test_harness\.py)$ pass_filenames: false + # 7m2) SOE 动作记录编解码主机侧单元测试(2026-10-12 加,B9) + # 64 B 定长记录(类型/seq/CP56Time2a/epoch/校验和)是磁盘上的 + # 字节级契约——编解码错了要 FTP 下载+解码才看得见;纯 codec + # 零平台依赖(soe_store 胶水 SIM_EXEMPT),主机侧穷举往返/ + # 截断/坏校验/IV 位/seq 连续性(规划 §3.4 L4)。 + - id: soe-unit-test + name: SOE 动作记录编解码单测(主机侧) + entry: python test/host/soe/run_unit_test.py + language: system + files: ^(App/log/soe_rec\.(c|h)|App/log/soe_store\.(c|h)|test/host/soe/.*|test/host/common/unit_test_harness\.py)$ + pass_filenames: false + # 8) 测试套件开关门禁(2026-10-01 加) # 背景:test_config.h 的 TEST_SUITE_* 决定固件里编入哪个测试套件, # 全部注释 = 产品构建。但此前**无任何门禁检查**——实测已提交的 HEAD 里 diff --git a/AGENTS.md b/AGENTS.md index 843910ea..e41b18f7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -89,7 +89,7 @@ ## 提交门禁(pre-commit) -- 任一失败即拦截,共 **32 个钩子**(逐个详解 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 14 个(`-unit-test` 后缀)+ `test-suite-switch` + `registration-check`(双端注册反向校验,N-23)+ `mem-budget`(RAM 92% 预算门禁,N-27) +- 任一失败即拦截,共 **33 个钩子**(逐个详解 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 15 个(`-unit-test` 后缀)+ `test-suite-switch` + `registration-check`(双端注册反向校验,N-23)+ `mem-budget`(RAM 92% 预算门禁,N-27) - **范围 = 项目代码**:第三方(`Lib/`、`Middlewares/`、CMSIS、HAL、`lftpd`、`dhara`、`MDK-ARM`)排除;`cppcheck`/`coding-standard` 另排除 `test/`,规范检查再排除 CubeMX 生成的 `Src/`/`Inc/`。**`simulator/` 已纳入全部钩子**(2026-10-11)——生成物只靠 `.gitignore` 挡,**不在 `exclude` 里写目录名**(教训见 `docs/代码规范/pre-commit使用说明.md` §5.5) - ⚠ **pre-commit 4.x 已移除 `always: true`**(实测对 `local` 钩子只告警 `Unexpected key(s)` 并跳过)→ 想"总是跑"的钩子**必须让 `files:` 覆盖到所有会触发它的文件**,没有兜底开关 - **改写型钩子(`trailing-whitespace` + `end-of-file-fixer`)豁免 CubeMX/Keil 生成文件**(配置里 YAML 锚点 `&cubemx-generated`);⚠ **只读检查不受影响**:`cppcheck` / 乱码 / `cubemx-survival` / `task-table` / `mem-numbers` 仍覆盖 `Src/`、`Inc/` @@ -172,7 +172,7 @@ | ADC 采样节拍 / 通道映射 / V0.1 硬件缺陷 | `docs/子系统设计/ADC采样节拍设计说明.md`、`docs/硬件平台/ADC通道映射说明.md` | | 存储栈(FatFs / dhara / lftpd / 两条 FatFs 陷阱) | `docs/架构设计/STM32F4-Base存储架构说明.md` | | RAM / 栈预算 / 容量台账 | `docs/内存管理/RAM使用分析与优化方案.md`、`内存内容分配策略.md` | -| pre-commit 32 个钩子逐个详解 | `docs/代码规范/pre-commit使用说明.md` | +| pre-commit 33 个钩子逐个详解 | `docs/代码规范/pre-commit使用说明.md` | | 代码规范 V1.0 / cppcheck 口径 | `docs/代码规范/嵌入式C语言代码规范_V1.0.md`、`cppcheck使用说明.md` | | 自动化测试 / 实机测试 / 板级套件 | `docs/测试说明/自动化测试流程.md`、`实机测试实施指南.md`、`board-test-suite` skill | | 烧录与复位语义 | `docs/测试说明/ST-LINK_CLI_复位使用说明.md` | diff --git a/docs/代码规范/pre-commit使用说明.md b/docs/代码规范/pre-commit使用说明.md index be17c617..d67747ac 100644 --- a/docs/代码规范/pre-commit使用说明.md +++ b/docs/代码规范/pre-commit使用说明.md @@ -407,6 +407,17 @@ cppcheck 是开源 C/C++ 静态分析工具,**不运行代码**,通过语法 | **为什么需要** | 测频精度是 OF/UF 判据的地基;板端无标准源照不出来(规划 §3.3 L3-5 注入验收归 B10);定长窗负序泄漏纹波(0.317 Hz)这类坑只有扫频合成信号才能暴露 | | **运行器** | `test/host/freq/run_unit_test.py`(MSVC `cl.exe`,L0.5) | +### 2.22 soe-unit-test — SOE 动作记录编解码主机侧单测(2026-10-12 加,B9) + +| 项 | 说明 | +|---|---| +| **触发条件** | `App/log/soe_rec.*`、`App/log/soe_store.*`、`test/host/soe/**` 或 `test/host/common/unit_test_harness.py` 变动 | +| **处理方式** | **阻止提交**(单测失败即拦截) | +| **被测对象** | `App/log/soe_rec.c/h`(64 B 定长 SOE 记录纯编解码:类型/elm_id/IV 位/seq u32/CP56Time2a/epoch_s/value/sum8)——`soe_store` 板端胶水 SIM_EXEMPT | +| **用例** | 32 断言:编解码往返 / 截断与坏校验和拒绝 / IV 位(无链路时标)/ seq 连续性 / 类型枚举(元件动作·复归、压板出·入、采样坏·复)双类型断言 | +| **为什么需要** | 记录格式是**磁盘上的字节级契约**——编解码错了要 FTP 下载 + 解码才看得见,板端日志照不出来;与 `/log/run.log` 同款定长 64 B 语义 | +| **运行器** | `test/host/soe/run_unit_test.py`(MSVC `cl.exe`,L0.5) | + --- ## 3. 日常工作流 @@ -534,7 +545,7 @@ $env:PATH = [Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [Env | 文件 | 位置 | 说明 | |---|---|---| -| `.pre-commit-config.yaml` | 仓库根 | 钩子配置(**32 个钩子**,2026-10-12 清点;本文 §2 详解非单测类——N-19 新增的两个单测钩子见 §2.16/§2.17,N-23 双端注册反向校验见 §2.18,N-27 RAM 预算门禁见 §2.19,B4 IEC104 协议栈单测见 §2.20,B8 频率测量单测见 §2.21,其余主机侧单测见 AGENTS.md 门禁条;主机侧单测共 14 个) | +| `.pre-commit-config.yaml` | 仓库根 | 钩子配置(**33 个钩子**,2026-10-12 清点;本文 §2 详解非单测类——N-19 新增的两个单测钩子见 §2.16/§2.17,N-23 双端注册反向校验见 §2.18,N-27 RAM 预算门禁见 §2.19,B4 IEC104 协议栈单测见 §2.20,B8 频率测量单测见 §2.21,B9 SOE 动作记录单测见 §2.22,其余主机侧单测见 AGENTS.md 门禁条;主机侧单测共 15 个) | | `.gitlint` | 仓库根 | gitlint 规则(宽松,兼容中文) | | `.cubemx_survival_baseline.json` | 仓库根 | CubeMX 易失定制基线(哈希;`--write` 重建) | | `scripts/check_mojibake.py` | scripts/ | U+FFFD 检测脚本 | diff --git a/docs/任务规划/README.md b/docs/任务规划/README.md index 1d7e004f..4f0b2c33 100644 --- a/docs/任务规划/README.md +++ b/docs/任务规划/README.md @@ -103,8 +103,8 @@ ### 2.1 顺序一图 ``` -W1 收尾 台架道: B6✅→N-33✅(M1 ✅ 2026-10-12) ∥ 代码道: B7✅→B8✅→B9(M2) → B10 送检(M3, Fixed Date) 详表 W1-采集保护收尾.md - (B4 IEC104 ✅ / B5 protectTask ✅ / B6 台架复测 ✅ / B7 定值持久化+软压板 ✅ / N-33 栈收口 ✅ / B8 频率保护 ✅ 2026-10-12 已销项;台账三件套 ✅) +W1 收尾 台架道: B6✅→N-33✅(M1 ✅ 2026-10-12) ∥ 代码道: B7✅→B8✅→B9✅(M2 ✅ 2026-10-12) → B10 送检(M3, Fixed Date) 详表 W1-采集保护收尾.md + (B4 IEC104 ✅ / B5 protectTask ✅ / B6 台架复测 ✅ / B7 定值持久化+软压板 ✅ / N-33 栈收口 ✅ / B8 频率保护 ✅ / B9 SOE 动作记录 ✅ 2026-10-12 均已销项;台账三件套 ✅) ↓ W2 数据 N-21 dhara is_free/copy(配主机侧移植层测试) ↓ diff --git a/docs/任务规划/W1-采集保护收尾.md b/docs/任务规划/W1-采集保护收尾.md index d6468b36..c050fc6e 100644 --- a/docs/任务规划/W1-采集保护收尾.md +++ b/docs/任务规划/W1-采集保护收尾.md @@ -22,7 +22,11 @@ B7 证据 = `../子系统设计/IEC104上行设计说明.md` §3.4 + boot_log_da `@test` 复测 PASS,min_ever 实测 8464 与预算吻合); **B8 已销项(2026-10-12,merge `37f74f0`)**——证据 = `../算法/继电保护功能复现规划.md` 变更记录 B8 行 + `App/algo/README.md` §3.7(自适应窗测频 J1~J6 判据,扫频最坏 0.0101 Hz; -定值 32→40、blob VER 1→2、prot_elm 7→9;freq 46 + prot_set 90 + prot_elm 47 断言)。 +定值 32→40、blob VER 1→2、prot_elm 7→9;freq 46 + prot_set 90 + prot_elm 47 断言); +**B9 已销项(2026-10-12,merge `6cbf400`)**——证据 = `../算法/继电保护功能复现规划.md` +变更记录 B9 行 + `App/log/README.md` soe 节 + `../子系统设计/IEC104上行设计说明.md` §3.2/§7 +(`/log/soe.log` 64 B 定长 + 自发 M_SP_TB_1 带时标 + protectTask 链 872 B 不变; +soe 32 + iec104 97 断言;台架 sync 重跑 21/21+13/13 + SOE 56 条解码 PASS)。 **本波目标(用户决定 2026-10-12)**:把"采集→相量→保护→上送"链路从"代码落地"收口到 **"台架闭环 + 功能面完整 + 可送检"**。规划方式 = **里程碑(时间驱动、判据退出)× @@ -33,31 +37,26 @@ B7 证据 = `../子系统设计/IEC104上行设计说明.md` §3.4 + boot_log_da | 里程碑 | 退出判据(全部满足才算完成,随后销项) | 服务分类 | |---|---|---| | **M1 台架闭环 ✅ 达成(2026-10-12)** | B6 `@test` PASS ✅ + N-33 `stack_report` 9 任务 0 FAIL ✅ + `@test` 复测腿 PASS ✅——判据全满足 | Standard | -| **M2 功能面完整** | B8 ✅ 已合入(2026-10-12)+ B9 合入(台架腿进行中)+ `ci_local` 全绿 + PC 客户端往返含"SOE 时标"("定值掉电保持" ✅ B7 台架 2026-10-12) | Standard | +| **M2 功能面完整 ✅ 达成(2026-10-12)** | B8 ✅ 已合入(`37f74f0`)+ B9 ✅ 已合入(`6cbf400`,sync 追平后重跑台架腿)+ `ci_local` 全绿(L0.5 15 runner 951/951)+ PC 客户端往返含"SOE 时标"(自发 YX = M_SP_TB_1 带 CP56 ts + `/log/soe.log` FTP 下载解码 PASS;"定值掉电保持" ✅ B7 台架 2026-10-12)——判据全满足 | Standard | | **M3 可送检** | B10 注入判据 + 第三方主站全流程通过,证据归档 | **Fixed Date**(送检窗口一到全道让路;窗口前 2 日特性冻结,只修稳定——Zephyr RC 语义) | ## 3. 并行道(台架 = 约束资源永不空转;代码道 = worktree 并行、绿即合) ```mermaid graph LR - subgraph CL[代码道 🟢 worktree 并行 绿即合] - B9[B9 动作记录/SOE 🔴含台架腿] - end M1((M1 ✅)) --> B10[B10 送检窗口 🟡 Fixed Date] - B9 --> M2((M2)) - M2 --> B10 + M2((M2 ✅)) --> B10 ``` ## 4. 任务卡(五字段:DoD / 硬依赖 / 资源 / 写范围 / 状态;完成即销项删行) > 资源图例:🔴 台架(COM6/ST-LINK,`bench.lock` 独占)· 🟡 外部(标准源/第三方主站)· 🟢 纯软件(可并行)。 > 状态:⬜ 未开始 · 🟦 进行中(销项行直接删除,见 `docs/任务规划/README.md` §3 维护约定)。 -> ⚠ **写范围**:B7/B8 已先合入(2026-10-12,`App/algo/` 全部与 `App/cfg/prot_set_store.*` 已释放);B9 生产码写范围与主干无冲突面,但 `test/host/iec104/iec104_test.c` 与 B8 有交集 → B9 sync 时两边叠加手工合并(B8 的 freq include + 断言 与 B9 的 M_SP_TB_1 用例共存)。 +> ⚠ **写范围**:B7/B8/B9 已全部合入(2026-10-12)——`App/algo/`、`App/cfg/prot_set_store.*`、`App/log/`、`App/protocol/iec104/`、`App/task/protect_task.c` 均已释放;B9 sync 实测零冲突(`iec104_test.c` 改动区不重叠,自动合并干净)。 | 序 | 任务 | DoD(可验证验收判据) | 硬依赖 | 资源 | 写范围 | 状态 | 出处 | |---|---|---|---|---|---|---|---| -| **B9** | **动作记录 + 时标 SOE(L4)** | SOE 记录编解码主机单测 + iec104 单测(M_SP_TB_1);`@build` 0/0;protectTask 静态链不变(动作路径无 NAND I/O,记录走队列异步);**台架腿**:动作边沿 → `/log` 记录可见。出口跳闸仍否定确认(R7 口径不变) | —(代码);验证腿 🔴 | 🟢 + 🔴 | `App/log/`、`App/protocol/iec104/iec104_asdu.*` + `iec104_pts.c`(YX 时标段)、`App/task/protect_task.c` | 🟦(worktree `B9-soe-record`,代码+首轮台架腿已完成;待 sync 追平 B8/N33 后重跑台架腿再合并) | 保护规划 §3.4 L4、保护规划 §7 P4;`../子系统设计/IEC104上行设计说明.md` §3.2 注 | -| **B10** | **标准源注入 + 第三方 104 主站往返(送检窗口)** | 标准源注入:L1-5 标定复核 / L1-7 等周波 / P1 过流·过负荷 / P2 电压 + 频率类判据全通过;第三方主站总召/周期/变位/遥控全流程(`../子系统设计/IEC104上行设计说明.md` §7/§8 核对单);证据归档 | M1 + M2 | 🟡 | —(窗口内缺陷修复走 Expedite 类) | ⬜ | 保护规划 §7 P1/P2 验收;`../子系统设计/IEC104上行设计说明.md` §7/§8 | +| **B10** | **标准源注入 + 第三方 104 主站往返(送检窗口)** | 标准源注入:L1-5 标定复核 / L1-7 等周波 / P1 过流·过负荷 / P2 电压 + 频率类判据全通过;第三方主站总召/周期/变位/遥控全流程(`../子系统设计/IEC104上行设计说明.md` §7/§8 核对单);证据归档 | M1 + M2(✅ 双达成) | 🟡 | —(窗口内缺陷修复走 Expedite 类) | ⬜ | 保护规划 §7 P1/P2 验收;`../子系统设计/IEC104上行设计说明.md` §7/§8 | ## 5. 并行规则(执行层映射 → `../环境与部署/并行任务工作树方案.md` §7.3) diff --git a/docs/内存管理/RAM使用分析与优化方案.md b/docs/内存管理/RAM使用分析与优化方案.md index 1a0263a3..4499944c 100644 --- a/docs/内存管理/RAM使用分析与优化方案.md +++ b/docs/内存管理/RAM使用分析与优化方案.md @@ -36,10 +36,10 @@ | 区域 | 用量 | 容量 | 占比 | |---|---|---|---| -| ER_IROM1 | 225,936 B (220.64 KB) | 1,048,576 B (1024 KB) | 21.5% | -| RW_IRAM1 | 96,776 B (94.51 KB) | 131,072 B (128 KB) | 73.8% | +| ER_IROM1 | 227,824 B (222.48 KB) | 1,048,576 B (1024 KB) | 21.7% | +| RW_IRAM1 | 97,864 B (95.57 KB) | 131,072 B (128 KB) | 74.7% | | RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% | -| **Flash (ROM 合计)** | **227,016 B (221.7 KB)** | 1,048,576 B (1024 KB) | **21.6%** | +| **Flash (ROM 合计)** | **228,928 B (223.6 KB)** | 1,048,576 B (1024 KB) | **21.8%** | 各区的容量与常量来源: diff --git a/docs/内存管理/RAM预算台账.md b/docs/内存管理/RAM预算台账.md index 27c57cf0..dcc46295 100644 --- a/docs/内存管理/RAM预算台账.md +++ b/docs/内存管理/RAM预算台账.md @@ -15,10 +15,10 @@ | 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) | |---|---|---|---|---| -| ER_IROM1 (Flash) | 225,936 B | 1,048,576 B | 21.5% | 参考 | +| ER_IROM1 (Flash) | 227,824 B | 1,048,576 B | 21.7% | 参考 | | RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS | | UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 | -| RW_IRAM1 | 96,776 B | 131,072 B | 73.8% | PASS | +| RW_IRAM1 | 97,864 B | 131,072 B | 74.7% | PASS | | 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 | |---|---|---|---| @@ -27,7 +27,7 @@ | UI | 54,988 B | 16 KB | ⚠ 超 37.7 KB | | RTOS 堆 | 57,376 B | 56 KB | 堆=配额 | | 应用 | 13,247 B | 8 KB | ⚠ 超 4.9 KB | -| 其它 | 8,100 B | — | 参考 | +| 其它 | 9,184 B | — | 参考 | - **门禁**:pre-commit `mem-budget` 钩子(`scripts/ram_baseline.py --gate`)—— diff --git a/docs/测试说明/boot_log_data/20261012_B9_iec104_soe_post_log.txt b/docs/测试说明/boot_log_data/20261012_B9_iec104_soe_post_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..0b1853b5f62a89a9dbdacd7e546213ae4ac65271 GIT binary patch literal 9163 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%0DnAPTjsED`R`d` zu*MGBUoG>cQoAVfpw17UVZpSDpCNykhkk=sOhID|{rS3=IN|by<{nx=A31_{AeQ0# zjI$M?MXKs8q>%DIM%L1poA(OpMRm{k?pHpPX*D{EQ*8ZW-zEFkNE*s9gw`mBdbgiD zZji%?oz@6oy?+ltyQJ3Rt>JFcTy-zP{vC* zcev!*zW zb~mp%&!HHue<`MFbwnYqU)tj7DweN@XPPmWb3~6TsS0+_>a2|y#Psv>5l0vG zQu#FVHOWWs3+KWTd)MuOa`L5CDe|TCWBrYzh#TLR$ECjn7tIVIE)(dTGhOWs{fPbn z5$DKe9p*shpE>H9OI#P|aL+IYSne&aFn<@DdygGBKi4Vx4cZ!F5@omEnMwP?@<(Kf#OM0 zIjz%M2zQJOO*Xk&_3g*x_SJXHf#MTerNr-&*JTVn9s{<4E9 zMb4u9br*|W{q4)|>TkDN=1b*vcCkwR9Y!Q(J-_De+UzfN#d>uZE7UUoKCXV#&yGd;2Tp6zU!{MyeotJDO| zR^Zc7y`XGGDU^Smz3=2P^2 zuJfpr=cYZ&NnDW#D$G62+SQZF6cy@VyQuhF=TRw7#Q5Yw&Q>_HZ>|&bsL;a{73%lf z+ltS19+mPOjTT%&MXSWHJIJHr+sgJ(QLb~SNZcsJm8PCTJZKNL(%duUQSohMJ8{M5 zI*&@ZlkDBr!fD*%{`r}5bF}qsWqYV7*LhUJ>Lu8_HJ)U0gkRrLj<&NBky@^+(O10Vx=)@xDaAFN(1o_j z^I}S;^-^f7{zQ`fm($RCwi;7YX=3ZqeuDWao=C24IU3PvIf}xjEr+^X6$r<=l^q2eS1;dCC^QCgT=(oxwDy-OK66GeA zI(?#c^*!&%KNZY=xO76xxgejG=Hza(vySlOF{Pt8rLm;k4Rg-W6iaw&L^(8;g!U1i z1iyv0FQD&p*oU0TH|IWQAEDM`YAQ`x>zV=6iCUB1{d!1cURUq&c@$?O>*7_KueHUC z6W%j;D6{u9W-D?Mz~}OLsv!SwVP;<8S?f8n`%8G<921^H>w|m(`=MQ#p@Vs8v%lPN z*FM?EQwGuM0x}+3O^4cJyr->bUpd1m#Q|RY9}KT7H=L^6#c!yW6P#`E)Z(3u15QGr Jsh>&V&i}>?l=%Pv literal 0 HcmV?d00001 diff --git a/docs/测试说明/boot_log_data/20261012_B9_prod_boot_log.txt b/docs/测试说明/boot_log_data/20261012_B9_prod_boot_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..35693e678b99f2118b03ec21f554dcbff68cd76a GIT binary patch literal 6855 zcmd6sZBH9V5Xbj*q<)8c2UTjz4;XMHOC=^WCpL}s7^li_GV{i=08t+{PTA+Y=zCR7S_Wb;YCQos_y%t8P38{=xVeY-i2MwXEW{a zC0yvu%TN!6a4yQO{*HA&)Of6Q`=O}$uEzb)38$j&>X|iA3`0-z$D;YuRu983;hCh^ z)lNt-(z;7gb;T(OW&O^?gK^OWrz zWzlv7=eQQ@pxKJ{Jd$jnfv#ApBzZ~`8@MH)e=DkiS@fHz@UJuZ-&oQNbm232BiHw- z-7DSC7H#K_*5jR3AyYN`I-l*S`*Xj#l)L2TPKYmcNI6m8R~ArGwSSGndr*nKO!v040R zLz!e#&u#frQ=V74M(^{E)?ItCQ!QQlL3^xQW^xTjl8g9vEL15LdHuzY1{$OH zTk)wVk1mMQlDvIYJn*@q;sR7WJA4o->uH?fyTk+dHN?L!`mUZXHO4Yyt!hgXA`UNa zNLpk^&O};v4Cy>VG0Mwkw=4slitDji;%8*W{YkcL3jua+Pi#It^A)Ax*Hr6y^KG&} z8WT}<)Av|2*r_ZF`wSVW5uTfOx^-JZYeklSse4mC7=078hLQv%sUAJ?!umt`1^KII zRws(7Az1!UoZWL{KBr0?>m9j~8b|!a{QUUUW)_=fRb@j`yJfMA+x9n&G9UAKf8+Y^ zS#%$W$}Q6kpDjkPA6btIGqy@N)>CFlIC%#0s!UeOGQ})hH?{MH{GSSWBA)BgDdxOc z_+lAk#76Lo-a{^(g|F8eV%U2YvM+U#Y!fr_tb6o@W=WBO%w&8xjzb8GZ z=g_j_W_T|iP1VgERez7=fuxW7PTL1b=+ZA!F6ZV6L&N;JqTWvg^tg#?W<@oWN?J?j z=hJFHAL)IF=O(%;&+}vzEaQ?-lOVHWe>TJ%^8M{F8VTl+q2%6PM2>Y)E0W-Od`HrR8r@rvlF|w`*RRsyj8hXZEDS zrW4~E1*a0`k+`b41?3++!~0PzQ5UAXV6Fy6?mEi<#i@JUkr%3s* zI4#Ooh>82*gy!gVGn3?T%5;BPoal7Pt2d?1>JxPX-_7I18Z7i<@pK(0@=eT|_peXO zl7Rmh+z+RGkMEsitju|wGTomFC;I*Oc0yZK57$h;k8WGvy<;b~mU`<=>&0K$w}-1= Hm!JI$qvrH) literal 0 HcmV?d00001 diff --git a/docs/测试说明/boot_log_data/20261012_B9_soe_decode_post.txt b/docs/测试说明/boot_log_data/20261012_B9_soe_decode_post.txt new file mode 100644 index 0000000000000000000000000000000000000000..f477f601b4eef418837978c416b998cf4e188666 GIT binary patch literal 9521 zcmd6tNpBP}5QXa;iT}_N7mx^~w=jv6Lk>A05s0!JI3dD}A|xOp3xYonylPLStK9Z< zlrVP7(k#8rH?Q1&u4@1Nb4{1DpqKO&?-#U71=ZBjj2e78r{8pgz1Q>t-&)$n>lMC# z#<5p4$Mz?*fo%mnrLC?N*tVb_w1;oJ-ERl8RN&gA5})|B!an}Ii|g#*wZyxnEOErtC>#7IOUeI3 zD4BTJj-cf}^gDo_@99h_Ss(^Z%gyC^aVX}T z1?4flyE{rK$0PnYO76=-$;88^wS1!p`ADH0*OKFOUoBhoOdD}lK`5Dc*hI@!caPk6 z@raM#J$=N7lspCqrNqsW3gxPZk5jS&57(0aqfj#OunA>OEoX|7iHA)nQ)*dx{c=Z9 zGV!npWlAkAC6D-h#F=>5gfgF&CGPp2(lPs-LYY%b>pda&5z3reYVUErKSeFI_mr4h z`HTg8(ani+YN@@a?B;$xr%>kXm)d)HUgtATLrd*FWjAN`Ij5kd_MWnvQO77#_RHFM zPl*}49xp@gqi1euX2GqOQE(2TDMRj~Dc3*0th>4T%xGB|?{Unrh^M*7!<5>49CM5^ zO}`9NYVWDKoHIt5Q%mhV)dajJtflszY69L9rqte3O~88`<&JlcYwzK@h~F!FhfLWo zeM;>;)dakUwQMnp>wLU2-cz9>_Ao7Fmh$*~+)>(5y*Az>S+ym-&urs=QP$9j>qI`K z&U>an$(2F&KppYA8^@(;5XyQA(muZK*+$*fFZtC{TJN#3cHbo8s~mDX;vA>(3QUYr zdrv6qv0AQsPUI*X^h~Rz_8ul4HqkQ0cp0PA-Xn3dq(ZqW;&R``Mz7Zd4sl6xU zJZZfrrlt0t{57{2rOtao&NBrq8{<8ptf!|;*)Q$$p2p-o`D<J+4k@@9;cY z+UGq@mqYXp8G7O)BT>rn(x=qklfULB5%(#z_k?S1>1P{_H{0MRe!8|1avx2(ZXf3{ zXZTE)pPp*Uko%HF-q+{53jk28^kjT9+$^63P;IRHO|g> zesO`7KnwcbomY4RA ziKw!+R&`>>aesNUyKi>q@1Hxmr6s+juXw$o31w8!m@2f4uIV?e@#!7Cz*$8j99KC1 zjC)tK!1X6|glic+rGaZ1t}W>Yo#KqIhiyi0>5M+olrGR_G^fjldzN7MhHnlxSANnb zT;V7E+C1I=j{&{L9c%ojQ?L&3H=<+8@s5uLKI8WjJZFq!j#o>W;jJx)T z?;bsM#G8~n2MDFa&5{b`wutYhWCi|TOa6^Q$;8bjlwE3hq9~cT*@QBsmPODn$BL4P zn@uQFYH2BX#;+sJ#LXs@-D#O)%-58jIph?|F157Y6LTM->{3hZJ>K{GsHOIvoMP_N z2Q9VtNd)hT9(Fpa%Av& zzKpq#&fL;u!NXuh!D|pr8FL>^dHDRYbh-M8(Xue!MDYf@_<~GVS{W4Ce zy{B+%&Nj*}wbb5I^uT-KT59hpdf+{AO6@&G54^`yj)O6-y@&Tj!d_WBWXgUSQfluh zdf+{*Swbh?CkiR`x~C76 zyferis3Tswd0ci4Vym8vw2vP;+bG@sB_A!N^&T5*epf`tDc%NWxurbp31Cyy5Dn?h=-JV-Q)KO?FjEi%aNHc zE4PNI9Wqw&k(nsvd>K+|@9BQeO(GsrYVV2fxuwrGs!g`RF}^`Hc1hozBV_ap)!nfV!Ogst{6W@hQ&2wt{lhvgsmj|%CoPDU7${QhBigD P@Pm8K`KDsb?tSzR5)X4Y literal 0 HcmV?d00001 diff --git a/docs/测试说明/boot_log_data/README.md b/docs/测试说明/boot_log_data/README.md index 72df60a2..413d2435 100644 --- a/docs/测试说明/boot_log_data/README.md +++ b/docs/测试说明/boot_log_data/README.md @@ -34,6 +34,7 @@ | 2026-10-12 | 同 MISS 固件(d3107f3)/ **PC 主站 2404 往返**(`test/host/iec104_master.py`) | STARTDT/总召四组+actterm/C_SE 两段写触发 YX15·16 变位(COT=3)/恢复复归/YK11 两段正答/C_RD 读回 10.000 → **18/18 PASS**(104 链与锚点缺陷无关,验收窗口固件本身上先行闭环) | `20261012_B6_iec104_roundtrip_pre-fix_log.txt` | | 2026-10-12 | 同 PASS 固件(B7+fix)/ **PC 主站 2404 往返**(复测) | 同上全链 18/18 PASS——B7 `set_sealed`+持久化写路径下 C_SE→YX 联动仍成立(B5 遗留"104 YX 联动"腿闭环) | `20261012_B6_iec104_roundtrip_log.txt` | | 2026-10-12 | 同 PASS 固件 / **B7 定值持久化 + 软压板 YK12 台架腿**(`test/host/iec104_master.py --b7-pre/--b7-post/--b7-mark/--b7-check`,中间 ST-LINK 复位) | pre **21/21**:C_SE 写 7.5+C_RD 回读、YK12 两段 OFF → 0.05 A 低定值**不动作**(保护退出)、YK12 ON → YX15/16 立即动作(COT=3)、收尾留压板退出;post **13/13**:**压板退出态跨复位保持**(开机日志 `global plate OUT -> protection disabled` + 低定值仍不动作)、重启后 YK12 ON 即动作(联动在位);mark/check **4/4+4/4**:**非默认定值 7.5 跨复位保持**(C_RD=7.500,与出厂默认可区分);开机日志两次 `[CFG] prot set loaded (/prot_set.bin)` | `20261012_B7_iec104_persist_log.txt` / `20261012_B7_persist_boot_log.txt` | +| 2026-10-12 | `prod`(B9 `1d96fc9` sync 追平 B8/N33 后重跑,merge `6cbf400` 覆盖代码)/ **B9 SOE 动作记录 + 时标台架腿** | `@test` **PASS**:锚点 `protection init: OK (set=40 elm=9)`、`freq layer init: OK`、`freq(hb): f=0 valid=0`(浮空不发散)、**`prot set blob version change (ver=1 cnt=32), defaults in use`**(B8 换代 INFO ≠ CORRUPT 实证)、零 `[ERR]`、`protect` 828/2048(59%,与静态 872 相符);主站回归 `--b7-pre` **21/21** + `--b7-post` **13/13** 不回归,**自发 YX = M_SP_TB_1 带 CP56 时标**(动作/复归/重启后联动三段,iv=0);FTP 下载 `/log/soe.log` **56 条** `test/host/soe/decode_soe.py --max-elm 16` **PASS**(boot 段内 seq 严格 +1、ELM_ASSERT 26、CP56↔epoch UTC 交叉一致);`.bin` 为原始 64 B 记录可复解码 | `20261012_B9_prod_boot_log.txt` / `20261012_B9_iec104_soe_pre_log.txt` / `20261012_B9_iec104_soe_post_log.txt` / `20261012_B9_soe_pre.bin` + `20261012_B9_soe_after_post.bin` / `20261012_B9_soe_decode_pre.txt` + `20261012_B9_soe_decode_post.txt` | ## 4. 关联 diff --git a/docs/算法/继电保护功能复现规划.md b/docs/算法/继电保护功能复现规划.md index 3e531c54..1d656f9f 100644 --- a/docs/算法/继电保护功能复现规划.md +++ b/docs/算法/继电保护功能复现规划.md @@ -312,8 +312,8 @@ | L4-1 | 跳闸出口(KO) | 判据满足 → 驱动出口继电器,带保持/脉冲 | ⬜ | | L4-2 | 告警出口 / 信号 | 告警类动作驱动信号灯/继电器 | ⬜ | | L4-3 | 出口自检 | 出口回路检测(若有回读) | ⬜ | -| L4-4 | SOE 记录 | 带时标的事件顺序记录 | ⬜ | -| L4-5 | 动作记录 | 保护动作/返回记录,落 `run.log` | ⬜ | +| L4-4 | SOE 记录 | 带时标的事件顺序记录 | ✅(B9,2026-10-12:`/log/soe.log` 64 B 定长记录 = 类型 + 元件号 + seq(u32) + CP56Time2a + epoch + 校验和;台架 FTP 下载解码 PASS,时标与 104 CP56 交叉一致) | +| L4-5 | 动作记录 | 保护动作/返回记录,落 `/log/soe.log` | ✅(B9,2026-10-12:六类边沿全覆盖——元件动作/复归、软压板投/退、采样数据块/恢复;protectTask 只投递(SPSC 环,post 禁 DBG),defaultTask `syslog_drain()` 落盘,动作路径无 NAND I/O) | | L4-6 | 故障录波(可选) | 4000 Hz 内部节拍预留 | ⬜ | ### 3.5 L5 自检与闭锁 @@ -469,7 +469,7 @@ | **P1** | 基础保护元件 | **V0.1 有效子集**:过流(A 相,`IA`)、过负荷(A 相)+ 定值模型;B/C 相过流**建接口不使能** | P0 | 标准源注入 A 相可正确动作 —— 🔶 **软件侧 2026-10-11 完成**(`prot_set` 定值模型 30 用例 + `prot_elm` 元件框架/过流三段/过负荷 27 用例,主机全绿);**板端接线已落地(B5,2026-10-12:protectTask + IWDG bit8 + 栈核算 + 104 YX 上送)**;标准源注入验收待做 | | **P2** | 电压/频率类保护 | 过压/欠压(`UA`)、过频/低频、零序过压(`UN`) | P0 | 电压/频率越限正确动作 —— 🔶 过压/欠压/零序过压随 P1 同批主机完成(同框架实例);过频/低频 ✅ **B8 已落地(2026-10-12)**:freq 层(自适应窗,扫频最坏 0.0101 Hz)+ OF/UF 实例;出口独立遥信点与注入验收归 B10 | | **P3** | 异常检测与闭锁 | L5 自检闭锁、采样通道自检;三相类(涌流/PT·CT 断线/母线接地)**建接口不使能** | P1/P2 | 自检失败闭锁;未使能元件不误动 | -| **P4** | 出口、记录与定值集成 | L4 出口与记录、§5 定值模型落 cfg_file、UI 显示、上送 | P1 | 动作出口 + SOE 记录 + UI 显示闭环(**定值持久化 + 软压板 + 竞态收口 = B7 完成 2026-10-12,台架腿已验 ✅**) | +| **P4** | 出口、记录与定值集成 | L4 出口与记录、§5 定值模型落 cfg_file、UI 显示、上送 | P1 | 动作出口 + SOE 记录 + UI 显示闭环(**定值持久化 + 软压板 + 竞态收口 = B7 完成 2026-10-12,台架腿已验 ✅**;**SOE/动作记录 = B9 完成 2026-10-12 ✅**:protectTask 边沿→SPSC 环→defaultTask 落盘 `/log/soe.log`,protectTask 静态链 872 B 不变,自发 YX 上送 M_SP_TB_1 带时标;出口继电器 L4-1~L4-3 仍 ⬜——V0.1 无出口硬件,跳闸维持否定确认 R7 口径) | | **P5** | 方向/功率类(延后) | L3-13 方向元件等 | V0.2 硬件 / 子板计量 | 跨转换器相位一致后实现 | > ⚠️ **V0.1 硬件裁剪**(2026-10-10,详见 §1.6):V0.1 上只有 TPAFE 三路(`UA`/`UN`/`IA`)测量有效。故 **P0 骨架全做**(与通道无关),**P1/P2 只做有效通道子集**——A 相过流、A 相过负荷、过压/欠压、零序过压、过频/低频;**三相过流(B/C 相)、零序过流、方向/功率类、PT/CT 断线**依赖 V0.2 硬件(N-18 修复 + 中点偏置),本期**建接口不使能**。 @@ -609,3 +609,4 @@ B0 产品定义 ✅(2026-10-10 已确认,见 §1.5) | 2026-10-12 | **B7 定值持久化 + 全局软压板 + 竞态收口(W1 任务卡)** | **定值模型增项** `PS_GLOBAL_EN`(全局软压板,枚举尾追加,编号不回收);**原子写**:`prot_set_set_sealed()` 影子区拷贝→改→重封→**单字交换活跃区**(双缓冲 +124 B 静态),`prot_set_selfcheck()` 改 seqlock 式复核(封存和两读不一致 = 提交撞见 → 本轮跳过)——B5 登记的"104 写 vs 巡检"µs 级误锁窗口就此消除(§3.5 L5-1 注收口)。**持久化**:新增 `App/cfg/prot_set_store.c/h`(双端注册 + 模拟器豁免点名)——blob = magic`PSET`+版本+计数+值区+sum32 正/反码对(144 B),`/prot_set.bin` 走 `cfg_store_write_atomic`(临时文件+rename,掉电安全);**写路径** = C_SE/YK12 执行段置脏 → iec104Task `dirty_peek` 投递 `SYS_EVT_PROT_SET_SAVE`(事件位 bit7)→ defaultTask(配置引擎属主)落盘,写失败脏回置 = 下轮重试;**装载** = storage_bring_up 在 STORAGE_READY 前整表原子 parse(损坏/越界/版本换代 → 拒绝保出厂默认 + 自检留痕 `prot set corrupt`;文件缺失 = 首启正常静默)。**YK12 转真**:`iec104_pts.c` 两段式(选择段校验 DPC、执行段 set_sealed),protectTask 下一拍读退出态 → 复位元件 + 停判据(`global plate OUT/IN` 边沿日志);本地定值项 `comm_addr=0` 显式不可寻址(防 IOA=0 误命中)。单测:prot_set 63 断言(+33:软压板/原子写/脏握手/blob 往返/坏 magic/截断/坏版本/**伪造自洽越界**对抗样本)、iec104 94 断言(+7:YK12 两段转真/置脏/本地项 C_RD EVI)。`@build` 0 错 0 警(Code=205500 +1152 B,ZI +280 = 双缓冲+blob 缓冲,`ram_baseline` 已刷)。**台架腿完成(2026-10-12)**:`@test` PASS + PC 主站 `test/host/iec104_master.py --b7-pre` **21/21**(YK12 两段 OFF→0.05 A 低定值不动作 / ON→YX15·16 即动作,C_SE→C_RD 回读)、`--b7-post` **13/13**(**压板退出态跨复位保持**:开机日志 `global plate OUT -> protection disabled` + 低定值仍不动作、重启后 YK12 ON 联动在位)、`--b7-mark/--b7-check` **4/4+4/4**(**非默认定值 7.5 跨复位保持**,C_RD=7.500,与出厂默认可区分);开机日志两次 `[CFG] prot set loaded (/prot_set.bin)`;证据 `docs/测试说明/boot_log_data/`(20261012_B7_* 两份) | | 2026-10-12 | **B6 台架 `@test` 闭环复测(B4/B5 验收窗口,W1 任务卡)** | 首跑(HEAD `d3107f3`)**FAIL**:`protect task start` 锚点行字节级交错损坏(`st[art: cycle=220ms elm=70`,两次开机同形复现)= protectTask 启动行违反控制台写者注册前门控纪律(B5 台架腿未跑故未暴露,机理与实证见 `docs/子系统设计/控制台单写者日志设计说明.md` §11 2026-10-12 行);其余 8 Required / 零 `[ERR]` / 锚点×1 / 回读一致全过。**修复** = 启动锚点行改 `dbg_console_writer_ready()` 首拍补打(adcTask 首帧门控同款,+16 B)。**复测 PASS**(B7 `1fe163b`+fix):锚点行完好(+577 ms,attach 后);**首采水位** `protect` 828/2048(free_min 1220,59%)、`iec104` 424/2560(83%)、新 56 KB 堆 free=17936 **min_ever=10000**(>3072 告警线零告警,**N-33 抬栈 min_ever 背书就绪**);采样闭锁不误报。**PC 主站往返**:新增 `test/host/iec104_master.py`(纯标准库主站客户端)STARTDT→总召四组+actterm→C_SE 两段写临时压低 OC1 定值**确定性**触发 YX15·16 变位(COT=3)→恢复复归→YK11 两段正答→C_RD 读回 10.000,**18/18 PASS**(`d3107f3` 与 B7+fix 两版固件各一轮),串口侧 `[I104] accepted`/`[PROT] elm OC1-IA` 边沿/YK11 复位→UV-UA +10 s 重返联一致。证据 `docs/测试说明/boot_log_data/20261012_B6_*`(含缺陷复现 MISS 快照)。B5 行"台架 `@test` 待做"遗留**闭环**;B7 台架腿的 C_SE 写路径已随本窗验证(断电重启保持 + YK12→YX 仍待窗) | | 2026-10-12 | **B8 频率测量层 + 过频/低频保护(L3-5,W1 任务卡)** | 新增 `App/algo/freq.c/h`(L2.5 测频:共轭乘积相位增量 + 解缠绕 + **自适应窗长** K_eff=round(8·Fs/(2·f̂))——定长窗受 20 点矩形窗**负序泄漏纹波**限制(实测最坏 0.317 Hz)、60 拍 Kay 复数和 0.197 Hz(交叉项和角不按 1/K² 衰减),自适应窗把窗长对齐纹波周期 fs/(2f) 整数倍 → **0.0101 Hz**;假值钳制带 35~65 Hz 与系统合理带分离(贴边钳制会非对称丢纹波半周 → 45 Hz 点 +0.16 Hz 偏置);幅值门 <50 码 → valid=0 保持;UA→IA 优先级;`freq_run()` 挂 adcTask `phasor_run()` 后,心跳 `freq(hb)` 行)。**定值 32→40**:尾追加 OF/UF 8 项(51.0/49.0 Hz、dly 1000 ms、返回系数 0.99/1.01;全部本地项 `comm_addr=0`,参考逐项地址不在本仓库待对照);`bad_mask`→`uint64_t`(TC-PS-011 断言 bit39 可指认);**blob VER 1→2**(144→176 B;升级语义换代/损坏分流:旧档 → `prot_set_store_load()` **rc=2 换代** INFO ≠ **rc<0 真损坏** ERROR+自检,defaultTask 不误报)。**prot_elm 7→9**:`PE_OF`/`PE_UF` + `pe_cfg_t.src`(0=相量有效值 / 1=freq 测频;freq 无读数按方向填"必不启动"值,不整拍跳过);OF/UF 暂无独立 YX 点,动作仅经 YX15 总聚合可见(独立分点 = B10 送检点表);YC `0x401D` 频率点仍 QDS=IV(接真值 + 独立分点归 B10)。单测:`test/host/freq/` **46 断言**(J1 扫频 45~55 Hz ≤0.02 实测 0.0101 / J2 噪声 1% ≤0.10 实测 0.0160 / J3 启动收敛 ≤40 ms 实测 20 / J4 阶跃 50→51 ≤120 ms 实测 98——**精度优先于响应**显式取舍:98 ms ≪ OF/UF 动作延时定值默认 1000 ms / J5 浮空 valid=0 漂移 0.13 / J6 双跳变 60 ms 回 ±0.05;三代弯路推导写 `freq.c` 文件头防重蹈)+ prot_set **90**(+27:40 项/VER 2/64 位 bad_mask/旧档拒绝)+ prot_elm **47**(+OF/UF 滞回·方向隔离·测频接线);回归 phasor 57 / iec104 94 无退化。`@build` 0 错 0 警(Code=207468);RW_IRAM1 +632 B(73.3%→73.8%)、CCM 不变、Flash +2,244 B(21.6%);**adcTask/protectTask 栈链不变**(freq_run 帧未进最坏链,无需抬栈)。§3.3 L3-5 置 ✅(软件侧)、§7 P2 更新;`freq-unit-test` 钩子登记(31→32) | +| 2026-10-12 | **B9 动作记录 + 时标 SOE(L4-4/L4-5,W1 任务卡)** | 新增 `App/log/soe_rec.c/h`(64 B 定长 SOE 记录纯编解码:类型 1~6 = 元件动作/复归、软压板投/退、采样数据块/恢复 + 元件号 + IV 位 + seq(u32) + CP56Time2a + epoch_s + value + sum8)与 `App/log/soe_store.c/h`(板端胶水:SPSC 无锁环 8 深惰性创建 + `soe_store_drain()` 挂 `syslog_drain()` 尾,defaultTask 唯一落盘写者)。**动作路径零 NAND I/O**:protectTask 只投递(post **禁 DBG**——曾把静态链从 872 垫到 1192 FAIL,丢弃计数留痕挪 drain 侧),**protectTask 静态链 872 B / 57% 改前后逐字节不变**(DoD 硬约束)。**104 自发单点改 M_SP_TB_1(type 30,带 CP56 时标)**——idx≥4 且时标有效;总召/周期上送保持 M_SP_NA_1 不变;主站工具 `iec104_master.py` 同步解析 type 1/30。单测 `test/host/soe/` **32 断言**(往返/截断/坏校验和/IV 位/seq 连续性)+ iec104 **94→97**(TB 编解码 + pts 自发选型 + IV);`soe-unit-test` 钩子登记(32→33)。**台架腿**(sync 追平 B8/N33 后重跑,覆盖将被合并的代码):`@test` PASS(锚点 `set=40 elm=9`、无 `[ERR]`)+ **顺带兜住 B8 板端面**(`freq(hb): f=0 valid=0` 浮空不发散、`prot set blob version change (ver=1 cnt=32), defaults in use` = 换代 INFO ≠ CORRUPT 实证)+ `--b7-pre` 21/21 / `--b7-post` 13/13 不回归 + 自发 YX M_SP_TB_1 带 ts(动作/复归/重启后联动三段)+ FTP 下载 `SOE.LOG` **56 条** `decode_soe.py` PASS(boot 段内 seq 严格 +1、CP56↔epoch UTC 交叉一致)。RAM:RW_IRAM1 +1,088 B(SPSC 环 512 + 静态 FIL 528 + 计数器,74.7%);Flash +1,856 B。§3.4 L4-4/L4-5 置 ✅、§7 P4 更新;出口 L4-1~L4-3 仍 ⬜(V0.1 无出口硬件,R7 否定确认口径不变) | diff --git a/scripts/ram_baseline.tsv b/scripts/ram_baseline.tsv index 9a1e1990..cea76a8d 100644 --- a/scripts/ram_baseline.tsv +++ b/scripts/ram_baseline.tsv @@ -1,2 +1,2 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi -2026-10-12 207636 18300 1080 153120 225936 21.5 96776 73.8 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;console_log.o=4120;ch395f.o=4106;default_task.o=2736;sys_log_mcu.o=1924 +2026-10-12 209492 18332 1104 154184 227824 21.7 97864 74.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=40960;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;console_log.o=4120;ch395f.o=4106;default_task.o=2736;sys_log_mcu.o=1924