docs: 任务规划目录收缩——只留推进顺序与硬件缺陷,其余待办归模块文档

按用户裁定(2026-11-10)把 docs/任务规划/ 从"全量待办表"收成两个文件:

1. 登记簿.md 只记 V0.1 硬件缺陷 → V0.2 改版要求(双转换器无共同采样触发、
   IA 前端差分滤波限制谐波带宽)。原 §1/§2/§4/§5/§6/§7/§8/§9 的待办按
   "待办跟着所属模块走"清空,四类事实在删除前先落到新归属:
   - 两点标定开工前要先拍板的三件事 → 算法层设计说明 §13.13(新节)
   - 通讯设置页真机判据 → 网络配置说明 §3.6 内联
   - 缩堆迁 CCM 后半、开入开出重开条件 → 原本各模块文档即唯一权威
2. 暂缓-RS485.md 删除,其唯一不可丢的"采集链路测试可验证性约束"三条与
   完成判据并入 产品需求设计文档 §5.10。
3. 任务规划/README.md 去掉全部历史叙述(UI 补齐销项流水、net 收口过程、
   故障录波近千字台账),只留:怎么用、条目规则、生成物单写者纪律、
   推进顺序表(每行只写当前状态与卡点)、维护约定。

同步改写全库引用(约 60 处):AGENTS.md、docs/README.md、产品需求、UI、
子系统设计、内存管理、环境与部署、算法、测试说明、门禁说明、问题记录,
以及 App/ 与 Drivers/BSP/ 的头注释、脚本与 .pre-commit-config.yaml 注释。
顺带修掉三处已失效的引用目标:链路延迟测试的队列往返重验项改指实机测试
实施指南 §7.3;并行工作树的 <ID> 行去掉已退役的 N-x/S-x/T-x 编号族;
任务规划 README 的 §1 旧编号在技能示例里的引用。

门禁:check_doc_links --all --sections-strict 214 篇通过、无法判定 0;
pre-commit 全 Passed(doc-links / mermaid / 任务表 / 内存数字 / BOM /
UI 像素回归 / generated-fresh / layer-deps / bsp-err / skill-size);
keil-build 0 错误 0 警告(Code=255160 RO=31204 RW=2080 ZI=152152),
RAM 预算门禁 PASS(RW_IRAM1 73.9%、RW_CCM 87.9%)。
This commit is contained in:
2026-11-10 20:33:30 +08:00
parent ae09c5737a
commit 7b05d7bfd4
66 changed files with 208 additions and 339 deletions
@@ -68,7 +68,7 @@
5. **一笔只装一类事**。数字同步一笔(`cbb4fdb8`:11 处 + 变更记录一行);口径更正另起一笔(`6daa01ae`);提交后复扫逮到的漏网当前态再补独立一笔(`11d60057`)。钩子一增一减写成一个当日行的两个阶段(51 → 52 加 `id-check-new`、随即 52 → 51 摘 `id-check`),别写两行互相打脸。提交说明如实写(「先认一笔自己的错:上一笔的未绑 21 叶是探针错」),别把口径修正包装成「补充说明」。 5. **一笔只装一类事**。数字同步一笔(`cbb4fdb8`:11 处 + 变更记录一行);口径更正另起一笔(`6daa01ae`);提交后复扫逮到的漏网当前态再补独立一笔(`11d60057`)。钩子一增一减写成一个当日行的两个阶段(51 → 52 加 `id-check-new`、随即 52 → 51 摘 `id-check`),别写两行互相打脸。提交说明如实写(「先认一笔自己的错:上一笔的未绑 21 叶是探针错」),别把口径修正包装成「补充说明」。
6. **被改文件全文通读,核对其余小节**——不是只看 diff。同一文档内互相引用的小节必须一致(本窗产品需求:§2.4 立项未排、§5.14 FR-SOE-3、§8.2 绑定现状、§8.3 已绑分页表、§9.1 差距表、§9.2 顺序表六处同时引用这四个数;`docs/任务规划/README.md` §1 当前执行表 vs §2 全项目顺序表)。若发现上一笔自己写进文档的数**口径就错了**,明确认错并改正,同时把**可复核的重算方法**写进文档(「按缩进判叶子:有更深缩进后继者即非叶子」),防止再错。 6. **被改文件全文通读,核对其余小节**——不是只看 diff。同一文档内互相引用的小节必须一致(本窗产品需求:§2.4 立项未排、§5.14 FR-SOE-3、§8.2 绑定现状、§8.3 已绑分页表、§9.1 差距表、§9.2 顺序表六处同时引用这四个数;当窗口的 `docs/任务规划/README.md` 就同时有两处表引用同一批数,后来合成一张)。若发现上一笔自己写进文档的数**口径就错了**,明确认错并改正,同时把**可复核的重算方法**写进文档(「按缩进判叶子:有更深缩进后继者即非叶子」),防止再错。
7. **提交后再复扫一遍**(收尾硬步骤,不许省,也不许只在提交前扫)。按第 2 步的**全部**旧形态整仓再扫一次,逐条分类为 当前态 / 历史行 / 同数不同义:本窗 `cbb4fdb8` 提交后复扫得 14 条命中,12 条以上都在变更记录历史行(`47 → 53`、`53 → 60`、`122/217` 冻结),**唯一残留的当前态命中**是 `docs/架构设计/项目架构总览.md` §3「界面层」那行 → 单独补一笔 `11d60057`。说不出归属的就是漏改。 7. **提交后再复扫一遍**(收尾硬步骤,不许省,也不许只在提交前扫)。按第 2 步的**全部**旧形态整仓再扫一次,逐条分类为 当前态 / 历史行 / 同数不同义:本窗 `cbb4fdb8` 提交后复扫得 14 条命中,12 条以上都在变更记录历史行(`47 → 53`、`53 → 60`、`122/217` 冻结),**唯一残留的当前态命中**是 `docs/架构设计/项目架构总览.md` §3「界面层」那行 → 单独补一笔 `11d60057`。说不出归属的就是漏改。
@@ -41,7 +41,7 @@
→ 主树 `merge --no-ff -F` → 合并前后 blob id 与 `diff --stat` 对账。**「它看着像废弃的」不是丢弃判据**。 → 主树 `merge --no-ff -F` → 合并前后 blob id 与 `diff --stat` 对账。**「它看着像废弃的」不是丢弃判据**。
- **⚠ `done` 的门禁跑在 `/keil-build` 之前 → 依赖 `.map` 的钩子会误报**(2026-10-12 实测): - **⚠ `done` 的门禁跑在 `/keil-build` 之前 → 依赖 `.map` 的钩子会误报**(2026-10-12 实测):
`done` 的顺序是「合并 → 重生成 → **门禁(ci_local)** → `/keil-build`」,而 `done` 的顺序是「合并 → 重生成 → **门禁(ci_local)** → `/keil-build`」,而
`mem-budget`(登记簿条目「缩堆迁 CCM 后半(暂缓)」)/ `mem-numbers` 是拿**文档快照 vs `.map`** 比对 —— 门禁跑时 `mem-budget`(内存治理三件套)/ `mem-numbers` 是拿**文档快照 vs `.map`** 比对 —— 门禁跑时
`.map` 还是**主工作树合并前**的旧产物,与刚合并进来的新台账**必然不一致** → `.map` 还是**主工作树合并前**的旧产物,与刚合并进来的新台账**必然不一致** →
误报 `[FAIL] 台账受管区与 .map 不一致`。`/keil-build` 跑完后 `.map` 才是新的。 误报 `[FAIL] 台账受管区与 .map 不一致`。`/keil-build` 跑完后 `.map` 才是新的。
**处置(2026-10-25 补全)**:按 C 节第 5 步的完整链补——`check_mem_numbers.py --write` → **处置(2026-10-25 补全)**:按 C 节第 5 步的完整链补——`check_mem_numbers.py --write` →
+3 -3
View File
@@ -564,7 +564,7 @@ repos:
# TEST_SUITE_CH395F 就是开启状态(.map 含 34 处 test 代码),即仓库里 # TEST_SUITE_CH395F 就是开启状态(.map 含 34 处 test 代码),即仓库里
# 躺着的是测试固件。本钩子抓这个静默漏网:默认要求产品构建,跑套件回归 # 躺着的是测试固件。本钩子抓这个静默漏网:默认要求产品构建,跑套件回归
# 确需提交测试构建时用 `--allow-test-build` / ALLOW_TEST_BUILD=1 显式放行。 # 确需提交测试构建时用 `--allow-test-build` / ALLOW_TEST_BUILD=1 显式放行。
# 详见 docs/任务规划/登记簿.md # 判据与背景见 docs/门禁说明/test-suite-switch.md
- id: test-suite-switch - id: test-suite-switch
name: 测试套件开关=产品构建 name: 测试套件开关=产品构建
entry: python scripts/check_test_suite.py entry: python scripts/check_test_suite.py
@@ -572,7 +572,7 @@ repos:
files: ^test/board/test_config\.h$ files: ^test/board/test_config\.h$
pass_filenames: false pass_filenames: false
# 9) 双端注册反向校验(2026-10-12 加,登记簿条目「rs485_task 白名单缺口」) # 9) 双端注册反向校验(2026-10-12 加,rs485_task 白名单缺口)
# 背景:新 .c 必须手动注册两处(`MDK-ARM/*.uvprojx` + `simulator/CMakeLists.txt`) # 背景:新 .c 必须手动注册两处(`MDK-ARM/*.uvprojx` + `simulator/CMakeLists.txt`)
# 才会被编译;历史上 `App/task/rs485_task.c`、`Drivers/BSP/NET/lftpd/lftpd_log.c` # 才会被编译;历史上 `App/task/rs485_task.c`、`Drivers/BSP/NET/lftpd/lftpd_log.c`
# **两处都没注册** = 写了却从不参与任何一端编译的**死代码**,误导读者以为功能已生效。 # **两处都没注册** = 写了却从不参与任何一端编译的**死代码**,误导读者以为功能已生效。
@@ -589,7 +589,7 @@ repos:
language: system language: system
files: (\.c$|\.uvprojx$|CMakeLists\.txt$|^scripts/check_registration\.py$) files: (\.c$|\.uvprojx$|CMakeLists\.txt$|^scripts/check_registration\.py$)
pass_filenames: false pass_filenames: false
# 10) RAM 预算 92% 阈值门禁(2026-10-12 加,登记簿条目「缩堆迁 CCM 后半(暂缓)」的台账/门禁那半 / 审查报告 §5.5 三件套) # 10) RAM 预算 92% 阈值门禁(2026-10-12 加,内存治理三件套的台账/门禁那半)
# 背景:报告 §5.5 第 1 条要求"超阈值即失败 + Top-10 附表"——此前 mem-numbers 只防 # 背景:报告 §5.5 第 1 条要求"超阈值即失败 + Top-10 附表"——此前 mem-numbers 只防
# "文档数字漂移",**没有任何机械检查拦"占用超阈值"**;台账三件套(ram_baseline.py + # "文档数字漂移",**没有任何机械检查拦"占用超阈值"**;台账三件套(ram_baseline.py +
# ram_baseline.tsv + docs/内存管理/RAM预算台账.md)落地后,本钩子把 92% 红线机械化。 # ram_baseline.tsv + docs/内存管理/RAM预算台账.md)落地后,本钩子把 92% 红线机械化。
+6 -6
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -194,7 +194,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」
- 模拟器侧分两类(Lead 裁定 2026-10-29):`wave_ring.c` 与 `wave_store.c` **真实参与** - 模拟器侧分两类(Lead 裁定 2026-10-29):`wave_ring.c` 与 `wave_store.c` **真实参与**
`simulator/CMakeLists.txt`——回放页要在模拟器里出真波形,两份又零平台依赖,与「双端共享核心、不造 `simulator/CMakeLists.txt`——回放页要在模拟器里出真波形,两份又零平台依赖,与「双端共享核心、不造
第二真相」同一条口径,故**不进** `SIM_EXEMPT`;其余九个采集链文件(UI 模拟器不跑采集链路)仍登记在 第二真相」同一条口径,故**不进** `SIM_EXEMPT`;其余九个采集链文件(UI 模拟器不跑采集链路)仍登记在
`scripts/check_registration.py` 的 `SIM_EXEMPT`(附理由),`registration-check` 钩子反向校验(登记簿条目「rs485_task 白名单缺口」)。 `scripts/check_registration.py` 的 `SIM_EXEMPT`(附理由),`registration-check` 钩子反向校验(`rs485_task` 白名单缺口)。
### 4.2 主机侧纯逻辑单测——生产源文件以 `#include` 原样纳入 ### 4.2 主机侧纯逻辑单测——生产源文件以 `#include` 原样纳入
+1 -1
View File
@@ -7,7 +7,7 @@
* 修改记录: * 修改记录:
* v1.0 2026-07-19 王建锋 创建初始版本 * v1.0 2026-07-19 王建锋 创建初始版本
* v1.1 2026-10-04 王建锋 如实标注三个 APP_*_ENABLE 为"未接线占位"(全库零消费点) * v1.1 2026-10-04 王建锋 如实标注三个 APP_*_ENABLE 为"未接线占位"(全库零消费点)
* v1.2 2026-10-22 王建锋 收口(登记簿 C5):删除 4 个零消费点的宏 * v1.2 2026-10-22 王建锋 收口:删除 4 个零消费点的宏
* (APP_NET_ENABLE / APP_ADC_ENABLE / APP_RS485_ENABLE / * (APP_NET_ENABLE / APP_ADC_ENABLE / APP_RS485_ENABLE /
* APP_SYS_TIME_SRC)。留"看起来能裁剪、其实不生效"的宏比不留更糟: * APP_SYS_TIME_SRC)。留"看起来能裁剪、其实不生效"的宏比不留更糟:
* 评审者会误信模块可裁剪,而关掉它们不会产生任何编译期效果。 * 评审者会误信模块可裁剪,而关掉它们不会产生任何编译期效果。
+1 -1
View File
@@ -10,7 +10,7 @@
* 帧结构(本层只管 ASDU,APCI 6 字节头归 iec104_link): * 帧结构(本层只管 ASDU,APCI 6 字节头归 iec104_link):
* [type 1B][vsq 1B][cot 2B][ca 2B]( [ioa 3B][元素...] )*n * [type 1B][vsq 1B][cot 2B][ca 2B]( [ioa 3B][元素...] )*n
* 多信息体地址对象(SQ=0)每对象带独立 IOA;顺序对象(SQ=1)单 IOA + n 元素。 * 多信息体地址对象(SQ=0)每对象带独立 IOA;顺序对象(SQ=1)单 IOA + n 元素。
* 创建日期:2026-10-12(B4,W1 功能主线,登记簿见 docs/任务规划/) * 创建日期:2026-10-12(B4,W1 功能主线)
*/ */
#ifndef IEC104_ASDU_H #ifndef IEC104_ASDU_H
#define IEC104_ASDU_H #define IEC104_ASDU_H
+1 -1
View File
@@ -15,7 +15,7 @@
* netTask/uiTask 不得直接触碰引擎);getter = 任意消费上下文(u16 * netTask/uiTask 不得直接触碰引擎);getter = 任意消费上下文(u16
* 半字对齐读天然原子,重载瞬间最坏 = 单字段新旧值之一);setter = * 半字对齐读天然原子,重载瞬间最坏 = 单字段新旧值之一);setter =
* UI 保存交接路(task-9,net_cfg_set_* 先例)。 * UI 保存交接路(task-9,net_cfg_set_* 先例)。
* 生效语义:**改后重启生效**(通讯设置页验收口径,见 `docs/任务规划/登记簿.md` §7)—— * 生效语义:**改后重启生效**(口径见 `docs/子系统设计/网络配置说明.md` §3.6)——
* iec104Task 启动时取一次 getter 填 link cfg;端口另在下次重 bind * iec104Task 启动时取一次 getter 填 link cfg;端口另在下次重 bind
* (拆链/网络代次重建)自然生效,不必整机重启。不挂段回调、不新增 * (拆链/网络代次重建)自然生效,不必整机重启。不挂段回调、不新增
* 事件位、不走 SYS_EVT_NET_RECONFIG(网络代次链语义不同;且 CH395F * 事件位、不走 SYS_EVT_NET_RECONFIG(网络代次链语义不同;且 CH395F
+1 -1
View File
@@ -2,7 +2,7 @@
* 模块名称:RS485 Communication Task * 模块名称:RS485 Communication Task
* 模块功能:RS-485 轮询收发、协议帧解析与响应 * 模块功能:RS-485 轮询收发、协议帧解析与响应
* 状态说明:**预留桩(未启用)**——采集/协议链路尚未实现,产品定义未定 * 状态说明:**预留桩(未启用)**——采集/协议链路尚未实现,产品定义未定
* (见 docs/任务规划/暂缓-RS485.md,B2 暂缓)。当前 init/func 为空实现, * (整簇冻结与重启门禁见 docs/产品需求/产品需求设计文档.md §5.10)。当前 init/func 为空实现,
* 不收发、不解析。 * 不收发、不解析。
* 适用平台:STM32F407ZGTx * 适用平台:STM32F407ZGTx
* 作者:王建锋 * 作者:王建锋
+6 -5
View File
@@ -25,15 +25,16 @@
* (2026-10-25 实测 bit4 8 连击、uisn=154ms 仍在段内; * (2026-10-25 实测 bit4 8 连击、uisn=154ms 仍在段内;
* 按位连击判据 = docs/子系统设计/看门狗设计说明.md §5.3)。 * 按位连击判据 = docs/子系统设计/看门狗设计说明.md §5.3)。
* 单个往返自身仍无上界——该上界与彻底解耦(事件驱动 * 单个往返自身仍无上界——该上界与彻底解耦(事件驱动
* accept)归登记簿「net 层跨上下文收口」(批 3),本票只做心跳续命。 * accept)随「net 层跨上下文收口」后续评估(该波已于 2026-11-06 闭环),
* 本票只做心跳续命。
* v1.5 2026-10-26 DTU 项目组 道F task-3 装置维护三页的执行侧:新增 * v1.5 2026-10-26 DTU 项目组 道F task-3 装置维护三页的执行侧:新增
* ui_data_maint_ops_t 六件适配(时钟=写+回读 RTC、 * ui_data_maint_ops_t 六件适配(时钟=写+回读 RTC、
* 复归=prot_elm_request_reset、清除=syslog_request_clear * 复归=prot_elm_request_reset、清除=syslog_request_clear
* /clear_state 直通)并在 ui_menu_init 之前注入;记录 * /clear_state 直通)并在 ui_menu_init 之前注入;记录
* reader 的 2 条 if 链改成 7 条映射表 s_log_map,并加 * reader 的 2 条 if 链改成 7 条映射表 s_log_map,并加
* 编译期守卫把 UI_W_REC_LOG_* == syslog_id_t 枚举序钉死 * 编译期守卫把 UI_W_REC_LOG_* == syslog_id_t 枚举序钉死
* v1.6 2026-11-02 DTU 项目组 修复「回放页段表枚举恒空」第一幕(登记簿同名 * v1.6 2026-11-02 DTU 项目组 修复「回放页段表枚举恒空」第一幕(docs/子系统设计/故障录波设计说明.md §10 +
* 条目 + docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3): * docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3):
* ui_task_wave_scan 失败不再无条件钉 s_wave_scanned—— * ui_task_wave_scan 失败不再无条件钉 s_wave_scanned——
* opendir/readdir 失败本轮返 -1(卷忙语义),下一次进页/ * opendir/readdir 失败本轮返 -1(卷忙语义),下一次进页/
* 按键自然重试;失败分支与「FR_OK 零条目」补带 FR 码留痕 * 按键自然重试;失败分支与「FR_OK 零条目」补带 FR 码留痕
@@ -457,8 +458,8 @@ static uint8_t s_wave_buf[256u]; /* 读窗:数据区流式 256B/次
* 函数说明:目录不存在(FR_NO_PATH,从未录过波)与目录空都归「0 段」并钉表, * 函数说明:目录不存在(FR_NO_PATH,从未录过波)与目录空都归「0 段」并钉表,
* 不是错误(设计原口径);其余 f_opendir/f_readdir 失败一律不钉表 * 不是错误(设计原口径);其余 f_opendir/f_readdir 失败一律不钉表
* (v1.6:原实现失败也无条件置 s_wave_scanned=1,卷忙 / FR_DENIED * (v1.6:原实现失败也无条件置 s_wave_scanned=1,卷忙 / FR_DENIED
* 一类失败被钉成「0 段」假空态直到下一次 manual_req,登记簿 * 一类失败被钉成「0 段」假空态直到下一次 manual_req,故障录波设计说明 §10
* 「回放页段表枚举恒空」处置方向 = 失败不钉表、下键重试,与 * 的处置方向 = 失败不钉表、下键重试,与
* soe_store 读者同纪律)。失败留痕带 FR 码,板级判读表(FR_DENIED * soe_store 读者同纪律)。失败留痕带 FR 码,板级判读表(FR_DENIED
* → 锁纪律;FR_NOT_READY → 挂载;FR_OK 但零条目 → readdir 与卷状态 * → 锁纪律;FR_NOT_READY → 挂载;FR_OK 但零条目 → readdir 与卷状态
* 交互)见 docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3。 * 交互)见 docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3。
+1 -1
View File
@@ -1117,7 +1117,7 @@ int net_bind(int sockfd, const struct net_sockaddr *addr, int addrlen) {
* 函数说明:原逻辑内联在 net_bind 的 port==0 分支;UDP 队列化后绑定动作挪进 * 函数说明:原逻辑内联在 net_bind 的 port==0 分支;UDP 队列化后绑定动作挪进
* netTask 执行,两处都要用同一游标,故抽成函数(同一事实只在一处)。 * netTask 执行,两处都要用同一游标,故抽成函数(同一事实只在一处)。
* 与抽取前一致:**不做**"是否已被其他 Socket 占用"检查(8 条 fd 的 * 与抽取前一致:**不做**"是否已被其他 Socket 占用"检查(8 条 fd 的
* 并发绑定组合由调用方保证,登记簿无此项待办)。 * 并发绑定组合由调用方保证,不另做占用检查)。
*/ */
uint16_t net_dynamic_port_next(void) { uint16_t net_dynamic_port_next(void) {
/* 本次分配值 */ /* 本次分配值 */
+1 -1
View File
@@ -23,7 +23,7 @@
- 采样数据的消费者 `App/task/adc_task.c` **已实现**(ADC 采集链路,2026-10-10:`tpafe5160_snapshot()` 原子取数 + 帧统计;`adcTask` 在 `Src/freertos.c` 的 `USER CODE` 区创建)。**v2.2(2026-10-10)**:采样节拍改由定时器更新中断硬件触发,本任务退化为纯消费者;**v2.8(2026-10-10)**:节拍源改 TIM3(同时经 TRGO 触发 ADC1 + DMA),STM32 侧改为消费 DMA 乒乓缓冲,单拍耗时 122 µs → **8 µs** - 采样数据的消费者 `App/task/adc_task.c` **已实现**(ADC 采集链路,2026-10-10:`tpafe5160_snapshot()` 原子取数 + 帧统计;`adcTask` 在 `Src/freertos.c` 的 `USER CODE` 区创建)。**v2.2(2026-10-10)**:采样节拍改由定时器更新中断硬件触发,本任务退化为纯消费者;**v2.8(2026-10-10)**:节拍源改 TIM3(同时经 TRGO 触发 ADC1 + DMA),STM32 侧改为消费 DMA 乒乓缓冲,单拍耗时 122 µs → **8 µs**
- CONVST→BUSY→RD 三段时序对**建立/保持时间敏感**,改动需对照芯片手册 - CONVST→BUSY→RD 三段时序对**建立/保持时间敏感**,改动需对照芯片手册
- ⚠️ 本项目 ADC 相关功能**新增任务/缓冲前须核算 RAM**(见 `docs/内存管理/`);接消费者前的强制门禁见根 `AGENTS.md`「接 ADC / RS-485 消费者前的强制门禁」 - ⚠️ 本项目 ADC 相关功能**新增任务/缓冲前须核算 RAM**(见 `docs/内存管理/`);接消费者前的强制门禁见根 `AGENTS.md`「接 ADC / RS-485 消费者前的强制门禁」
- ⚠️ **通道语义不是通道号**:`buf[i]` 对应哪个电气量必须查 `docs/硬件平台/ADC通道映射说明.md`(`buf[2]=IA`、`buf[5]=UN`、`buf[6]=UA`);V0.1 上 8 路电气量分属两片转换器属硬件缺陷(登记簿条目「双转换器无共同采样触发」)→ **禁止**跨转换器做相位/功率/功率因数类运算 - ⚠️ **通道语义不是通道号**:`buf[i]` 对应哪个电气量必须查 `docs/硬件平台/ADC通道映射说明.md`(`buf[2]=IA`、`buf[5]=UN`、`buf[6]=UA`);V0.1 上 8 路电气量分属两片转换器属硬件缺陷(`docs/任务规划/登记簿.md` §1)→ **禁止**跨转换器做相位/功率/功率因数类运算
## 已知问题 ## 已知问题
+1 -1
View File
@@ -35,7 +35,7 @@
* (accept / recv_nb / send / close / 重建三件套)返回点 * (accept / recv_nb / send / close / 重建三件套)返回点
* 调用——风暴期单轮多往返串成 UI 心跳缺口(实测 bit4 * 调用——风暴期单轮多往返串成 UI 心跳缺口(实测 bit4
* 8 连击、uisn=154ms 仍在段内样本),往返本身不动 * 8 连击、uisn=154ms 仍在段内样本),往返本身不动
* (语义不变,上界收口为登记簿批 3 事项),心跳 * (语义不变),心跳
* 在往返边界续命。钩子未注册 = 零行为变化(模拟器/黄金 * 在往返边界续命。钩子未注册 = 零行为变化(模拟器/黄金
* 回归不注册)。判读与设计口径见 * 回归不注册)。判读与设计口径见
* docs/UI设计/UI_设计架构.md §5.8 * docs/UI设计/UI_设计架构.md §5.8
+1 -1
View File
@@ -95,7 +95,7 @@ void ui_net_sink_poll(void);
* 重建三件套)返回处调用钩子。动因:netTask 重建风暴期,单轮内多个 * 重建三件套)返回处调用钩子。动因:netTask 重建风暴期,单轮内多个
* 往返串行排队,把宿主(uiTask,IWDG 必需位)的心跳间隔拖过 800ms * 往返串行排队,把宿主(uiTask,IWDG 必需位)的心跳间隔拖过 800ms
* (2026-10-25 台架实测 bit4 单任务 8 连击窗、uisn=154ms 仍在段内); * (2026-10-25 台架实测 bit4 单任务 8 连击窗、uisn=154ms 仍在段内);
* 往返时长本身不改(上界收口为登记簿批 3 事项),但心跳在每个 * 往返时长本身不改,但心跳在每个
* 往返边界续命——单任务停摆判据(按位连击,docs/子系统设计/看门狗设计说明.md * 往返边界续命——单任务停摆判据(按位连击,docs/子系统设计/看门狗设计说明.md
* §5.3)只应 * §5.3)只应
* 抓真挂死,不该抓「多个都回来了但各自偏慢的往返之和」。 * 抓真挂死,不该抓「多个都回来了但各自偏慢的往返之和」。
+1 -1
View File
@@ -23,7 +23,7 @@
* 修改记录: * 修改记录:
* v1.0 2026-10-27 DTU 项目组 创建(道G task-9;验收口径 = 本页须 * v1.0 2026-10-27 DTU 项目组 创建(道G task-9;验收口径 = 本页须
* 「重启即生效 + 104 侧读回真值 + 段数键数上限核对」, * 「重启即生效 + 104 侧读回真值 + 段数键数上限核对」,
* 台架判据见 docs/任务规划/登记簿.md §7「通讯设置页真机判据」与 * 台架判据见 docs/子系统设计/网络配置说明.md §3.6 与
* IEC104上行设计说明.md §8) * IEC104上行设计说明.md §8)
*/ */
/* 头文件包含区 */ /* 头文件包含区 */
+2 -2
View File
@@ -21,7 +21,7 @@
| USART1 | 串口 | PA9 TX, PA10 RX | 115200bps 调试串口 | | USART1 | 串口 | PA9 TX, PA10 RX | 115200bps 调试串口 |
| SD2506 RTC | I2C1 | PB6 SCL, PB7 SDA | 墙钟基准与日志时间戳 | | SD2506 RTC | I2C1 | PB6 SCL, PB7 SDA | 墙钟基准与日志时间戳 |
| 6x LED | GPIO | PC5, PB0, PB1, PB2, PF11, PF12 | 低电平点亮 | | 6x LED | GPIO | PC5, PB0, PB1, PB2, PF11, PF12 | 低电平点亮 |
| RS-485 | UART4 | PC10 TX, PC11 RX, PA15 DE | 半双工通信(暂缓,见 `docs/任务规划/暂缓-RS485.md`) | | RS-485 | UART4 | PC10 TX, PC11 RX, PA15 DE | 半双工通信(暂缓,见 `docs/产品需求/产品需求设计文档.md` §5.10) |
| SWD | — | PA13 SWDIO, PA14 SWCLK | 调试口 CN2(XH-3A) | | SWD | — | PA13 SWDIO, PA14 SWCLK | 调试口 CN2(XH-3A) |
## 项目架构 ## 项目架构
@@ -178,7 +178,7 @@ STM32F4-Base/
│ └── latency_peer.py # 链路时延 PC 对端 │ └── latency_peer.py # 链路时延 PC 对端
├── docs/ # 项目文档(全量索引见 docs/README.md) ├── docs/ # 项目文档(全量索引见 docs/README.md)
│ ├── README.md # 文档索引:目录结构 + 推荐阅读顺序 + 全量清单 │ ├── README.md # 文档索引:目录结构 + 推荐阅读顺序 + 全量清单
│ ├── 任务规划/ # 统一待办登记簿(README 排序权威 + 拆分文件) │ ├── 任务规划/ # 全项目推进顺序 + 硬件缺陷登记簿
│ ├── 架构设计/ # 项目架构总览 / 存储架构 / 启动顺序 / 配图流程 / 引用关系图 │ ├── 架构设计/ # 项目架构总览 / 存储架构 / 启动顺序 / 配图流程 / 引用关系图
│ ├── 子系统设计/ # 配置 / 网络 / 墙钟 / 日志 / 运行自检记录 设计说明 │ ├── 子系统设计/ # 配置 / 网络 / 墙钟 / 日志 / 运行自检记录 设计说明
│ ├── 网络/ # BSD Socket API 使用指南 + 内部函数调用关系 │ ├── 网络/ # BSD Socket API 使用指南 + 内部函数调用关系
+1 -1
View File
@@ -1213,7 +1213,7 @@ runner 的日志走 **stderr**,于是上面两个日志文件都栽在这两
该步的 `$hooks` 列表,否则只声明不执行); 该步的 `$hooks` 列表,否则只声明不执行);
- **`/keil-build` / 板端测试套件 / 主机侧回归**:永远留在本地,不要往 CI 加(需 Keil 授权与真机); - **`/keil-build` / 板端测试套件 / 主机侧回归**:永远留在本地,不要往 CI 加(需 Keil 授权与真机);
- **runner 长时间不可用**时:CI 只是"多一道网",**提交前的本地 `ci_local.py` 仍是 静态门禁的唯一保障**, - **runner 长时间不可用**时:CI 只是"多一道网",**提交前的本地 `ci_local.py` 仍是 静态门禁的唯一保障**,
不能因"已经配了 CI"放宽(见 [docs/任务规划/登记簿.md](../任务规划/登记簿.md) 的条目「CI 远端闭环未验证」)。 不能因"已经配了 CI"放宽(理由见本文 §0 仓库状态行)。
--- ---
+7 -7
View File
@@ -11,7 +11,7 @@
``` ```
docs/ docs/
├── README.md 本索引(阅读顺序 + 全量清单) ├── README.md 本索引(阅读顺序 + 全量清单)
├── 任务规划/ 统一待办(README 单一入口 + 2 个职责文件) ├── 任务规划/ 全项目顺序 + 硬件缺陷登记簿
├── 产品需求/ 产品需求设计文档(需求基线)+ 参考产品复刻明细(逐项差额) ├── 产品需求/ 产品需求设计文档(需求基线)+ 参考产品复刻明细(逐项差额)
├── 架构设计/ 全局架构与设计方法论(含 软件架构与运行时规格 / 硬件规格与能力边界:位表与引脚权威) ├── 架构设计/ 全局架构与设计方法论(含 软件架构与运行时规格 / 硬件规格与能力边界:位表与引脚权威)
├── 子系统设计/ 各功能子系统的设计说明 ├── 子系统设计/ 各功能子系统的设计说明
@@ -31,7 +31,7 @@ docs/
``` ```
> ⚠️ `docs/芯片手册/`(约 120 MB / 1754 张图)为**只读外部输入资料**,与代码演进无关; > ⚠️ `docs/芯片手册/`(约 120 MB / 1754 张图)为**只读外部输入资料**,与代码演进无关;
> 后续拆分独立仓库或降采样(登记簿条目「仓库体积膨胀观察」,已决策暂不处理)。 > 后续拆分独立仓库或降采样(仓库膨胀观察项,已决策暂不处理)。
--- ---
@@ -54,7 +54,7 @@ docs/
- **应用/驱动开发** → §4 架构设计 → §5 子系统设计 → §7 问题记录(**改驱动前必读对应 Trap Records**) - **应用/驱动开发** → §4 架构设计 → §5 子系统设计 → §7 问题记录(**改驱动前必读对应 Trap Records**)
- **测试/验证** → §6 测试说明 → §9.2 环境与部署 - **测试/验证** → §6 测试说明 → §9.2 环境与部署
- **UI 开发** → §8 UI 设计 → §6 测试说明(串口助手、UI 自动化测试流程) - **UI 开发** → §8 UI 设计 → §6 测试说明(串口助手、UI 自动化测试流程)
- **接手/评审** → §9.1 评审报告 → §9.3 任务规划(统一待办登记簿,见 `任务规划/README.md`) - **接手/评审** → §9.1 评审报告 → §9.3 任务规划(全项目顺序,见 `任务规划/README.md`)
--- ---
@@ -207,7 +207,7 @@ docs/
| [`RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) | **内存主文档**:占用分析、优化方案、定栈规则 | | [`RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) | **内存主文档**:占用分析、优化方案、定栈规则 |
| [`内存内容分配策略.md`](内存管理/内存内容分配策略.md) | 各内存区(SRAM/CCM)的分配策略 | | [`内存内容分配策略.md`](内存管理/内存内容分配策略.md) | 各内存区(SRAM/CCM)的分配策略 |
| [`存储栈RAM优化调研.md`](内存管理/存储栈RAM优化调研.md) | 存储栈 RAM 优化调研与结论 | | [`存储栈RAM优化调研.md`](内存管理/存储栈RAM优化调研.md) | 存储栈 RAM 优化调研与结论 |
| [`RAM预算台账.md`](内存管理/RAM预算台账.md) | **预算台账**:子系统配额、CCM 分配、趋势基线与 92% 门禁(登记簿条目「缩堆迁 CCM 后半(暂缓)」,2026-10-12) | | [`RAM预算台账.md`](内存管理/RAM预算台账.md) | **预算台账**:子系统配额、CCM 分配、趋势基线与 92% 门禁(内存治理三件套,2026-10-12) |
| `data/` | `ram_report_*.md` / `stack_report_*.md` 快照数据(由 `scripts/` 生成) | | `data/` | `ram_report_*.md` / `stack_report_*.md` 快照数据(由 `scripts/` 生成) |
### 7.3 问题记录(**改驱动前必读**) ### 7.3 问题记录(**改驱动前必读**)
@@ -247,7 +247,7 @@ docs/
> 体系层评审报告《项目审查与优化建议报告》(原在 `问题记录/`)已于 **2026-10-25 删除**—— > 体系层评审报告《项目审查与优化建议报告》(原在 `问题记录/`)已于 **2026-10-25 删除**——
> 大部分内容已闭环,留着的只有历史快照与重复清单。结论的去处: > 大部分内容已闭环,留着的只有历史快照与重复清单。结论的去处:
> 未闭环项 → [`任务规划/登记簿.md`](任务规划/登记簿.md);内存与 Flash 结论(含整簇暂缓的**重开条件**) > 未闭环的设计约束 → 各模块文档「已知限制/重开条件」节;内存与 Flash 结论(含整簇暂缓的**重开条件**)
> → [`内存管理/RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) §2.5 / §2.6.4 / §4; > → [`内存管理/RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) §2.5 / §2.6.4 / §4;
> UI 侧硬约束 → [`UI设计/UI_设计架构.md`](UI设计/UI_设计架构.md) §1.4; > UI 侧硬约束 → [`UI设计/UI_设计架构.md`](UI设计/UI_设计架构.md) §1.4;
> 六个自有编号族(属主文档已删的那批)→ `scripts/archive/id_gate/编号治理历史.md` §4.5(只能删号留事实,别再引用那些号)。 > 六个自有编号族(属主文档已删的那批)→ `scripts/archive/id_gate/编号治理历史.md` §4.5(只能删号留事实,别再引用那些号)。
@@ -263,7 +263,7 @@ docs/
| 位置 | 内容 | | 位置 | 内容 |
|---|---| |---|---|
| [`任务规划/`](任务规划/README.md) | **统一待办入口(3 个文件)**:`README.md` = 现在做什么与全项目顺序;`登记簿.md` = 全部待办、外部窗口与长期观察(UI 补齐已于 2026-11-06 整体销项,页面口径归 `docs/UI设计/内容页架构.md` §7.1 与 `菜单页面设计.md` §3.9,原执行清单文件已删除;采集数据可信度的设计口径与台阶图归 `docs/硬件平台/ADC通道映射说明.md` §9 与 `docs/算法/采集与算法层设计说明.md` §13);`暂缓-RS485.md` = 暂缓专项(`测试与架构专项.md` 已删除 2026-10-28,未闭环约束并入 `暂缓-RS485.md`;`屏板链路.md` 已完成,转为 `子系统设计/屏板链路设计说明.md` 后删除)。完成即删,重复内容只保留一个归属 | | [`任务规划/`](任务规划/README.md) | **两个文件**:`README.md` = 全项目推进顺序(唯一权威);`登记簿.md` = V0.1 硬件缺陷 → V0.2 改版要求。其余待办跟着所属模块走(各文档「已知限制 / 重开条件」节):采集数据可信度 → `docs/算法/采集与算法层设计说明.md` §13、台阶图 → `docs/硬件平台/ADC通道映射说明.md` §9、RS-485 → `docs/产品需求/产品需求设计文档.md` §5.10 |
| `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1);**[`ADC通道映射说明.md`](硬件平台/ADC通道映射说明.md)——V0.1 十七路 ADC 语义/网名/通道号权威映射表(固件取数、UI 显示、自检注入以此为准),含 §7 链路四段口径、§8 注入实测记录与 §9 数据可信五级台阶/波次退出判据** | | `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1);**[`ADC通道映射说明.md`](硬件平台/ADC通道映射说明.md)——V0.1 十七路 ADC 语义/网名/通道号权威映射表(固件取数、UI 显示、自检注入以此为准),含 §7 链路四段口径、§8 注入实测记录与 §9 数据可信五级台阶/波次退出判据** |
| `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) | | `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) |
| `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) | | `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) |
@@ -298,4 +298,4 @@ docs/
| ~~缺一致性门禁~~ | — | ✅ 已落地(2026-09-25/26,文档门禁三档齐):`scripts/check_doc_links.py`(存在性)+ `scripts/gen_task_table.py`(数值)+ `scripts/check_mem_numbers.py`(体积),接入 pre-commit `doc-links` / `task-table` / `mem-numbers` 钩子 | | ~~缺一致性门禁~~ | — | ✅ 已落地(2026-09-25/26,文档门禁三档齐):`scripts/check_doc_links.py`(存在性)+ `scripts/gen_task_table.py`(数值)+ `scripts/check_mem_numbers.py`(体积),接入 pre-commit `doc-links` / `task-table` / `mem-numbers` 钩子 |
| ~~`docs/文档规范.md` 未创建~~ | — | ✅ 已创建(2026-09-25):[`文档规范.md`](文档规范.md) | | ~~`docs/文档规范.md` 未创建~~ | — | ✅ 已创建(2026-09-25):[`文档规范.md`](文档规范.md) |
> 未闭环的文档类问题**只剩仓库膨胀**(登记簿条目「仓库体积膨胀观察」,已决策暂不处理)。 > 未闭环的文档类问题**只剩仓库膨胀**(仓库膨胀观察项,已决策暂不处理)。
+1 -2
View File
@@ -276,8 +276,7 @@ ENTER/→ 进子框:
- **处置(本票 = 心跳面)**:`ui_net_sink_set_beat_cb()` 回调注入——sink 在每次 - **处置(本票 = 心跳面)**:`ui_net_sink_set_beat_cb()` 回调注入——sink 在每次
accept / recv_nb / send / close / 重建三件套的**返回处**调用钩子,uiTask 注册 accept / recv_nb / send / close / 重建三件套的**返回处**调用钩子,uiTask 注册
`task_wd_beat(TASK_WD_UI)`。效果 = 心跳间隔从「整轮往返之和」收敛到「单个往返」; `task_wd_beat(TASK_WD_UI)`。效果 = 心跳间隔从「整轮往返之和」收敛到「单个往返」;
只要每次往返都会回来,UI 就不该被记停摆。往返本身**不改**(有界化/请求序号 = 只要每次往返都会回来,UI 就不该被记停摆。往返本身**不改**(有界化/请求序号 = 已闭环的 net 层跨上下文收口项;§11.6 否决过的
`docs/任务规划/README.md` 的跨上下文收口条目,批 3;§11.6 否决过的
「给 net_* 裸加超时」不重演)。 「给 net_* 裸加超时」不重演)。
- **分层**:Drivers/BSP 不得 include App 头(layer-deps),故心跳经回调注入而非直调; - **分层**:Drivers/BSP 不得 include App 头(layer-deps),故心跳经回调注入而非直调;
钩子内只做置位类动作、不阻塞(契约写在 `Drivers/BSP/UI/ui_net_sink.h`)。 钩子内只做置位类动作、不阻塞(契约写在 `Drivers/BSP/UI/ui_net_sink.h`)。
+1 -1
View File
@@ -432,7 +432,7 @@ python tools/menu_gen/gen_menu.py
### 3.9 节点数与已绑叶数口径(复核命令) ### 3.9 节点数与已绑叶数口径(复核命令)
改菜单树前先能自己数清四个数,别凭印象:**当前 43 节点行 / 34 叶 / 已绑 31 叶 / 未绑 3 叶**(未绑 = 遥信类型、遥信防抖、双点遥信,V0.1 无开入硬件,重开条件见 `docs/任务规划/登记簿.md` §8)。 改菜单树前先能自己数清四个数,别凭印象:**当前 43 节点行 / 34 叶 / 已绑 31 叶 / 未绑 3 叶**(未绑 = 遥信类型、遥信防抖、双点遥信,V0.1 无开入硬件,重开条件 = 开入开出独立立项,见 `docs/架构设计/硬件规格与能力边界.md` H3)。
1. **节点行** = `ui_menu_tree.txt` 里非空、非 `#` 开头的行(含根「主界面」)。 1. **节点行** = `ui_menu_tree.txt` 里非空、非 `#` 开头的行(含根「主界面」)。
2. **叶** = 其后不再出现更深缩进的后继行(缩进即层级,每级 2 空格);等价于生成物 `ui_menu_tab_has_children(node) == false`。菜单节点 = 有更深缩进后继者。 2. **叶** = 其后不再出现更深缩进的后继行(缩进即层级,每级 2 空格);等价于生成物 `ui_menu_tab_has_children(node) == false`。菜单节点 = 有更深缩进后继者。
+2 -2
View File
@@ -3,7 +3,7 @@
> **定位**:盘清当时 42 节点菜单里**还没有内容页的 27 个叶子**(节点数现值 43 = 9 菜单 + 34 叶, > **定位**:盘清当时 42 节点菜单里**还没有内容页的 27 个叶子**(节点数现值 43 = 9 菜单 + 34 叶,
> 2026-10-29 录波道加「录波回放」叶后升级;本文其余数字是 2026-10-23 立项快照,按 §1 的「完成即冻结」不回改),按"数据是否就绪 + 页面形态"归并成可施工的包,给出分批顺序与每页规格。 > 2026-10-29 录波道加「录波回放」叶后升级;本文其余数字是 2026-10-23 立项快照,按 §1 的「完成即冻结」不回改),按"数据是否就绪 + 页面形态"归并成可施工的包,给出分批顺序与每页规格。
> **前置阅读**:`docs/UI设计/内容页架构.md`(框架机制与新增页面六步)、`docs/UI设计/菜单页面设计.md`(菜单树与几何)、`docs/UI设计/UI_自动化测试流程.md`(像素回归门禁)。 > **前置阅读**:`docs/UI设计/内容页架构.md`(框架机制与新增页面六步)、`docs/UI设计/菜单页面设计.md`(菜单树与几何)、`docs/UI设计/UI_自动化测试流程.md`(像素回归门禁)。
> **不重复登记**:页面级待办落地时按语义标识进 `docs/任务规划/登记簿.md`;本文只出规划与规格。 > **不重复登记**:页面级规格写进本文与 `docs/UI设计/内容页架构.md`;顺序归 `docs/任务规划/README.md` §2。
> **逐页细化**:每页显示哪些行、数据从哪来、要改哪些代码,见 `docs/UI设计/页面扩充详细方案.md`(本文的落地细化版)。 > **逐页细化**:每页显示哪些行、数据从哪来、要改哪些代码,见 `docs/UI设计/页面扩充详细方案.md`(本文的落地细化版)。
--- ---
@@ -92,7 +92,7 @@
**统计(2026-10-25 复核)**:本表 27 叶中 **6 叶已落地**(遥信量 / 查看 4 页 / SOE),剩 21 叶 = 数据现成 **8** 项(整定 4 + 时钟 + 复归 + 死区 + 系数)· 需新数据层 **2** 项(清除记录 / 通讯设置)· 数据源不存在 **11** 项(遥信 3 + 手动录波 + SNTP + 记录 5 + 运行报告)。**逐页形态与数据源只看本表,排期不进本文**——当时的执行清单文件已于 2026-11-09 随 UI 补齐整体销项删除,页面口径现归 `docs/UI设计/内容页架构.md` §7.1。 **统计(2026-10-25 复核)**:本表 27 叶中 **6 叶已落地**(遥信量 / 查看 4 页 / SOE),剩 21 叶 = 数据现成 **8** 项(整定 4 + 时钟 + 复归 + 死区 + 系数)· 需新数据层 **2** 项(清除记录 / 通讯设置)· 数据源不存在 **11** 项(遥信 3 + 手动录波 + SNTP + 记录 5 + 运行报告)。**逐页形态与数据源只看本表,排期不进本文**——当时的执行清单文件已于 2026-11-09 随 UI 补齐整体销项删除,页面口径现归 `docs/UI设计/内容页架构.md` §7.1。
**2026-10-28 复核**:本表 27 叶中 **22 叶已落地**(本批 +6:记录 5 页与运行报告,见 `docs/任务规划/登记簿.md` §7);未落地的 5 叶 = 遥信类型 / 遥信防抖 / 双点遥信(无开入硬件)+ 手动录波(无录波模块)+ SNTP设置(产品口径未定),取舍与重开条件见 `docs/任务规划/登记簿.md` §8。口径闭合:本表 22 叶 + 立项前就已绑定、不在本表内的 6 叶(装置信息 / 交流量 / 直流量 / 网口设置 / 自检记录 / 运行记录)= 现值已绑 28 叶(= UI_PAGE_MAP_COUNT);本表未落地 5 叶 = 菜单树未绑 5 叶(33 − 28)。复核方法:按缩进判叶子(有更深缩进后继者即非叶子),再按行内 #page= 数已绑(完整命令见 `docs/UI设计/菜单页面设计.md` §3.9)。**2026-10-29 补充**:「手动录波」已随故障录波独立立项(docs/子系统设计/故障录波设计说明.md;原卡片登记簿 2026-10-30 销项并入该文 §10),上面那行数字仍是 2026-10-28 当日复核值,未随立项改动。 **2026-10-28 复核**:本表 27 叶中 **22 叶已落地**(本批 +6:记录 5 页与运行报告);未落地的 5 叶 = 遥信类型 / 遥信防抖 / 双点遥信(无开入硬件)+ 手动录波(无录波模块)+ SNTP设置(产品口径未定),重开条件见 `docs/架构设计/硬件规格与能力边界.md` H3 与各模块文档。口径闭合:本表 22 叶 + 立项前就已绑定、不在本表内的 6 叶(装置信息 / 交流量 / 直流量 / 网口设置 / 自检记录 / 运行记录)= 现值已绑 28 叶(= UI_PAGE_MAP_COUNT);本表未落地 5 叶 = 菜单树未绑 5 叶(33 − 28)。复核方法:按缩进判叶子(有更深缩进后继者即非叶子),再按行内 #page= 数已绑(完整命令见 `docs/UI设计/菜单页面设计.md` §3.9)。**2026-10-29 补充**:「手动录波」已随故障录波独立立项(docs/子系统设计/故障录波设计说明.md;原卡片登记簿 2026-10-30 销项并入该文 §10),上面那行数字仍是 2026-10-28 当日复核值,未随立项改动。
**2026-10-29 二补(录波 UI 道落地)**:本表「手动录波」转已落地(23 叶);菜单树另新增「录波回放」叶(node 43,不在本表立项快照内)——现值 43 节点 / 34 叶 / 已绑 30 / 未绑 4(= 遥信 3 + SNTP 1,UI_PAGE_MAP_COUNT = 30),口径复核方法与上一段相同 **2026-10-29 二补(录波 UI 道落地)**:本表「手动录波」转已落地(23 叶);菜单树另新增「录波回放」叶(node 43,不在本表立项快照内)——现值 43 节点 / 34 叶 / 已绑 30 / 未绑 4(= 遥信 3 + SNTP 1,UI_PAGE_MAP_COUNT = 30),口径复核方法与上一段相同
**2026-11-04 复核(板端 SNTP 接入立项,#57 调研结论)**:本表「SNTP设置」转已落地(24 叶)——`ui_page_sntp.c` 绑 `#page=sntp`,[sntp] 段经 `net_cfg_load` 注册、SNTP 客户端在 timeSyncTask 轮询(`App/sync/time_sntp.c`);现值 43 节点 / 34 叶 / 已绑 31 / 未绑 3(= 遥信 3,UI_PAGE_MAP_COUNT = 31),口径复核方法与上一段相同 **2026-11-04 复核(板端 SNTP 接入立项,#57 调研结论)**:本表「SNTP设置」转已落地(24 叶)——`ui_page_sntp.c` 绑 `#page=sntp`,[sntp] 段经 `net_cfg_load` 注册、SNTP 客户端在 timeSyncTask 轮询(`App/sync/time_sntp.c`);现值 43 节点 / 34 叶 / 已绑 31 / 未绑 3(= 遥信 3,UI_PAGE_MAP_COUNT = 31),口径复核方法与上一段相同
+16 -12
View File
@@ -34,7 +34,7 @@
- 运行时架构(分层/任务/就绪位/启动时序)→ [`../架构设计/软件架构与运行时规格.md`](../架构设计/软件架构与运行时规格.md); - 运行时架构(分层/任务/就绪位/启动时序)→ [`../架构设计/软件架构与运行时规格.md`](../架构设计/软件架构与运行时规格.md);
- 硬件规格与能力边界(引脚/硬件边界)→ [`../架构设计/硬件规格与能力边界.md`](../架构设计/硬件规格与能力边界.md); - 硬件规格与能力边界(引脚/硬件边界)→ [`../架构设计/硬件规格与能力边界.md`](../架构设计/硬件规格与能力边界.md);
- 参考产品能力基线与复刻逐项明细 → [`参考产品复刻明细.md`](参考产品复刻明细.md); - 参考产品能力基线与复刻逐项明细 → [`参考产品复刻明细.md`](参考产品复刻明细.md);
- 测试用例步骤 → `docs/测试说明/`;未闭环事项逐条跟踪 → [`docs/任务规划/README.md`](../任务规划/README.md)。 - 测试用例步骤 → `docs/测试说明/`;未闭环事项跟着所属模块走(各文档「已知限制 / 重开条件」节),全项目顺序 → [`docs/任务规划/README.md`](../任务规划/README.md)。
### 1.2 术语与缩写 ### 1.2 术语与缩写
@@ -474,9 +474,15 @@ flowchart LR
- **需求(已确认)**:半双工 RS-485 **对下 ModBus RTU 采集**(下行采集口;上行走以太网 104)。 - **需求(已确认)**:半双工 RS-485 **对下 ModBus RTU 采集**(下行采集口;上行走以太网 104)。
- **现状**:`rs485_init()` 已调用;`rs485_task.c` 为空桩、未在 `freertos.c` 创建;`App/protocol/` 为该 - **现状**:`rs485_init()` 已调用;`rs485_task.c` 为空桩、未在 `freertos.c` 创建;`App/protocol/` 为该
协议族预留(当前仅 104 在用)。**整簇冻结**(用户决定,2026-10-12)。 协议族预留(当前仅 104 在用)。**整簇冻结**(用户决定,2026-10-12)。
- **重启门禁**:先修「单缓冲包撕裂」「TX 超时拉 DE 未等 TC」两条,再谈接消费者;实现须满足 - **重启门禁**:先修「单缓冲包撕裂」「TX 超时拉 DE 未等 TC」两条,再谈接消费者。
双缓冲 + 序号、DE 收尾超时路径、协议解析与硬件 I/O 分离。 - **动手前必须落实的三条设计约束**(事后无法补测——撕裂与错误路径在真机上不可稳定复现。
- 详见 [`docs/任务规划/暂缓-RS485.md`](../任务规划/暂缓-RS485.md)。 本条收口原「测试与架构专项」2026-10-28 删除后唯一未闭环的约束):
① **协议解析与硬件 I/O 分离**——解析函数只吃 `(const uint8_t *buf, size_t len)` 并返回结果,
从而可被主机侧纯逻辑单测覆盖(参考 `cfg_file` 的"核心 + 后端"模式);
② **采集缓冲双缓冲 + 序号**——撕裂是时序相关的,单测里测不出来,只能在设计上消除;
③ **DE 收尾必须有超时路径覆盖**(RS-485 半双工特有陷阱)。
**完成判据**:RS-485 设计文档体现上述三条,协议解析函数有对应的主机侧单测。
ADC 侧不需要再做——它没有协议解析面,同一时刻性由 `tpafe5160_snapshot()` 原子快照保证。
### 5.11 遥测与相量(FR-MEAS)✅ ### 5.11 遥测与相量(FR-MEAS)✅
@@ -1386,7 +1392,7 @@ mac=00:00:00:00:00:00
> 同期(13)、看门狗(63)、遥测越限(10)等整单元(复刻明细 §1)。 > 同期(13)、看门狗(63)、遥测越限(10)等整单元(复刻明细 §1)。
**链路参数**:k=12 / w=8 / t1=15 s / t2=10 s / t3=20 s;IOA 3 字节、公共地址 2 字节、传送原因 2 字节; **链路参数**:k=12 / w=8 / t1=15 s / t2=10 s / t3=20 s;IOA 3 字节、公共地址 2 字节、传送原因 2 字节;
公共地址与端口可配(`[comm]` 段,工厂默认 1 / 2404)。**生效语义**(用户裁定 2026-10-30):两者都按「保存即生效」要求;现实现 = 公共地址改后重启、端口下次重 bind 才生效,差距已登记 `docs/任务规划/登记簿.md` §1「104 端口改后立刻重 bind」。 公共地址与端口可配(`[comm]` 段,工厂默认 1 / 2404)。**生效语义**(用户裁定 2026-10-30):两者都按「保存即生效」要求;现实现 = 公共地址改后重启、端口下次重 bind 才生效;差距的代码语义与重 bind 时机见 `docs/子系统设计/IEC104上行设计说明.md` §8。
--- ---
@@ -1551,8 +1557,7 @@ pre-commit run --all-files
**规模**:菜单节点 **9** 个(含根)+ 叶子节点 **34** 个 = **43** 节点;最大深度 **4 级(主界面 / 一级 / 二级 / 三级菜单)**。 **规模**:菜单节点 **9** 个(含根)+ 叶子节点 **34** 个 = **43** 节点;最大深度 **4 级(主界面 / 一级 / 二级 / 三级菜单)**。
**绑定现状**(2026-11-04 复扫):**已绑内容页 31 叶 / 未绑 3 叶**(页面注册表 `UI_PAGE_MAP_COUNT` = 31, **绑定现状**(2026-11-04 复扫):**已绑内容页 31 叶 / 未绑 3 叶**(页面注册表 `UI_PAGE_MAP_COUNT` = 31,
与已绑叶数一致);未绑 3 叶 = 无开入硬件 3(取舍与重开条件见 与已绑叶数一致);未绑 3 叶 = 无开入硬件 3(重开条件见 `docs/架构设计/硬件规格与能力边界.md` H3);原「当前执行 6 项」(记录 5 页 + 运行报告)已于 2026-10-28 落地绑页,
`docs/任务规划/登记簿.md` §8「开入开出与遥信配置 3 页」);原「当前执行 6 项」(记录 5 页 + 运行报告)已于 2026-10-28 落地绑页,
「手动录波」与「录波回放」两叶于 2026-10-29 随录波道绑页(判据见 docs/子系统设计/故障录波设计说明.md §4.1 与 §8.1), 「手动录波」与「录波回放」两叶于 2026-10-29 随录波道绑页(判据见 docs/子系统设计/故障录波设计说明.md §4.1 与 §8.1),
「SNTP 设置」叶于 2026-11-04 随 SNTP 客户端立项绑页(判据见 §5.3 FR-TIME-3 与 docs/网络/BSD_Socket_API_使用指南.md §6.1)。 「SNTP 设置」叶于 2026-11-04 随 SNTP 客户端立项绑页(判据见 §5.3 FR-TIME-3 与 docs/网络/BSD_Socket_API_使用指南.md §6.1)。
@@ -1676,7 +1681,7 @@ pre-commit run --all-files
| **多规约栈** | 17 | 12 种 | 1 种(104) | +11 种(101 / 102 / 103 / CDT / ModBus / Whm_GB / 61850 / CAN + 子站侧 3 类) | | **多规约栈** | 17 | 12 种 | 1 种(104) | +11 种(101 / 102 / 103 / CDT / ModBus / Whm_GB / 61850 / CAN + 子站侧 3 类) |
| **国密算法** | 18 | `Comm/Ecc/` 全套 | 0 | SM2 / SM3 / ECDSA | | **国密算法** | 18 | `Comm/Ecc/` 全套 | 0 | SM2 / SM3 / ECDSA |
| **软压板铺开** | 11 | 9 面(表容量 32) | 1 面 | +8 面 | | **软压板铺开** | 11 | 9 面(表容量 32) | 1 面 | +8 面 |
| **SNTP 对时** | 17 | 参考对时走 SNTP | **SNTP 客户端已落地**(2026-11-04:coreSNTP 序列化器 + `[sntp]` 配置 + UI 设置页 + timeSyncTask 接入,判据 §5.3 FR-TIME-3);另有 104 `C_CS`(私有 TCP 8888 已随 #78 退役删除) | 台架真机对时判据(现场时间源,docs/任务规划/登记簿.md) | | **SNTP 对时** | 17 | 参考对时走 SNTP | **SNTP 客户端已落地**(2026-11-04:coreSNTP 序列化器 + `[sntp]` 配置 + UI 设置页 + timeSyncTask 接入,判据 §5.3 FR-TIME-3);另有 104 `C_CS`(私有 TCP 8888 已随 #78 退役删除) | 台架真机对时判据(现场时间源,见 `docs/子系统设计/系统墙钟时间维护说明.md` §16) |
| **固有参数** | 1 | `8001H~800AH` 字符串类参数 | 未实现(无法短浮点上送) | 随送检点表设计 | | **固有参数** | 1 | `8001H~800AH` 字符串类参数 | 未实现(无法短浮点上送) | 随送检点表设计 |
| **遥测增强** | 4、5 | k=1~9 谐波方和根 + 4 点平均 | 仅基波轨 | 谐波 / 等周波调频 / 零序自产外接切换 三条算法轨 | | **遥测增强** | 4、5 | k=1~9 谐波方和根 + 4 点平均 | 仅基波轨 | 谐波 / 等周波调频 / 零序自产外接切换 三条算法轨 |
| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | **串口通道已交付**(4208 B 应答 / 状态灯掩码 / 键上行 / 双出口并发,屏板链路设计说明 §9.1);7003 四命令(INIT **8 B**);无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 7003 报文口径 6 项(`参考产品复刻明细.md` §11 第 2~9 条);串口侧验收尾巴见屏板链路设计说明 §9.2 | | **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | **串口通道已交付**(4208 B 应答 / 状态灯掩码 / 键上行 / 双出口并发,屏板链路设计说明 §9.1);7003 四命令(INIT **8 B**);无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 7003 报文口径 6 项(`参考产品复刻明细.md` §11 第 2~9 条);串口侧验收尾巴见屏板链路设计说明 §9.2 |
@@ -1684,8 +1689,7 @@ pre-commit run --all-files
> **一句话**:**「标定闭锁」是唯一"再排期也没用"的缺口**(等标准源);「出口与开入」「三相与同期」 > **一句话**:**「标定闭锁」是唯一"再排期也没用"的缺口**(等标准源);「出口与开入」「三相与同期」
> 「电度计量」等 V0.2 硬件;「对下采集」等用户决策;其余规模型条目**全部可在现有硬件上推进**, > 「电度计量」等 V0.2 硬件;「对下采集」等用户决策;其余规模型条目**全部可在现有硬件上推进**,
> 只取决于排期。 > 只取决于排期。
> 这张表与 [`docs/任务规划/登记簿.md`](../任务规划/登记簿.md) 一一对应;状态只在登记簿维护, > 状态只在本节维护,别处不另建一份同表。
> 本节不另建状态。
### 9.2 推进顺序 ### 9.2 推进顺序
@@ -1694,7 +1698,7 @@ pre-commit run --all-files
| 顺序 | 工作 | 类别 | 当前状态 | 开始条件 | | 顺序 | 工作 | 类别 | 当前状态 | 开始条件 |
|---|---|---|---|---| |---|---|---|---|---|
| 1 | UI 补齐(记录 5 页 → 运行报告) | 规模型 | **✅ 2026-10-28 落地并绑页;2026-11-06 台架判据复核完成,整体销项** | 六页已落地;余 3 叶属不做项(遥信 3,无开入硬件),重开条件见 `docs/任务规划/登记簿.md` §8 | | 1 | UI 补齐(记录 5 页 → 运行报告) | 规模型 | **✅ 2026-10-28 落地并绑页;2026-11-06 台架判据复核完成,整体销项** | 六页已落地;余 3 叶属不做项(遥信 3,无开入硬件),重开条件见 `docs/架构设计/硬件规格与能力边界.md` H3 |
| 2 | net 层跨上下文收口 | 平台 | **下一顺位(未开工)** | UI 清单已清空,切换条件已满足;**开工待用户点头** | | 2 | net 层跨上下文收口 | 平台 | **下一顺位(未开工)** | UI 清单已清空,切换条件已满足;**开工待用户点头** |
| 3 | 其余结构与可靠性评估 | 平台 | 排队 | net 收口后 | | 3 | 其余结构与可靠性评估 | 平台 | 排队 | net 收口后 |
| 4 | 端子/子板变比确认 → 两点标定 | 阻塞型 | 等外部资源 | 子板实物/原理图、标准源到位可插入 | | 4 | 端子/子板变比确认 → 两点标定 | 阻塞型 | 等外部资源 | 子板实物/原理图、标准源到位可插入 |
@@ -1823,7 +1827,7 @@ pre-commit run --all-files
| 条目命名与编号规则 | [`docs/文档规范.md`](../../docs/文档规范.md) §7.1 | | 条目命名与编号规则 | [`docs/文档规范.md`](../../docs/文档规范.md) §7.1 |
| 部署环境 | [`docs/环境与部署/项目部署环境要求.md`](../../docs/环境与部署/项目部署环境要求.md) | | 部署环境 | [`docs/环境与部署/项目部署环境要求.md`](../../docs/环境与部署/项目部署环境要求.md) |
| 硬件网表 | [`docs/硬件平台/V0.1_网表详细分析报告.md`](../../docs/硬件平台/V0.1_网表详细分析报告.md) | | 硬件网表 | [`docs/硬件平台/V0.1_网表详细分析报告.md`](../../docs/硬件平台/V0.1_网表详细分析报告.md) |
| 待办登记簿 | [`docs/任务规划/README.md`](../任务规划/README.md) | | 待办与推进顺序 | [`docs/任务规划/README.md`](../任务规划/README.md) |
| 实机测试指南 | [`docs/测试说明/板级测试/实机测试实施指南.md`](../测试说明/板级测试/实机测试实施指南.md) | | 实机测试指南 | [`docs/测试说明/板级测试/实机测试实施指南.md`](../测试说明/板级测试/实机测试实施指南.md) |
| 测试标准流程 | [`docs/测试说明/流程与规范/测试开发标准流程.md`](../测试说明/流程与规范/测试开发标准流程.md) | | 测试标准流程 | [`docs/测试说明/流程与规范/测试开发标准流程.md`](../测试说明/流程与规范/测试开发标准流程.md) |
| RAM 预算与优化 | [`docs/内存管理/RAM使用分析与优化方案.md`](../../docs/内存管理/RAM使用分析与优化方案.md) | | RAM 预算与优化 | [`docs/内存管理/RAM使用分析与优化方案.md`](../../docs/内存管理/RAM使用分析与优化方案.md) |
@@ -164,7 +164,7 @@ tTimer_NoUI 无压无流判据(CN_
|---|---|---| |---|---|---|
| **外部资源**(标准源、端子变比) | 定值标定、保护判据解卡 | 两点标定(需求档 §9.2 第 4 步) | | **外部资源**(标准源、端子变比) | 定值标定、保护判据解卡 | 两点标定(需求档 §9.2 第 4 步) |
| **硬件缺失**(X3 / X4) | 开入 138、开出 31、电度 8、同期、三相通道 | V0.2 硬件 | | **硬件缺失**(X3 / X4) | 开入 138、开出 31、电度 8、同期、三相通道 | V0.2 硬件 |
| **立项未排** | 多规约、SNTP、定值铺开 | 按需求档 §9.2 顺序。**录波最小闭环已交付代码面**(2026-10-29,设计与板级判据 `docs/子系统设计/故障录波设计说明.md` §10;原卡片登记簿 2026-10-30 销项并入后删除;1 kHz 起步与本文 80 点/周波口径的偏离在该设计文档 §2 显式登记);**4 kHz 全速、多段、COMTRADE、104 文件传输仍未排**,属二期范围 | | **立项未排** | 多规约、SNTP、定值铺开 | 按需求档 §9.2 顺序。**录波最小闭环已交付代码面**(2026-10-29,设计与板级判据 `docs/子系统设计/故障录波设计说明.md` §10;原卡片 2026-10-30 销项并入后删除;1 kHz 起步与本文 80 点/周波口径的偏离在该设计文档 §2 显式登记);**4 kHz 全速、多段、COMTRADE、104 文件传输仍未排**,属二期范围 |
| **算力 / 形态**(X1 / X2) | 双核分工、VxWorks | 不解除。**屏板链路已从范围外项移入范围内**(规格见需求档 §5.16,主机侧实现 `docs/子系统设计/屏板链路设计说明.md`;串口通道已实现,网络通道未做):主机侧链路与参考 1:1 同构,不属"替代方案" | | **算力 / 形态**(X1 / X2) | 双核分工、VxWorks | 不解除。**屏板链路已从范围外项移入范围内**(规格见需求档 §5.16,主机侧实现 `docs/子系统设计/屏板链路设计说明.md`;串口通道已实现,网络通道未做):主机侧链路与参考 1:1 同构,不属"替代方案" |
> **结论**:本产品与参考产品的差距**全部是"进度"而非"范围"**——没有一项是"参考有而我们不做"。 > **结论**:本产品与参考产品的差距**全部是"进度"而非"范围"**——没有一项是"参考有而我们不做"。
+2 -2
View File
@@ -24,8 +24,8 @@ git commit
├─ cubemx-survival CubeMX 重生成存活审计(易失定制清单 + 基线漂移) ├─ cubemx-survival CubeMX 重生成存活审计(易失定制清单 + 基线漂移)
├─ watchdog-unit-test 看门狗判定状态机主机侧单测(主机侧纯逻辑单测) ├─ watchdog-unit-test 看门狗判定状态机主机侧单测(主机侧纯逻辑单测)
├─ test-suite-switch 测试套件开关=产品构建(防测试固件静默提交) ├─ test-suite-switch 测试套件开关=产品构建(防测试固件静默提交)
├─ registration-check 双端注册反向校验(uvprojx + CMakeLists,登记簿「rs485_task 白名单缺口」;含 UI 页面描述符表接线,「UI 字符集与像素回归门禁」) ├─ registration-check 双端注册反向校验(uvprojx + CMakeLists,`rs485_task` 白名单缺口;含 UI 页面描述符表接线,「UI 字符集与像素回归门禁」)
├─ mem-budget RAM 预算 92% 阈值门禁(登记簿条目「缩堆迁 CCM 后半(暂缓)」,2026-10-12) ├─ mem-budget RAM 预算 92% 阈值门禁(内存治理三件套,2026-10-12)
└─ font-charset UI 字符集差集检查(防缺字白框,「UI 字符集与像素回归门禁」,2026-10-15) └─ font-charset UI 字符集差集检查(防缺字白框,「UI 字符集与像素回归门禁」,2026-10-15)
└─ commit-msg(.git/hooks/commit-msg) └─ commit-msg(.git/hooks/commit-msg)
└─ gitlint 校验 commit message 格式 └─ gitlint 校验 commit message 格式
+35 -60
View File
@@ -1,93 +1,68 @@
# 任务规划 # 任务规划
> **UI 补齐已于 2026-10-28 清空并整体销项**(记录 5 页 + 运行报告页落地;范围与判据口径已并入 > 全项目**推进顺序的唯一权威**:只回答「现在做什么、接下来做什么、卡在哪一步」。
> `docs/UI设计/内容页架构.md` §7.1 与 `docs/UI设计/菜单页面设计.md` §3.9,原执行清单文件已删除)。 > 各任务的验收判据与设计口径归其所属模块文档,本文件不复制。
> 下一顺位 = net 层跨上下文收口,已闭环。
## 怎么用这份规划 ## 怎么用
| 你想知道什么 | 只看哪个文件 | | 你想知道什么 | 去哪看 |
|---|---| |---|---|
| 现在做什么、接下来做什么 | 本文件 | | 现在做什么、接下来做什么 | 本文件 §2 |
| UI 之后还有什么、哪些事在等条件 | `登记簿.md` | | 某件事在等什么条件 | 各模块文档的「已知限制 / 重开条件」节 |
| ADC 标定为什么没做、保护为什么不动作 | `登记簿.md` §7 + `../算法/采集与算法层设计说明.md` §13 | | ADC 标定为什么没做、保护为什么不动 | `docs/算法/采集与算法层设计说明.md` §13 |
| RS-485 为什么冻结、重启要满足什么 | `暂缓-RS485.md` | | RS-485 为什么冻结、重启要满足什么 | `docs/产品需求/产品需求设计文档.md` §5.10 |
**一件事只有一个归属。** 本文件只负责导航与顺序,不复制各任务的验收明细;
采集数据可信度的设计口径归 `docs/算法/采集与算法层设计说明.md` §13,待办归 `登记簿.md` §7。
--- ---
## 0. 条目与引用规则 ## 0. 条目与引用规则
- **新条目使用语义短语**,一行直接说清是什么事,不再新增字母加数字编号。 - **新条目用语义短语**:一行说清是什么事,不发字母加数字的编号;旧号不回收、不重新发号(规则见 `docs/文档规范.md` §7.1)。
- 旧编号只用于追溯历史,不复用、不重新发号;规则见 `docs/文档规范.md` §7.1。 - **引用条目写清归属**:所在文档 + 语义名,例如「端子变比确认」。只给一个短号让人猜不算引用。
- 引用条目时写清所在文档和语义名,例如:`docs/任务规划/登记簿.md` 的 - **状态只写在条目所属的模块文档**;本文件不另建一份状态表。
「net 层跨上下文收口」。不要只写一个短号让读者猜。
- 任务状态只维护在任务所属文件;本文件不另建一套状态表。
--- ---
## 1. UI 补齐(已整体销项) ## 1. 执行纪律:生成物单写者
菜单树现状:**43 节点行 / 34 叶 / 已绑 31 叶 / 未绑 3 叶**。未绑 3 叶 = 遥信类型、遥信防抖、双点遥信—— 菜单树(`ui_menu_tree.txt` → `ui_menu_tab.c/.h`)、页面注册表与中文字库都是**整文件生成物**:
V0.1 没有开入硬件,不做;重开条件见 `登记簿.md` §8「开入开出与遥信配置 3 页」。 同刻只允许一个任务写它们,不要开两条并行道;需要并行时让别的道等这条道收尾。
数法、复核命令与「43 是节点行数不是叶数」的口径 → `docs/UI设计/菜单页面设计.md` §3.9。
记录 5 页(事故 / 操作 / 保护告警 / 保护启动 / 遥控)与运行报告页已于 2026-10-28 落地并绑页; 生成方式、叶数口径与复核命令见 `docs/UI设计/菜单页面设计.md` §3.6、§3.9;
上板判据(真记录翻页、掉电保持、清除后归零、`boot_count` 自增、`RESTARTED`、`rst_cause=IWDG`、`conn_up` +1) 页面完成动作与三条硬规矩见 `docs/UI设计/内容页架构.md` §7、§7.1。
已于 2026-11-06 Issue #53 台架轮复核完成(「拔 RTC 电池落 RESTARTED」经用户裁定 2026-11-05 台架不可验)。
模拟器差距见 `docs/测试说明/专项验证/模拟器差距清单.md` §2.3「开机账本 boot_stats」一行。
页面的统一完成动作、三条硬规矩(不用演示数据 / 不做没效果的按钮 / 保护闭锁必须可见)与回归门禁
→ `docs/UI设计/内容页架构.md` §7、§7.1。
**执行纪律:单道串行。** 菜单树与页面注册表是生成物,字库也是整文件生成物;不要同时开多条 UI 分支。
--- ---
## 2. 全项目推进顺序 ## 2. 全项目推进顺序
> 本节是全项目唯一的顺序权威。模块文档只描述局部设计,不另排一套路线图。 > 本节是全项目唯一的顺序权威。模块文档只写局部设计与重开条件,不另排一套路线图。
> 写范围相交怎么排队、构建与台架怎么串行 → `docs/环境与部署/并行任务工作树方案.md` §7.3。
### 2.0 顺序表 ### 2.0 顺序表
| 顺序 | 工作 | 当前状态 | 开始或切换条件 | | 顺序 | 工作 | 当前状态 | 开始或切换条件 |
|---|---|---|---| |---|---|---|---|
| **1** | **UI 补齐** | **✅ 2026-10-28 清单清空;2026-11-06 台架判据复核完成,整体销项** | 记录 5 页与运行报告页已落地并绑页;余 3 叶属不做项(遥信 3,无开入硬件),重开条件见 `登记簿.md` §8。页面口径见 `docs/UI设计/内容页架构.md` §7.1 | | **1** | **端子 / 子板变比确认 → 两点标定** | 变比已按参数算定;标定未开工 | 缺标准源。开工前必须先拍板三件事(精度目标、变比来源、`eng=0` 期测频门处置),见 `docs/算法/采集与算法层设计说明.md` §13.13 |
| **2** | **net 层跨上下文收口** | **✅ 2026-11-06 闭环** | 子项 A(裸指针收口为状态查询 API):审计确认收口已完成(`net_listener` 单一登记入口 `net_listener_request` + 单一执行者 `net_listener_tick`、`s_relisten_req` 0 处模块外直接读写;UI 读侧快照 API `ui_data_info`/唯一填充者 `ui_data_feed`);子项 B(突发分片让路):台架重验确认新负载剖面(SNTP 请求/退避 + FTP + 104 + 7003)下 **uiTask ≥800 ms 饿死签名不复现**(`task stall` 0 条、复位 0、NAND `wdev.log` 当日零新增 STALL、7003 最差 759 ms <800 ms 线)——证据见 `网络自愈架构设计.md` 与 `看门狗设计说明.md` 变更记录 2026-11-06 条目 | | **2** | 标准源送检与第三方 104 主站验收 | 等待标定 | 两点标定完成且保护 `VALID` 已置位;送检窗口前 2 日冻结特性 |
| **3** | 其余结构与可靠性评估 | 排队 | net 收口后;逐项见 `登记簿.md`,观察项不为了“清清单”而强做 | | **3** | 定值 / 映射 / 遥测 / 软压板铺开 | 等排期 | 必须晚于标定,否则铺出去的全是 IV 点(两条不可颠倒的顺序见 `docs/产品需求/产品需求设计文档.md` §9.2) |
| **4** | 数据可信(采集数据可信度) | 动态波形验证 **✅ 2026-11-04 闭环(六轮)**;变比确认与两点标定等外部资源 | 信号发生器动态波形验证(不依赖外部资源,✅ 2026-11-04)→ 端子/子板变比确认 → 标准源两点标定;**排序调整(2026-10-29):动态验证让位给故障录波数据面**,段文件落地后判据升级为 PC 独立重算对表(docs/子系统设计/故障录波设计说明.md §11)(已知电压注入已于 2026-10-27 台架闭环并销项);外部资源到位可插入优先处理 | | **4** | 保护元件与采集增强 | 等待标准源或硬件改版 | 先解除未标定闭锁;跨转换器相位 / 功率 / 对称分量类功能等 V0.2 硬件(缺陷见 `docs/任务规划/登记簿.md` §1) |
| **5** | 标准源送检与第三方 104 主站验收 | 等待标定完成 | 两点标定完成且保护 VALID 已置位;送检窗口前 2 日冻结特性 | | **5** | 其余结构与可靠性评估 | 排队 | 观察项的归属是各模块文档的「已知限制」节,不为清清单强做 |
| **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 | | **6** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位即执行 |
| **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 | | **7** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项;RS-485 见 `docs/产品需求/产品需求设计文档.md` §5.10;内存优化按自身重开条件(`docs/内存管理/RAM使用分析与优化方案.md`) |
| **8** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项(SNTP 已单独立项并于 2026-11-04 落地 #73,:8888 随 #78 退役);RS-485 与内存优化按各自重启条件 | | **独立** | **故障录波**(1 kHz · 8 路原始码值 · 单通道回放) | 代码面已交付;板级判据(手动触发、回放页三态、开页重扫与判废留痕)已台架验收 | 判据、留痕名清单与执行顺序的属主 = `docs/子系统设计/故障录波设计说明.md` §9、§10。**还没跑的只剩**:保护触发(要等标定解锁决定)、bench 定时自抓与卷占用、`task_prof` 读路径耗时峰值。与 UI 道互斥,见 §1 |
| **独立** | **故障录波(1 kHz · 8 路原始码值 · 单通道回放)** | **代码面已交付;2026-10-31 远程半轮过六项、2026-11-02 回放页枚举缺陷已修复闭环、2026-11-04 注量对表闭环(#40 §8 交流轮)、2026-11-06 第二幕尾步坏段/空态画面台架远程轮拍毕——回放页三态板级判据全部实证、2026-11-07 #93 两条现场发现修复后台架验收 F1/F2 全过(PR #94);余保护触发(P,需标定解锁决定)、bench 定时自抓(T)与卷占用、`task_prof` 耗时峰值等到场/裁定项** | 用户裁定 2026-10-29 **录波先行**:数据面最小闭环 → 手动与保护启动触发 → 回放页。三块的**代码侧判据已收口**(主机单测 113 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器字节级互验、手动录波与录波回放两叶已绑页、内容页黄金参考扩至 66 张);**2026-10-31 远程半轮已过六项**(真 FAT 落盘、触发→落盘全部落在 2 s 封存超时窗内、冷却恢复、轮转、PC 侧坏段拒收、冻结窗内 104 并发);同轮发现的缺陷「回放页段表枚举恒空」**已于 2026-11-02 远程修复并板级闭环**(根因 = 读侧 `wave_store_seg_path()` 返回值判错,顺带修键处理缺失效;回放页真段/切段/切道已实测,登记簿条目已销项,证据见设计说明 §10「回放页枚举恒空缺陷修复记录」);**注量对表半轮已于 2026-11-04 由 #40 §8 交流轮闭环**(幅值 / 相位 / 削顶三项实测,`meas:` 行与板上读数逐项核对,104 浮点遥测按用户裁定不作对照证据;`docs/测试说明/测试数据/boot_log_data/20261104_ac_*`);**回放页放坏段与空态画面已于 2026-11-06 台架远程轮拍毕闭环**(同号翻位覆盖→「该段不可读」零波形元素绝不平线;全删→「无录波段」+ 串口 `open fail fr=4` 互证;证据 `docs/测试说明/测试数据/wave_shot_20261106/`,记录见设计说明 §10「回放页坏段/空态画面闭环记录」);**#93 回放页两条现场发现(开页后新段不进表 / CRC 判废串口静默)已于 2026-11-07 按推荐方案修复并台架远程验收 F1 五条 F2 五条全过**(F1 = `wave_enter` 钩子开页作废钉表 + 空态键重探,A+B 同批;F2 = 五类判废汇成单条 `ui wave head idx= reject= stored= calc=` ERROR 级不去重留痕,reject=5 与 PC `wave_read` 同值互证;PR #94,证据 `docs/测试说明/测试数据/wave_fix_20261107/`,记录见设计说明 §10 修复记录);**没跑的只剩** 保护触发(P)对时刻(先要标定解锁决定)/ bench 定时自抓(T)与卷占用(需 bench 构建)/ `task_prof` 读路径耗时峰值,全部结果与清单见 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」。**板级判据、留痕名清单与执行顺序图的属主 = docs/子系统设计/故障录波设计说明.md §9 与 §10**(原卡片登记簿 2026-10-30 随销项并入后删除);**与 UI 道互斥**(菜单树与中文字库是整文件生成物,同刻只允许一条道写)——本波按此串行执行:UI 道在数据面与接线冻结之后才动生成物 |
### 2.1 关键依赖 ### 2.1 关键依赖
- **UI**:写路径、整定 4 页、装置维护 3 页与遥测死区/系数 2 页已收口(含上板判据与真机回读); - **送检链不可颠倒**:变比确认 → 两点标定 → 保护解卡 → 送检。顺序反了保护表现为不动作,不许用非标准源走捷径(红线见 `docs/产品需求/产品需求设计文档.md` §9.2)。
菜单树、页面注册表与字库都是生成物,同刻只允许一条道写。 - **保护扩展**:标准源未到位前不新增无法验证的判据;跨转换器相位、功率、对称分量类功能等 V0.2 硬件。
- **送检**:已知电压注入(✅ 2026-10-27 闭环)→ 信号发生器动态波形验证(✅ 2026-11-04 闭环, - **观察项不抢道**:内存优化、仓库体积等观察项不抢占当前编码道。
六轮全过;未闭合项已裁定或另登记于 `登记簿.md` §7)→ 端子/子板变比确认 → 标准源两点标定 → 保护解除闭锁 → 送检。
- **保护扩展**:标准源未到位前不新增无法验证的判据;跨转换器相位、功率、对称分量类
功能必须等 V0.2 硬件。
- **结构债**:UI 完成后先做 net 收口;RS-485 白名单、内存优化、仓库体积等观察项不抢占
当前编码道。
--- ---
## 3. 维护约定 ## 3. 维护约定
1. **完成即删除待办条目**,同时清理其他文档对它的引用;结论和证据写入模块文档, 1. **完成即删条目**,同时清理其它文档对它的引用;结论与证据写进模块文档,历史交给 `git log`。
历史由 `git log` 保留。 2. **待办跟着所属模块走**:设计类待办写进模块文档的「已知限制 / 重开条件」一节;只有顺序变化才改本文件 §2。
2. **待办只改 `登记簿.md`**(新增、销项、改重启条件都在那一处);顺序变化才改本文件 §2。 3. **设计约束不放本目录**:采集数据可信度的口径归 `docs/算法/采集与算法层设计说明.md` §13。
3. **设计约束不放在本目录**:采集数据可信度的口径归 `../算法/采集与算法层设计说明.md` §13, 4. 任务分支不直接修改 `docs/任务规划/`;状态更新与销项由主工作树统一处理。
本目录的待办只认 `登记簿.md`(标识列用语义短语,卡片增减不改本条口径)。 5. 并行开发机制、工作树与锁的使用见 `docs/环境与部署/并行任务工作树方案.md`,本目录不另维护分道与批次方案。
4. 专项文档只放**还没闭环的约束**;已落地事项的规格正文归代码头注释或模块文档, 6. 暂缓不是完成:条目必须随身带重开条件;没有重开条件的「以后再说」应写成观察项或删掉。
销项即删文件并把引用改指现行出处(先例:`测试与架构专项.md` 已删除 2026-10-28,
唯一未闭环的「采集链路测试可验证性约束」并入 `暂缓-RS485.md`)。
5. 任务分支不直接修改 `docs/任务规划/**`;状态更新与销项由主工作树统一处理。
6. 并行开发机制、工作树和锁的使用见 `docs/环境与部署/并行任务工作树方案.md`。
本文件夹不再另维护一份分道、批次和写域方案。
7. 暂缓不是完成:条目必须保留重启条件;没有重启条件的“以后再说”应写成观察项或删除。
-32
View File
@@ -1,32 +0,0 @@
# 暂缓:RS-485 整簇(用户决定,2026-10-12)
> **当前没有处理 RS-485 的打算**,以下条目整体冻结、不占执行队列;**重启 RS-485 采集链路时先回本文件评估前置,勿直接开工**。
> 本文件**不是销项**:条目仍在簿,只是暂缓(`docs/任务规划/README.md` §3 维护约定)。
| 项 | 内容 | 重启时的前置 |
|---|---|---|
| **RS-485 采集链路** | **RS-485 采集链路实现**:双缓冲 + 序号(防包撕裂)+ DE 收尾(超时路径等 TC)+ ModBus RTU 状态机(`App/protocol/` 正是为此预留) | **RS-485 接线门禁尚未满足**:先修单缓冲包撕裂、TX 超时拉 DE 未等 TC 两条,修完才允许接消费者 |
| RS485 DE 收尾 | RS485 DE 收尾(原属结构债一档剩余,已移出) | 同上 |
| 采集链路测试可验证性约束 · RS485 侧 | 双缓冲 + 序号、DE 超时路径覆盖(约束正文 = 本文「采集链路测试可验证性约束」一节) | 随 RS-485 设计文档落地 |
| RS-485 方向控制硬件实测 | RS-485 PD0 DE 半双工方向语义硬件实测确认(本次仅静态审查) | 需硬件实测窗口 |
| 网络性能资源建议簇中 DE 项 | `HAL_Delay(1)` 阻塞 DE | 随 RS-485 采集链路 |
---
## 采集链路测试可验证性约束(RS-485 动手前必须落实)
> 原属 `docs/任务规划/测试与架构专项.md` §2.2(该文档已删除,2026-10-28)。ADC 侧随 ADC 采集链路闭环,
> **没落实的只剩 RS-485 侧**,所以约束正文收在本节——重启 RS-485 采集链路以这里为准,不要再另起一份。
本项**不是缺陷,是对上游 RS-485 采集链路的设计约束**:`rs485_task.c` 仍是空桩、`App/protocol/` 只有占位文件;动手前不落实
这三条,事后无法补测(撕裂与错误路径在真机上不可稳定复现)。
1. **协议解析必须与硬件 I/O 分离**:`App/protocol/` 的解析函数应接受 `(const uint8_t *buf, size_t len)` 并返回
解析结果,使其成为**主机侧纯逻辑单测的天然适格对象**(参考 `cfg_file` 的"核心 + 后端"模式);
2. **采集缓冲必须双缓冲 + 序号**:否则消费者读到撕裂数据,而**撕裂在单测里测不出来**(时序相关),
必须在设计上消除;
3. **DE 收尾必须有超时路径覆盖**(RS-485 半双工特有陷阱)。
**完成判据**:RS-485 设计文档体现上述三条;协议解析函数有对应的主机侧纯逻辑单测。
(ADC 侧不需要再做:它没有协议解析面,"同一时刻性"由 `tpafe5160_snapshot()` 原子快照保证,2026-10-10 随 ADC 采集链路
闭环 → `docs/硬件平台/ADC通道映射说明.md` §8 与 `App/algo/README.md`。)
+2 -93
View File
@@ -1,100 +1,9 @@
# 后续待办与长期观察登记簿 # 硬件缺陷登记簿
> **全部待办只在本文件。** 推进顺序只看 `docs/任务规划/README.md` §2;UI 补齐已于 2026-11-06 整体销项。
>
> 条目一律用语义短语标识;完成后删行并清理引用。§6~§9 是由原排期、送检、分道和
> 开放问题文件合并而来的唯一归属,不再在多处复制同一事项。
## 1. 网络(CH395F / net 层) ## 1. 硬件(V0.1 缺陷 → V0.2 改版项)
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| 队列往返基线待重验 | **队列往返基线(1223/988µs)在发送分块握手改造后的重验**——队列往返测 DONTWAIT 队列全程;发送分块握手对该路径逐位不变 → 机制上无影响,但基线数值属分片时代,严格重锁需跑一轮 Phase 13(需 PC peer) | 2026-09-22(发送分块握手收尾留档) | 低风险:10ms/100ms 阈值余量 >8×;下次 Phase 13 窗口顺带重锁即可 | `链路延迟测试说明.md` §6.4 队列往返行的注¹ |
| 网络负向场景台架验证 | **负向场景台架验证待办**(拔线断链 / 芯片级 `net_init` 失败分支 / 短写压测;正常路径已实测零回归):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**;② 芯片级 `net_init` 失败分支(需 SPI 故障注入);③ 短写压测(需远显客户端 + UI 推流压力) | 2026-10-03(台架拓扑 = CH395↔交换机,拔线操作受限) | 待专项台架窗口 | `实机测试实施指南.md` §10 |
| 104 端口改后立刻重 bind | **改了 `[comm]` 段 `port` 之后要求立刻重 bind**(不等拆链重建、不等网络代次重建)——用户裁定 2026-10-30:需求口径按「保存即生效」定,**代码语义是要改的一侧** | 现实现 = `App/task/iec104_serv.c` 的 `s_bind_listen` 每次现取 `iec104_comm_port()`,注释自陈「下次重 bind(拆链重建/网络代次重建)即生效」;连带隐性耦合:`.serialtest/config.json` 必检锚点写死 `i104: listening on 2404`,端口一改串口回归必假失败(要么锚点只查 `listening on`,要么由脚本把端口注入锚点) | 属固件行为变更,需真机验证;本笔只登记不动代码 | 用户裁定 2026-10-30;`docs/产品需求/产品需求设计文档.md` §通讯配置、`docs/测试说明/流程与规范/自动化测试流程.md` |
| relisten 沉降段原语化受阻 | **relisten 沉降段统一到驱动 `sock_reset` 原语受阻**——"去重复实现"的收口已实测回退:原语版 `ftp_abort_probe` RST **0/10**、FIN **0/5**(中止后首笔复连仍被截断到 ≤2048B),另新增 `sock_reset_sync timeout (600ms)` 与 `close: sock_reset not done` 两条 `[ERR]`;同场 net 层自建序列 **10/10 + 5/5** | 2026-10-14(同一块板 A/B,判据 `test/host/ftp_abort_probe.py`;快复连 50/50、背靠背 30/30 两版都过 → 失效面精确落在"中止后首笔复连") | **现状 = `net_listener.c` 保留自建排渣序列**(排空 + CLOSE + 排事件 + 等 CLOSED,30 ms 重试轮持续清)。重开前置三条语义:① 隔离窗内**持续**排空/关闭(残渣在 CLOSE 之后才落进 RX,一次排空接不住)② **复用让位**(复位机不得拆上层刚在同一芯片 Socket 上重建的监听)③ `net_sock_reset_sync` 改"已在运行 = 加入等待"(`begin` 返 -1 ≠ 失败) | `../网络/网络自愈架构设计.md` §8 延后项 1、§5.2 E16;`../问题记录/CH395F_Trap_Records.md` TRAP-NET-18 |
## 2. 存储 / 日志管线
| # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---|
| dhara 重试自旋残留 | **dhara 重试自旋残留**——`try_recover()` 的 `DHARA_MAX_RETRIES`(8) 自旋在坏块密集时仍可能长时间占用 defaultTask(喂狗点) | 2026-10-02;2026-11-05 复核未复发 | 低优先:现有 `vol_lock` + 喂狗节奏缓解,自旋另有 FTL 入口直接喂狗兜底(`../架构设计/STM32F4-Base存储架构说明.md` §10.5);若台架再出"存储侧喂狗饥饿"再排期 | `Lib/dhara/map.c` |
## 3. 硬件(V0.1 缺陷 → V0.2 改版项)
| # | 事项 | 发现 | 证据与现状 | 出处 | | # | 事项 | 发现 | 证据与现状 | 出处 |
|---|---|---|---|---| |---|---|---|---|---|
| 双转换器无共同采样触发 | **8 路电气量分属两片转换器(V0.1 硬件缺陷,需下一版硬件修改)**——UA/UN/IA 走 TPAFE5160(16 位、8 通道同步、±5 V 双极性),UB/UC/IB/IC/IN 走 STM32 ADC(12 位、顺序扫描、0~3.3 V 单极性):① 两片转换器无共同采样触发 + STM32 侧顺序扫描(9 通道一轮 ≈ 67 µs)→ 跨转换器通道**无同一时刻性、相位关系不确定**,主板侧功率/功率因数/相角/对称分量类运算不成立;② 同族电气量精度与量程不一致(LSB ≈ 152.6 µV vs ≈ 806 µV,且 STM32 侧前端无中点偏置、负半周削顶);③ 语义与硬件归属交叉,固件映射/UI 通道序/自检注入须逐通道查表绕开 | 2026-10-10 定性更正(**撤销** 2026-10-09 建档时"有意分配、不要修正"的说法) | **V0.2 改版要求**:8 路电气量 UA/UB/UC/UN/IA/IB/IC/IN **全部接 TPAFE5160**,与 TPAFE 上 5 路备用路(AIN5/13/7/15/12)对调串联电阻在转换器一侧的目的地——元件数量与料号不变,属走线级改动。**V0.1 现板软件口径**:主板侧只做逐通道独立监视,禁止跨转换器做相位/功率/功率因数/矢量类运算(此类量取子板计量模块结果)。固件侧消费者已落地(ADC 采集链路,2026-10-10,按语义映射表取数)→ V0.2 改版只改映射表内容,上层语义与代码不动 | `../硬件平台/ADC通道映射说明.md` §1/§7;`../硬件平台/V0.1_网表详细分析报告.md` §1.4 V10、§6-3 | | 双转换器无共同采样触发 | **8 路电气量分属两片转换器(V0.1 硬件缺陷,需下一版硬件修改)**——UA/UN/IA 走 TPAFE5160(16 位、8 通道同步、±5 V 双极性),UB/UC/IB/IC/IN 走 STM32 ADC(12 位、顺序扫描、0~3.3 V 单极性):① 两片转换器无共同采样触发 + STM32 侧顺序扫描(9 通道一轮 ≈ 67 µs)→ 跨转换器通道**无同一时刻性、相位关系不确定**,主板侧功率/功率因数/相角/对称分量类运算不成立;② 同族电气量精度与量程不一致(LSB ≈ 152.6 µV vs ≈ 806 µV,且 STM32 侧前端无中点偏置、负半周削顶);③ 语义与硬件归属交叉,固件映射/UI 通道序/自检注入须逐通道查表绕开 | 2026-10-10 定性更正(**撤销** 2026-10-09 建档时"有意分配、不要修正"的说法) | **V0.2 改版要求**:8 路电气量 UA/UB/UC/UN/IA/IB/IC/IN **全部接 TPAFE5160**,与 TPAFE 上 5 路备用路(AIN5/13/7/15/12)对调串联电阻在转换器一侧的目的地——元件数量与料号不变,属走线级改动。**V0.1 现板软件口径**:主板侧只做逐通道独立监视,禁止跨转换器做相位/功率/功率因数/矢量类运算(此类量取子板计量模块结果)。固件侧消费者已落地(ADC 采集链路,2026-10-10,按语义映射表取数)→ V0.2 改版只改映射表内容,上层语义与代码不动 | `../硬件平台/ADC通道映射说明.md` §1/§7;`../硬件平台/V0.1_网表详细分析报告.md` §1.4 V10、§6-3 |
| IA 前端差分滤波限制谐波带宽 | **IA 通道差分滤波电容 C35 = 100 nF 构成一阶低通 fc ≈ 796 Hz,谐波产品路线的硬件前置未清**——250 Hz 注入读数 −4.4 % 即前端真实衰减(板端读数忠实;R19/R21 各 1 k `docs/硬件平台/V0.1.tel`:49 + C35 跨接差分对,拓扑 FR-ADC-5 `docs/产品需求/产品需求设计文档.md`);工频测量不受影响,外推 5 次 −4.6 %、9 次 −13 %、15 次 −27 %、21 次(1050 Hz)−39.6 % | 2026-11-04(模型与实测数据 `docs/测试说明/测试数据/boot_log_data/20261104_ac_ia_rc_model.txt`) | **改版/改板方向**:C35 换 10 nF(fc≈8 kHz、21 次仅 −0.9 %;改板优先于软件逐阶修正——容差与温漂使修正表不可信,理由详 `docs/硬件平台/ADC通道映射说明.md` §8.2)+ **清点其余各路差分滤波电容容值**(网表无容值标注,C35 = 100 nF 系用户口头确认,其余各路未定);将来有示波器可按预测复核(250 Hz 差分分量额外滞后 ≈17°)。详述 `docs/硬件平台/ADC通道映射说明.md` §8.2 | `docs/测试说明/专项验证/ADC前端注入验证流程.md` 谐波记录 B 行;`docs/硬件平台/ADC通道映射说明.md` §8.2 | | IA 前端差分滤波限制谐波带宽 | **IA 通道差分滤波电容 C35 = 100 nF 构成一阶低通 fc ≈ 796 Hz,谐波产品路线的硬件前置未清**——250 Hz 注入读数 −4.4 % 即前端真实衰减(板端读数忠实;R19/R21 各 1 k `docs/硬件平台/V0.1.tel`:49 + C35 跨接差分对,拓扑 FR-ADC-5 `docs/产品需求/产品需求设计文档.md`);工频测量不受影响,外推 5 次 −4.6 %、9 次 −13 %、15 次 −27 %、21 次(1050 Hz)−39.6 % | 2026-11-04(模型与实测数据 `docs/测试说明/测试数据/boot_log_data/20261104_ac_ia_rc_model.txt`) | **改版/改板方向**:C35 换 10 nF(fc≈8 kHz、21 次仅 −0.9 %;改板优先于软件逐阶修正——容差与温漂使修正表不可信,理由详 `docs/硬件平台/ADC通道映射说明.md` §8.2)+ **清点其余各路差分滤波电容容值**(网表无容值标注,C35 = 100 nF 系用户口头确认,其余各路未定);将来有示波器可按预测复核(250 Hz 差分分量额外滞后 ≈17°)。详述 `docs/硬件平台/ADC通道映射说明.md` §8.2 | `docs/测试说明/专项验证/ADC前端注入验证流程.md` 谐波记录 B 行;`docs/硬件平台/ADC通道映射说明.md` §8.2 |
## 4. 测试与验证基础设施
| # | 事项 | 优先级 | 问题与证据 | 处置方向 | 出处 |
|---|---|---|---|---|---|
| CI 远端闭环未验证 | **CI 远端闭环未验证**(runner 本机已就绪) | 中 | **剩余两件**:③ 推送远端跑一次两 job 闭环验证(**跑通证据尚无留档**,故仍按"未验证"对待);④ 第二机交叉验证(不同工具安装路径,验 `DTU_*` 环境变量方案,→ `../环境与部署/本地工具路径环境变量方案.md` 变更记录 TODO)。①② 已就绪,见 `../CI/远程CI完整指南.md` §0 仓库状态行 | 完成前**提交前仍须在本地跑 `scripts/ci_local.py` 或 `pre-commit run --all-files` 自查**(静态门禁唯一保障,不能因"已配 CI"而放宽) | `.gitea/workflows/ci.yml`;`../CI/远程CI完整指南.md`;`../测试说明/流程与规范/测试开发标准流程.md` §9 |
## 5. RS-485、内存与仓库观察
| # | 事项 | 影响 / 现状 | 处置方向 | 状态 | 出处 |
|---|---|---|---|---|---|
| rs485_task 白名单缺口 | **KNOWN_GAPS 白名单清理**——现存唯一缺口 = `App/task/rs485_task.c`(RS-485 接线门禁未满足、刻意不接线,随 RS-485 采集链路 暂缓,见 `暂缓-RS485.md`) | 白名单不清 = "写了不编译"盲区仍在 | 随 RS-485 采集链路 一并出白名单(`--strict` 供审计复跑) | 结构债 | 报告 N 族残余(报告已删) |
| 缩堆迁 CCM 后半(暂缓) | **内存优化簇剩余**:原报告缩堆建议的后半(缩堆 56→32 KB → 迁 CCM)· 同类三项 | ⏸ **整簇暂缓**(2026-10-15 用户裁定):没有功能在等这块预算,而搬迁要动 scatter、要逐条过 DMA 可达性清单、缩堆还要上板复测。⚠ 代价落在"以后加任务 / 抬栈 / 加堆"那一刻——CCM 只剩 7,904 B、FreeRTOS 堆 `min_ever` 8,464 B,届时 `mem-budget` 会先报警 | 重开条件见 `../内存管理/RAM使用分析与优化方案.md` §4。⚠ **原报告另有一条已判定不可行**(CMSIS-RTOS2 `freertos_os2.h` 有 `#if (configMAX_PRIORITIES != 56) #error`,改小直接编译失败),不再列入 | **暂缓** | 报告 R 族剩余/§5.5(报告已删) |
| 仓库体积膨胀观察 | **仓库膨胀**:`.git` **233 MB**(2026-10-25 实测)+ 手册图片 36.3 MB(受控文件合计仅 79.3 MB,`.git` 已是它的 3 倍) | clone/备份慢,且持续恶化 | 降采样 / 拆 submodule / LFS 三选一 **+ 一次 `git filter-repo` 历史重写**(三项都不解决历史膨胀)。**已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评 | **仓库决策** | 报告 D 族 |
| 静态链硬线双 FAIL | **timeSyncTask / iec104Task 静态最坏链跌破 ISR 硬线**(判据 = margin ≥ max(1024 B, cfg×30%),静态 margin 是唯一拦提交项但尚未挂 pre-commit 钩子,口径见 `../内存管理/RAM使用分析与优化方案.md` §4.0.7 第③条)——2026-11-04 复测:master 2b848c4a timeSyncTask **2056 B(余 504)**、iec104Task **1600 B(余 960)**,双 FAIL;#78 合入后 timeSyncTask **1904 B(余 656)**,只减不增(−152 B = 旧 8888 任务自身帧)。两链同尾 = `ch395f SPI 故障收尾 → dbg_console_drain 幻影环`(`../内存管理/RAM使用分析与优化方案.md` §4.0.7「休眠环」在 #74 UDP / #77 SNTP 出向链接入后被重新展开) | 抬栈属 Ask-first:先台架复采 `[STACK]` 水位(scripts/stack_gate.py 三档判据),拿真实余量再定抬栈或接受现状;幻影环是 armlink 记账非设备故障,**不得写成优化收益也不得当作已越线事故** | ⏳ 待台架复采 | #78 复测留痕 `docs/内存管理/data/stack_report_20261104.md`;`../内存管理/RAM使用分析与优化方案.md` §2.3 |
---
## 6. 编码队列
| 顺序 | 条目 | 要做什么 | 完成或关闭判据 |
|---|---|---|---|
| 1 | **网络性能资源建议簇** | 分别评估 PASV 重复建监听、PHY 强制 100M 无回退、`NET_MAX_SOCKETS` 与单连接语义不一致;DE 项随 RS-485,不在本项做。机理见 `../网络/Net层阻塞模型架构设计.md` 与 `Drivers/BSP/NET/README.md` | 每项形成“修改并验证”或“有理由不做”的结论;不为了清清单做无收益重构 |
| 2 | **uvprojx 空 TU 观察** | 201 个 LVGL `.c` 中 127 个在 `.map` 零产出,但当前增量构建仅 4~5 秒;有全量构建耗时痛点时先补计时基线,再用 Keil 原生 `<IncludeInBuild>0</IncludeInBuild>` 可逆排除 | 有实测收益才保留改动;否则继续观察 |
> RS-485 白名单随 `暂缓-RS485.md` 整簇处理,不列为独立编码任务。
> 并行写域、工作树与合并纪律统一见 `docs/环境与部署/并行任务工作树方案.md`。
## 7. 等台架或外部资源的事项
| 条目 | 需要条件 | 要做的事 | 去向 |
|---|---|---|---|
| **端子/子板变比确认** | 子板实物或原理图 | 给出「端子电压 → ADC 引脚电压」的比值(万用表同时量端子与引脚,或查子板原理图后实测核对),写入 `docs/硬件平台/ADC通道映射说明.md`;据此判定 `eng` 能否置 1;数据缺失则本波只交付引脚电压并登记缺口 | `../硬件平台/ADC通道映射说明.md` §7.2(参数已算定:电压族 606.06:1、电流族 29.4118 A/V,等实物复核) |
| **两点标定与精度验收** | 标准源 / 继保测试仪;精度目标先定(0.5 级还是 1 级) | 电压 4 路(UA/UB/UC/UN)+ 电流 4 路(IA/IB/IC/IN)各做两点标定(零点 + 满度,温度不纳入),写入 `[adc_cal]` 并置 `VALID`;误差 ≤ 目标精度;证据归档 | 设计口径 `../算法/采集与算法层设计说明.md` §13.2/§13.3;`eng` 升 1 条件同节 §13.5 承诺边界 |
| **标准源送检与第三方 104 验收** | 两点标定完成、保护 VALID 置位、第三方主站 | 标准源注入判据全部通过;总召、周期、变位、遥控全流程通过;证据归档。送检窗口前 2 日冻结特性 | `../子系统设计/IEC104上行设计说明.md` §7/§8 |
| **队列往返基线待重验** | 台架 + PC peer | 下次 Phase 13 窗口重锁基线 | 本文件 §1 |
| **网络负向场景台架验证** | 拔线、SPI 故障注入、远显压力条件 | PHY 拔线、芯片级 `net_init` 失败、短写压测 | 本文件 §1 |
| **CI 远端闭环未验证** | runner 与第二台机器 | 验证远端两 job 闭环和不同工具路径 | 本文件 §4 |
| **SNTP 校时真机判据** | 台架:板与 PC SNTP 服务器(192.168.31.161 / .13)同网段可达 | `[sntp]` 使能 + 配服务器后上板复核:`[SNTP] step offset=` 步进日志、钟面与时间源一致(本地 UTC+8 口径)、`poll_min` 周期到点重对、拔线后指数退避与主备轮换、恢复后回到周期 | `../子系统设计/系统墙钟时间维护说明.md` §16 |
| **谐波叠加工况复跑** | 一台带谐波叠加 / ARB 功能的信号源 | 基波 + 20 % 二次 + 20 % 五次同段注入,核两轨各认各的次且叠加不串扰。**现有发生器无叠加功能,本轮只做了单注三档**(已证"两轨各认各的次",不证叠加工况);算法侧已被 `test/host/phasor/phasor_test.c` TC-PHASOR-006(3 条谱线各 ±1 %,57/57)覆盖 | `../测试说明/专项验证/ADC前端注入验证流程.md` 谐波轮「叠加」行 |
| **IA 前端一阶低通模型绝对仪器证伪** | 示波器 | 按 fc ≈ 796 Hz 一阶低通模型预测,250 Hz 分量应额外滞后 ≈17°;用示波器直测板上 250 Hz 相位差与该预测比对。模型本体与改板方向见本文件 §3「IA 前端差分滤波限制谐波带宽」 | `../硬件平台/ADC通道映射说明.md` §8.2 |
| **通讯设置页真机判据** | 台架 + 主站 | 页面与六态黄金已入库,剩两条实机判据:①「改后重启即生效」——改 `[comm]` 段端口后重启,看实际监听端口是否跟着变(现状 `iec104_serv.c` 的 `s_bind_listen` 每次现取、拆链重建才生效,见本文件 §1「104 端口改后立刻重 bind」);② 配置段数与键数上限核对(`CFG_FILE_MAX_KEYS = 16`) | `App/protocol/iec104/iec104_comm.{c,h}`、`../子系统设计/网络配置说明.md` |
**送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 VALID 全部置位才走保护判据。
未完成标准源标定就送检,保护会表现为不动作。保持该闭锁,不用非标准源标定走捷径。
**标定前必须先拍板的三件事**(拍板前相应 DoD 无法判定):
| 待定 | 备选 | 现状 |
|---|---|---|
| **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据,**开跑前必须定**,否则"误差 ≤ 目标精度"这条 DoD 无法判定。保护判据本身只需 3~5 %,0.5 级是计量口径 |
| **端子 / 子板变比从哪来** | ① 有原理图(直接算)② 只有实物(万用表同时量端子与引脚)③ 都没有 | 决定 `eng` 能否置 1。② 同样可行且够用;③ 则本波只交付"ADC 引脚电压",二次值登记为缺口。现状已按 ① 的参数算定(`../硬件平台/ADC通道映射说明.md` §7.2),等实物复核 |
| **`eng = 0` 期间的测频幅值门怎么处置** | 保持恒失效(现状,UI 恒 `--`)/ 台架临时把 `FREQ_AMP_MIN` 降到引脚域量级跑一轮再还原 / 换成相对量门限 | 建议**常态保持恒失效 + 需要时临时降门跑一轮**,换相对量门限要先重新论证、别在过渡期改。临时降门会改动产品头文件,收尾必须还原到 `git diff` 为空并重跑 `/keil-build` |
## 8. 等立项或硬件代次的事项
| 条目 | 当前不做的原因 | 重开条件 |
|---|---|---|
| **保护元件 V0.1 可行子集** | A 相涌流制动、突变量启动、无压无流闭锁、元件级校验和虽能设计,但没有标准源就无法验收,且保护仍在闭锁 | 标准源到位,且标定与闭锁验证完成 |
| **采集增强** | 等周波调频、零序通道、遥测谐波轨依赖可信工程量 | 标定完成后单独立项 |
| **跨转换器三相与功率类功能** | 两片转换器无共同采样触发,V0.1 上相位、功率、对称分量不成立 | V0.2 硬件改版 |
| **开入开出与遥信配置 3 页** | 固件和 V0.1 硬件均无可配开入对象;出口还涉及 GPIO 安全电平、保持/脉冲和回读自检 | 开入开出作为独立模块立项,再与 UI 页面同批 |
| **故障录波** | 独立子系统,不是补一个页面——**2026-10-29 已立项**:设计与板级判据属主 docs/子系统设计/故障录波设计说明.md(§10;原卡片登记簿 2026-10-30 销项并入后删除) | 已解除暂缓;执行按该文 §10 顺序图,UI 道互斥 |
| **104 文件传输(规约侧读文件)** | 录波取回走现成 FTP 已够用,规约侧文件服务是另一件事 | 送检或第三方交接需求明确后单独立项 |
| **主站地址白名单** | CH395F 单连接 socket 上「拒绝即 close + 重 listen」等于给扫描风暴开门,且该值现在没有任何既有消费点 | 有真实消费场景或多连接后端立项时再评 |
| **RS-485 整簇** | 用户决定暂缓 | `暂缓-RS485.md` |
## 9. 开放问题
| 问题 | 为什么还没答案 | 处理时机 |
|---|---|---|
| **是否在真实初始化点接入功能裁剪门控** | 旧占位宏没有消费者且已删除;是否需要真实门控属于产品定义,不是单纯代码问题 | 产品提出按配置裁剪需求时决定;决定前不新增空开关 |
@@ -20,7 +20,7 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
## 1. 背景与目标 ## 1. 背景与目标
登记簿(原 `待处理内容.md`,现 `docs/任务规划/`)已提出:"所有任务的内存都是往大的给的,导致内存不够用,要仔细排查内存的预算情况"。 原 `待处理内容.md`(现 `docs/任务规划/`)已提出:"所有任务的内存都是往大的给的,导致内存不够用,要仔细排查内存的预算情况"。
分析起点(2026-09-11 快照,逐符号见 `data/ram_report_20260911.md`): 分析起点(2026-09-11 快照,逐符号见 `data/ram_report_20260911.md`):
@@ -111,7 +111,7 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
> 堆 `min_ever` 7152 → **6640 B**(-512 B,符合预算)。 > 堆 `min_ever` 7152 → **6640 B**(-512 B,符合预算)。
> 此前 2026-10-04 的 V5 30 min 重采曾把 defaultTask 推到 **3664B/4096(余量 432B ≈ 10%,曾登记在案)**; > 此前 2026-10-04 的 V5 30 min 重采曾把 defaultTask 推到 **3664B/4096(余量 432B ≈ 10%,曾登记在案)**;
> 2026-10-10 的栈整改(**未抬栈**,见 §4 阶段 0 的"2026-10-10 复测")把它压回 **2152B/4096**,该项已销项。 > 2026-10-10 的栈整改(**未抬栈**,见 §4 阶段 0 的"2026-10-10 复测")把它压回 **2152B/4096**,该项已销项。
> **2026-10-12 栈余量收口(登记簿销项,「采集保护收尾」M1)**:保护定值持久化把 defaultTask 静态链推到 **3016 B** > **2026-10-12 栈余量收口(「采集保护收尾」M1)**:保护定值持久化把 defaultTask 静态链推到 **3016 B**
> (storage_bring_up→cfg 写→f_rename→dhara GC→控制台回显尾),1024 words 余 1080 B < 30% 线; > (storage_bring_up→cfg 写→f_rename→dhara GC→控制台回显尾),1024 words 余 1080 B < 30% 线;
> timeSyncTask 链 **1264 B**(同一控制台回显尾),512 words 余 784 B < ISR 底线 → **抬栈** > timeSyncTask 链 **1264 B**(同一控制台回显尾),512 words 余 784 B < ISR 底线 → **抬栈**
> defaultTask 1024→**1280**、timeSyncTask 512→**640**(堆 +1536 B,台账 §6 已登记); > defaultTask 1024→**1280**、timeSyncTask 512→**640**(堆 +1536 B,台账 §6 已登记);
@@ -125,7 +125,7 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
| ftpTask | `1024*4` | 4KB | lftpd FTP 服务 | 740 B(余 81%)/ 静态 1216 B | | ftpTask | `1024*4` | 4KB | lftpd FTP 服务 | 740 B(余 81%)/ 静态 1216 B |
| testTask | `2048*4` | 8KB | 测试套件(产品构建不创建;存储套件深链需要) | 未创建 / 静态 496 B | | testTask | `2048*4` | 8KB | 测试套件(产品构建不创建;存储套件深链需要) | 未创建 / 静态 496 B |
| defaultTask | `1280*4` | 5KB | FatFS 挂载/探针 + 配置引擎 + syslog + 栈水位探针 | 2152 B(余 41%)/ 静态 **3016 B**(栈余量收口时抬栈 1024→1280,2026-10-12) | | defaultTask | `1280*4` | 5KB | FatFS 挂载/探针 + 配置引擎 + syslog + 栈水位探针 | 2152 B(余 41%)/ 静态 **3016 B**(栈余量收口时抬栈 1024→1280,2026-10-12) |
| timeSyncTask | `640*4` | 2.5KB | 网络校时节拍宿主(SNTP 客户端;:8888 监听 2026-11-04 退役 #78,任务入口不变) | 616 B(余 50%,2026-10-12 实测)/ 静态 **1904 B**(2026-11-04 #78 交付态复测,`docs/内存管理/data/stack_report_20261104.md`;链尾 `time_sntp_run→net_sendto→ch395f_spi_fault_set→控制台 drain 幻影环`,§4.0.7 同族记账。**master 2b848c4a 同判据实测 2056 B = FAIL**,本 PR 只减不增(−152 B = 旧任务自身帧)——FAIL 属 #77/#74 后既有债,与 iec104Task 1600 B 同源,见登记簿「静态链硬线双 FAIL」;台架 `[STACK]` 水位待复采后再定抬栈与否,未据静态值擅自抬栈) | | timeSyncTask | `640*4` | 2.5KB | 网络校时节拍宿主(SNTP 客户端;:8888 监听 2026-11-04 退役 #78,任务入口不变) | 616 B(余 50%,2026-10-12 实测)/ 静态 **1904 B**(2026-11-04 #78 交付态复测,`docs/内存管理/data/stack_report_20261104.md`;链尾 `time_sntp_run→net_sendto→ch395f_spi_fault_set→控制台 drain 幻影环`,§4.0.7 同族记账。**master 2b848c4a 同判据实测 2056 B = FAIL**,本 PR 只减不增(−152 B = 旧任务自身帧)——FAIL 属 #77/#74 后既有债,与 iec104Task 1600 B 同源,见 §4.0.7 同族记账;台架 `[STACK]` 水位待复采后再定抬栈与否,未据静态值擅自抬栈) |
| adcTask | `640*4` | 2.5KB | TPAFE5160 采样消费 + 全周傅氏相量 + 有效性校验(TIM3 1 kHz 节拍,ADC 采集链路→全周傅氏相量→「采样有效性校验」 2026-10-11) | **952 / 2560**(余 1608 B / 62%,台架 `/serial-boot-test` 实测 2026-10-11);静态 **1320 B**(2026-10-12 复测,保护判据接线后) | | adcTask | `640*4` | 2.5KB | TPAFE5160 采样消费 + 全周傅氏相量 + 有效性校验(TIM3 1 kHz 节拍,ADC 采集链路→全周傅氏相量→「采样有效性校验」 2026-10-11) | **952 / 2560**(余 1608 B / 62%,台架 `/serial-boot-test` 实测 2026-10-11);静态 **1320 B**(2026-10-12 复测,保护判据接线后) |
| iec104Task | `640*4` | 2.5KB | IEC104 上行服务(默认 2404 监听 + link 状态机,IEC 104 上行 2026-10-12) | 未上板 / 静态 **1456 B**(拆链→重建监听→net_bind→SPI 故障→日志尾,日志主导;512 words 时余 592 B < ISR 底线 → 抬至 640,余 1104 B / 43%) | | iec104Task | `640*4` | 2.5KB | IEC104 上行服务(默认 2404 监听 + link 状态机,IEC 104 上行 2026-10-12) | 未上板 / 静态 **1456 B**(拆链→重建监听→net_bind→SPI 故障→日志尾,日志主导;512 words 时余 592 B < ISR 底线 → 抬至 640,余 1104 B / 43%) |
| protectTask | `512*4` | 2KB | 保护判据节拍(prot_elm_run 消费者 + 「自检失败闭锁」采样闭锁,保护任务 2026-10-12) | 未上板 / 静态 **872 B**(float 判据 + phasor 快照 + 日志尾,余 1176 B / 57%) | | protectTask | `512*4` | 2KB | 保护判据节拍(prot_elm_run 消费者 + 「自检失败闭锁」采样闭锁,保护任务 2026-10-12) | 未上板 / 静态 **872 B**(float 判据 + phasor 快照 + 日志尾,余 1176 B / 57%) |
+4 -4
View File
@@ -1,7 +1,7 @@
# RAM 预算台账(配额 · 趋势 · 门禁) # RAM 预算台账(配额 · 趋势 · 门禁)
> **定位**:`docs/内存管理/RAM使用分析与优化方案.md` §8.2 模板与 > **定位**:`docs/内存管理/RAM使用分析与优化方案.md` §8.2 模板与
> 内存治理三件套的**落地件**(2026-10-12,登记簿条目「缩堆迁 CCM 后半(暂缓)」的已落地前半)。 > 内存治理三件套的**落地件**(2026-10-12)。
> 回答三个问题:**每个子系统还能用多少 RAM**(配额)、**总量趋势往哪走**(基线 TSV)、 > 回答三个问题:**每个子系统还能用多少 RAM**(配额)、**总量趋势往哪走**(基线 TSV)、
> **超了怎么拦**(92% 门禁)。 > **超了怎么拦**(92% 门禁)。
> >
@@ -58,7 +58,7 @@ UI 16 KB / RTOS 堆 56 KB / 应用 8 KB**。归集口径(按 `.map` 对象名
- **UI ⚠ 超配额 = 已知长期挂账,不是新增违规**:LVGL 池 16 KB(2026-10-15 落地,由 40 KB 收缩)+ - **UI ⚠ 超配额 = 已知长期挂账,不是新增违规**:LVGL 池 16 KB(2026-10-15 落地,由 40 KB 收缩)+
帧/远显缓冲 ≈12.8 KB,实测 30,412 B。配额 16 KB 描述的是 **把 UI 侧缓冲迁进 CCM 之后的目标态**, 帧/远显缓冲 ≈12.8 KB,实测 30,412 B。配额 16 KB 描述的是 **把 UI 侧缓冲迁进 CCM 之后的目标态**,
而 **该搬迁的后半已按用户裁定 2026-10-15 整簇暂缓**(`docs/任务规划/登记簿.md` §5 保留重启条件)→ 而 **该搬迁的后半已按用户裁定 2026-10-15 整簇暂缓**(重开条件见 `RAM使用分析与优化方案.md` §4)→
**这条 ⚠ 会长期挂着**,判读时按已知挂账处理,别每轮当新问题追;重开条件 → `RAM使用分析与优化方案.md` §4。 **这条 ⚠ 会长期挂着**,判读时按已知挂账处理,别每轮当新问题追;重开条件 → `RAM使用分析与优化方案.md` §4。
- **RTOS 堆 = 配额本身**:56 KB 即 `configTOTAL_HEAP_SIZE`(2026-10-12 保护任务 由 48 KB 扩容,见 §6; - **RTOS 堆 = 配额本身**:56 KB 即 `configTOTAL_HEAP_SIZE`(2026-10-12 保护任务 由 48 KB 扩容,见 §6;
`heap_4.o` 另含 32 B 元数据,不计超);**改堆 = 改配额**,必须先过本文件 §6 登记。 `heap_4.o` 另含 32 B 元数据,不计超);**改堆 = 改配额**,必须先过本文件 §6 登记。
@@ -96,8 +96,8 @@ UI 16 KB / RTOS 堆 56 KB / 应用 8 KB**。归集口径(按 `.map` 对象名
| 日期 | 变更 | 原因 / 出处 | | 日期 | 变更 | 原因 / 出处 |
|---|---|---| |---|---|---|
| 2026-10-12 | 建档:三件套落地(本台账 + `scripts/ram_baseline.py` + `scripts/ram_baseline.tsv` + pre-commit `mem-budget` 钩子) | 登记簿 N-27 前半 | | 2026-10-12 | 建档:三件套落地(本台账 + `scripts/ram_baseline.py` + `scripts/ram_baseline.tsv` + pre-commit `mem-budget` 钩子) | 缩堆迁 CCM 后半的前半 |
| 2026-10-12 | **RTOS 堆配额 48 KB → 56 KB**(`QUOTAS` 同步) | 保护任务 protectTask 立项:iec104Task(2.5KB)+protectTask(2KB)+TCB 入堆后 48KB 池 min_ever 预估跌破 3,072 B 告警线 → `.ioc` 语义取数与有效性参数 `configTOTAL_HEAP_SIZE` 49152→57344(CCM 水位 75.3%→87.9%,仍 <92% 门禁;CCM 空闲降至 ≈8 KB)。连带影响见 §3 迁 CCM 后半链注记 | | 2026-10-12 | **RTOS 堆配额 48 KB → 56 KB**(`QUOTAS` 同步) | 保护任务 protectTask 立项:iec104Task(2.5KB)+protectTask(2KB)+TCB 入堆后 48KB 池 min_ever 预估跌破 3,072 B 告警线 → `.ioc` 语义取数与有效性参数 `configTOTAL_HEAP_SIZE` 49152→57344(CCM 水位 75.3%→87.9%,仍 <92% 门禁;CCM 空闲降至 ≈8 KB)。连带影响见 §3 迁 CCM 后半链注记 |
| 2026-10-12 | **任务栈 +1536 B(堆内用量,配额 56 KB 不变)**:defaultTask 1024→1280 words(+1024 B)、timeSyncTask 512→640 words(+512 B);产品任务栈合计 37,632→39,168 B | 登记簿 N-33 栈收口:保护定值持久化把 defaultTask 静态链推到 3016 B(余 1080 < 30% 线)、timeSyncTask 链 1264 B(余 784 < ISR 底线 1024);台架复测背书 min_ever=10000 → 抬后实测 `heap free=16400 / min_ever=8464`(与预算 −1536 完全吻合,>3072 告警线);`stack_report` 9 任务 0 FAIL + `@test` PASS,见 `RAM使用分析与优化方案.md` §1.4 | | 2026-10-12 | **任务栈 +1536 B(堆内用量,配额 56 KB 不变)**:defaultTask 1024→1280 words(+1024 B)、timeSyncTask 512→640 words(+512 B);产品任务栈合计 37,632→39,168 B | 栈收口:保护定值持久化把 defaultTask 静态链推到 3016 B(余 1080 < 30% 线)、timeSyncTask 链 1264 B(余 784 < ISR 底线 1024);台架复测背书 min_ever=10000 → 抬后实测 `heap free=16400 / min_ever=8464`(与预算 −1536 完全吻合,>3072 告警线);`stack_report` 9 任务 0 FAIL + `@test` PASS,见 `RAM使用分析与优化方案.md` §1.4 |
| 2026-10-29 | **故障录波数据面入册**:新增对象 `wave_ring.o` 5,300 B(ZI 5,256 + RW 44,落 SRAM1、CCM 增量 0);`default_task.o` 静态 2,736 → 3,940 B(+1,204 B,落盘道 `FIL` 528 + 分片缓冲 256 + 段头副本 136 + 段路径 17 + 打包上下文与 `DIR`/`FILINFO`);`RW_IRAM1` 81,536 → 89,936 B(62.2 % → 68.6 %,仍远低于 92 % 门禁);`RW_CCM` 三档恒 57,376 B | 决定人 lead。实测数字出自 lead 的权威构建(本工作树 `MDK-ARM/STM32F407-Demo/STM32F407-Demo.map`,0 错误 0 警告,`scripts/ram_baseline.py --update` 同批入 tsv);预估约 5.9 KB vs 实测数据面 +6,760 B 的差额构成与三档对照见 `docs/内存管理/内存内容分配策略.md` §6;**未抬栈**(`scripts/stack_report.py` 九任务全 PASS),判据出处 `docs/子系统设计/故障录波设计说明.md` §7 | | 2026-10-29 | **故障录波数据面入册**:新增对象 `wave_ring.o` 5,300 B(ZI 5,256 + RW 44,落 SRAM1、CCM 增量 0);`default_task.o` 静态 2,736 → 3,940 B(+1,204 B,落盘道 `FIL` 528 + 分片缓冲 256 + 段头副本 136 + 段路径 17 + 打包上下文与 `DIR`/`FILINFO`);`RW_IRAM1` 81,536 → 89,936 B(62.2 % → 68.6 %,仍远低于 92 % 门禁);`RW_CCM` 三档恒 57,376 B | 决定人 lead。实测数字出自 lead 的权威构建(本工作树 `MDK-ARM/STM32F407-Demo/STM32F407-Demo.map`,0 错误 0 警告,`scripts/ram_baseline.py --update` 同批入 tsv);预估约 5.9 KB vs 实测数据面 +6,760 B 的差额构成与三档对照见 `docs/内存管理/内存内容分配策略.md` §6;**未抬栈**(`scripts/stack_report.py` 九任务全 PASS),判据出处 `docs/子系统设计/故障录波设计说明.md` §7 |
| 2026-10-29 | **归集口径修正(非配额改动)**:`subsystem_of()` 补 `wave_` `iec104*` `soe_*` `meas` `freq` `run_par` `protect_task` `task_prof` `boot_stats` `vol_idle_sync` 等前缀——12 个 `App/` 对象 9,445 B 此前静默落「其它」;「应用」16,888 → 26,333 B、「其它」15,849 → 6,404 B,区域水位与 92% 红线均未变。同脚本加兜底:`App/**/*.c` 的对象落进「其它」时 `--gate` 逐条 WARN(不拦) | 配额表看不见录波/SOE 支路;口径依据本文件 §2「应用 = `App/` 其余」 | | 2026-10-29 | **归集口径修正(非配额改动)**:`subsystem_of()` 补 `wave_` `iec104*` `soe_*` `meas` `freq` `run_par` `protect_task` `task_prof` `boot_stats` `vol_idle_sync` 等前缀——12 个 `App/` 对象 9,445 B 此前静默落「其它」;「应用」16,888 → 26,333 B、「其它」15,849 → 6,404 B,区域水位与 92% 红线均未变。同脚本加兜底:`App/**/*.c` 的对象落进「其它」时 `--gate` 逐条 WARN(不拦) | 配额表看不见录波/SOE 支路;口径依据本文件 §2「应用 = `App/` 其余」 |
@@ -365,7 +365,7 @@ t = 1000 µs 下一个更新事件
| 项 | 现状 | 说明 / 出口 | | 项 | 现状 | 说明 / 出口 |
|---|---|---| |---|---|---|
| **8 路电气量分属两片转换器** | 跨转换器**没有共同采样触发点** → 无同一时刻性、相位不确定 | **V0.1 硬件缺陷**(登记簿条目「双转换器无共同采样触发」):V0.1 上**禁止**跨转换器做相位 / 功率 / 功率因数 / 矢量运算;根治要改板(8 路全接 TPAFE) | | **8 路电气量分属两片转换器** | 跨转换器**没有共同采样触发点** → 无同一时刻性、相位不确定 | **V0.1 硬件缺陷**:V0.1 上**禁止**跨转换器做相位 / 功率 / 功率因数 / 矢量运算;根治要改板(8 路全接 TPAFE) |
| STM32 侧数据滞后 | 固定 1 拍(1 ms) | 乒乓半区的结构代价;因上一条,不新增误差(§4.4) | | STM32 侧数据滞后 | 固定 1 拍(1 ms) | 乒乓半区的结构代价;因上一条,不新增误差(§4.4) |
| TPAFE 侧仍是"脉冲 + 中断读" | ISR 内 GPIO 脉冲、`BUSY` EXTI 逐通道读 8 次,**未 DMA 化** | 单点成本约 0.5 µs,非当前瓶颈;DMA / FMC 化的**前提未定**:接口类型与 `DRDY`、读时序须先用逻辑分析仪确认 | | TPAFE 侧仍是"脉冲 + 中断读" | ISR 内 GPIO 脉冲、`BUSY` EXTI 逐通道读 8 次,**未 DMA 化** | 单点成本约 0.5 µs,非当前瓶颈;DMA / FMC 化的**前提未定**:接口类型与 `DRDY`、读时序须先用逻辑分析仪确认 |
| 等周波调频 | **硬件侧已具备**:1 µs 分辨率 + ARR 预装载 + 唤醒与生产同源 → 运行期 `__HAL_TIM_SET_AUTORELOAD(&htim3, 周期µs - 1)` 即可无毛刺改频,**消费节拍自动跟随** | 采样率随动到相量窗与定值不在本层;测频见 `App/algo/freq.c`,上位需求见 `docs/算法/继电保护功能复现规划.md` §3.1 | | 等周波调频 | **硬件侧已具备**:1 µs 分辨率 + ARR 预装载 + 唤醒与生产同源 → 运行期 `__HAL_TIM_SET_AUTORELOAD(&htim3, 周期µs - 1)` 即可无毛刺改频,**消费节拍自动跟随** | 采样率随动到相量窗与定值不在本层;测频见 `App/algo/freq.c`,上位需求见 `docs/算法/继电保护功能复现规划.md` §3.1 |
@@ -3,7 +3,7 @@
> **定位**:DTU 上行规约 IEC 60870-5-104(DL/T 634.5104-2009)的设计基线—— > **定位**:DTU 上行规约 IEC 60870-5-104(DL/T 634.5104-2009)的设计基线——
> 范围、点表、链路流程、板端接入、预算与测试。规格来源 > 范围、点表、链路流程、板端接入、预算与测试。规格来源
> `docs/算法/继电保护功能复现规划.md` §1.5(产品定义,验收 = 省电科院点表); > `docs/算法/继电保护功能复现规划.md` §1.5(产品定义,验收 = 省电科院点表);
> 代码落点 `App/protocol/iec104/`;未闭环的送检验收挂 `docs/任务规划/登记簿.md` §7。 > 代码落点 `App/protocol/iec104/`;未闭环的送检验收见本文 §8。
> **角色**:本 DTU = **被控站(受控端)**,104 **TCP 服务器,端口 `[comm]` 段 `port`(工厂默认 2404)**;主站 > **角色**:本 DTU = **被控站(受控端)**,104 **TCP 服务器,端口 `[comm]` 段 `port`(工厂默认 2404)**;主站
> (控制端,点表参考 `192.168.1.199`)主动连入。 > (控制端,点表参考 `192.168.1.199`)主动连入。
@@ -70,7 +70,7 @@
| 19~20 | 零序过流 Ⅰ/Ⅱ | 「三段式零序过流」未实现 | ❌ IV | | 19~20 | 零序过流 Ⅰ/Ⅱ | 「三段式零序过流」未实现 | ❌ IV |
| 21~22 | 接地故障/重载 | 未实现 | ❌ IV | | 21~22 | 接地故障/重载 | 未实现 | ❌ IV |
| 23 | 过载 | `PE_OL` asserted | ✅ | | 23 | 过载 | `PE_OL` asserted | ✅ |
| 24~30 | 外部遥信(RS-485) | RS-485 采集链路 暂缓(`docs/任务规划/暂缓-RS485.md`) | ❌ IV | | 24~30 | 外部遥信(RS-485) | RS-485 采集链路暂缓(`docs/产品需求/产品需求设计文档.md` §5.10) | ❌ IV |
| 31 | 保护闭锁 | `prot_set_locked()` | ✅ | | 31 | 保护闭锁 | `prot_set_locked()` | ✅ |
| 32~33 | 预留 | — | ❌ IV | | 32~33 | 预留 | — | ❌ IV |
@@ -189,7 +189,7 @@ flowchart TB
节拍 + 渲染地板 61.3 ms 占住,见 §7 表)→ **这一答发出去的是按键之前的画面(白发)**; 节拍 + 渲染地板 61.3 ms 占住,见 §7 表)→ **这一答发出去的是按键之前的画面(白发)**;
新内容只能随下一次召唤带出。三个结构性主因:①键召唤答旧帧;②`uiTask` FULL 整屏渲染地板 新内容只能随下一次召唤带出。三个结构性主因:①键召唤答旧帧;②`uiTask` FULL 整屏渲染地板
61.3 ms;③召唤周期 ~275-280 ms(带键最早 205 ms)。放大器④:远端查看器在连时 61.3 ms;③召唤周期 ~275-280 ms(带键最早 205 ms)。放大器④:远端查看器在连时
`ui_net_sink_poll()` 可阻塞到秒级(登记簿「远端推流阻塞 uiTask」专项,本轮只裁案不做)。 `ui_net_sink_poll()` 可阻塞到秒级(7003 解耦专项,本轮只裁案不做)。
典型 **~250-450 ms**、最坏 **~500 ms**;④ 发作时秒级。 典型 **~250-450 ms**、最坏 **~500 ms**;④ 发作时秒级。
**修复后(2026-10-30,用户裁定三处全做)**: **修复后(2026-10-30,用户裁定三处全做)**:
@@ -207,10 +207,10 @@ flowchart TB
61.3 ms)→ 组帧 ~0.5 ms → 放行 ≤1 ms → 线上 59.6 ms → **典型 ~70-135 ms**(修复前 61.3 ms)→ 组帧 ~0.5 ms → 放行 ≤1 ms → 线上 59.6 ms → **典型 ~70-135 ms**(修复前
250-450 ms);uiTask 饿死场景 **~200 ms 保底发旧帧**(修复前同场景秒级且白发一帧)。 250-450 ms);uiTask 饿死场景 **~200 ms 保底发旧帧**(修复前同场景秒级且白发一帧)。
统计口径:TX 上报行新增 `dfok=`(新帧放行次数)与 `dfold=`(扣满 140 ms 发旧帧次数—— 统计口径:TX 上报行新增 `dfok=`(新帧放行次数)与 `dfold=`(扣满 140 ms 发旧帧次数——
**dfold 在涨 = uiTask 被饿 ≥140 ms 的直接证据**,与登记簿「reconcile 突发饿死 uiTask」对拍)。 **dfold 在涨 = uiTask 被饿 ≥140 ms 的直接证据**,与网络自愈架构设计 §8 的 reconcile 突发饿死 uiTask 一条对拍)。
**没动的**:屏板固件(外部工程 DTU-LCD,用户裁定不改)、召唤节奏(280 ms 是屏板的,主机 **没动的**:屏板固件(外部工程 DTU-LCD,用户裁定不改)、召唤节奏(280 ms 是屏板的,主机
单方面把"下一次召唤"的期望值提前不了)、7003 解耦(只留方案在登记簿)。主机单测 单方面把"下一次召唤"的期望值提前不了)、7003 解耦(方案留在本节,未实施)。主机单测
`TC-SBLINK-030~033` 钉住扣件/放行/截止/四边界(套件 164/164)。 `TC-SBLINK-030~033` 钉住扣件/放行/截止/四边界(套件 164/164)。
## 8. 对外接口(单一出处在各头文件,这里只列形状) ## 8. 对外接口(单一出处在各头文件,这里只列形状)
@@ -415,7 +415,7 @@ sequenceDiagram
## 附录:日志静默观察项 × 步骤 8 合并评估(2026-10-25,道F 第二轮 / task-18,零代码改动) ## 附录:日志静默观察项 × 步骤 8 合并评估(2026-10-25,道F 第二轮 / task-18,零代码改动)
> 评估任务(登记簿曾登记的**日志静默观察项**,已销项;残余动作是「与步骤 8 合并评估」):该观察项 > 评估任务(**日志静默观察项**,已销项;残余动作是「与步骤 8 合并评估」):该观察项
> (49s 全系统日志静默,2026-09-22 L3 台架世代号 181)与步骤 8(日志非阻塞化,需求 > (49s 全系统日志静默,2026-09-22 L3 台架世代号 181)与步骤 8(日志非阻塞化,需求
> 出处 = `docs/测试说明/专项验证/链路延迟测试说明.md` §9.2/§10.2)的合并性价比判定。 > 出处 = `docs/测试说明/专项验证/链路延迟测试说明.md` §9.2/§10.2)的合并性价比判定。
> 评估纪律 = 结论即交付,不顺手重构;本节结论:**无需最小实现**(不新增代码)。 > 评估纪律 = 结论即交付,不顺手重构;本节结论:**无需最小实现**(不新增代码)。
@@ -472,7 +472,7 @@ D4 否决理由对现状仍逐条成立(115200 发送率低、日志行稀疏
冷却路径核对)。 冷却路径核对)。
- **处置建议**:该观察项保留为低风险观察,至拆链修复版(merge 969fc5c)的 V5 - **处置建议**:该观察项保留为低风险观察,至拆链修复版(merge 969fc5c)的 V5
复跑(判据 = 运行期 `[WD] task stall` 与非开机 `MISS start` 双零,台架由 复跑(判据 = 运行期 `[WD] task stall` 与非开机 `MISS start` 双零,台架由
lead 排窗)达成后销项;本附录即销项结论落点。登记簿相应两行与波次行 lead 排窗)达成后销项;本附录即销项结论落点。排期相应两行与波次行
的清理归单写者(lead)。 的清理归单写者(lead)。
### A.4 评估后的遗留面(全部既有,无新增) ### A.4 评估后的遗留面(全部既有,无新增)
@@ -482,4 +482,4 @@ D4 否决理由对现状仍逐条成立(115200 发送率低、日志行稀疏
| ORE 僵尸根治(改只发不收) | §12 / §13-O4 | **2026-10-26 用户裁定不做**;量尺 `dbg_console_tx_timeout()` 保留,将来重评直接用 | | ORE 僵尸根治(改只发不收) | §12 / §13-O4 | **2026-10-26 用户裁定不做**;量尺 `dbg_console_tx_timeout()` 保留,将来重评直接用 |
| `tx_timeout` 读口接线(STALL 证据行加字段) | §13-O2 | 涉 `App/util/task_watchdog.c` 与被解析证据行的台架判据,非本卡写域;维持 O2“后续项” | | `tx_timeout` 读口接线(STALL 证据行加字段) | §13-O2 | 涉 `App/util/task_watchdog.c` 与被解析证据行的台架判据,非本卡写域;维持 O2“后续项” |
| 未注册期裸发互斥 / `printf` 遗留开销 | §13-O1/O3 | 现状 = 纪律已落地,开机日志密度上升再议 | | 未注册期裸发互斥 / `printf` 遗留开销 | §13-O1/O3 | 现状 = 纪律已落地,开机日志密度上升再议 |
| 日志静默观察项 | 登记簿曾登记(已销项) | 见 A.3:V5 复跑双零后销项(归 lead) | | 日志静默观察项 | 曾登记(已销项) | 见 A.3:V5 复跑双零后销项(归 lead) |
@@ -23,7 +23,7 @@
- `§8` 现场回放显示契约 - `§8` 现场回放显示契约
- `§9` 观测:只加一条周期行 - `§9` 观测:只加一条周期行
- `§10` 测试与门禁,含 bench 自抓红线 - `§10` 测试与门禁,含 bench 自抓红线
- `§11` 与标定任务卡(`../任务规划/登记簿.md` §7)的三处口径变更 - `§11` 与标定折算(`docs/算法/采集与算法层设计说明.md` §13.13)的三处口径变更
- `§12` 风险 `§13` 范围边界 `§14` 与其它文档的关系 - `§12` 风险 `§13` 范围边界 `§14` 与其它文档的关系
--- ---
@@ -333,7 +333,7 @@ flowchart TD
**bench 定时自抓的红线**:定周期自抓在 1 kHz / 8 路下每 2 s 一段,每 5 分钟就是一轮 NAND 写。**长时间挂着它白烧写次数**,而 dhara 的坏块记账是持久代价、普通恢复清不掉(`AGENTS.md` 测试构建节,`docs/测试说明/专项验证/存储维护与容量恢复.md`)→ 定时模式必须**默认关闭 + 有时长上限 + 启动时打一次告警**,用完立刻回产品构建。 **bench 定时自抓的红线**:定周期自抓在 1 kHz / 8 路下每 2 s 一段,每 5 分钟就是一轮 NAND 写。**长时间挂着它白烧写次数**,而 dhara 的坏块记账是持久代价、普通恢复清不掉(`AGENTS.md` 测试构建节,`docs/测试说明/专项验证/存储维护与容量恢复.md`)→ 定时模式必须**默认关闭 + 有时长上限 + 启动时打一次告警**,用完立刻回产品构建。
**本波执行顺序(2026-10-30 并入原卡片登记簿 §3;BENCH 与 COOL 两个判定就是「板级那一轮」未跑的回路,DONE = 台账回填 + 文档现状化)**: **本波执行顺序(2026-10-30 并入本文;BENCH 与 COOL 两个判定就是「板级那一轮」未跑的回路,DONE = 台账回填 + 文档现状化)**:
```mermaid ```mermaid
flowchart TD flowchart TD
@@ -367,7 +367,7 @@ bench 锁全程持有(收工 release,PASS 证据就是本小节);设备
| 冻结窗口内 104 上送无恙(**正式判据项**) | 参考主站 `test/host/iec104_master.py` 全程跑在落盘窗口内:GI 扫描(双点组 / 单点组 / YC 组 / 频率)+ actterm + 定值读回全绿,**唯二 FAIL 是两条 COV 腿 = 标定闭锁腿(OC1 不出口,物理预期,非链路故障)**;全程无链路异常、无 send fail | | 冻结窗口内 104 上送无恙(**正式判据项**) | 参考主站 `test/host/iec104_master.py` 全程跑在落盘窗口内:GI 扫描(双点组 / 单点组 / YC 组 / 频率)+ actterm + 定值读回全绿,**唯二 FAIL 是两条 COV 腿 = 标定闭锁腿(OC1 不出口,物理预期,非链路故障)**;全程无链路异常、无 send fail |
| `drop` 观测 | 每冻结窗约 400–640 点(51–79 拍 × 8 路)入账,量级 = SEALED 态每拍 push +8 直到落盘 ACK 的窗口长度;`seg` 无丢段、`err`=0,采集无恙——纯观察项非失败(「丢样本不丢采集」的实测面) | | `drop` 观测 | 每冻结窗约 400–640 点(51–79 拍 × 8 路)入账,量级 = SEALED 态每拍 push +8 直到落盘 ACK 的窗口长度;`seg` 无丢段、`err`=0,采集无恙——纯观察项非失败(「丢样本不丢采集」的实测面) |
**新发现缺陷「回放页段表枚举恒空(板级)」**(原登记 `docs/任务规划/登记簿.md` §2,**2026-11-02 修复闭环后按「完成即销项」删行,完整记录即本小节**):回放页真机开屏恒显 **新发现缺陷「回放页段表枚举恒空(板级)」**(**2026-11-02 修复闭环,完整记录即本小节**):回放页真机开屏恒显
「无录波段」,而 FTP `LIST` 六段全见、`RETR`/`DELE` 正常。判别面(五个独立复核,全非偶然): 「无录波段」,而 FTP `LIST` 六段全见、`RETR`/`DELE` 正常。判别面(五个独立复核,全非偶然):
手动触发照常成段(计数 + 真文件都在)⇒ 写侧取卷锁正常;SOE 记录页(同一条 `vol_lock_wait(0)` 手动触发照常成段(计数 + 真文件都在)⇒ 写侧取卷锁正常;SOE 记录页(同一条 `vol_lock_wait(0)`
try 锁纪律)照常读出并显示 ⇒ try 锁读径正常;`manual_req` 作废段表缓存后重扫**仍空** ⇒ 不是 try 锁纪律)照常读出并显示 ⇒ try 锁读径正常;`manual_req` 作废段表缓存后重扫**仍空** ⇒ 不是
@@ -598,7 +598,7 @@ Before/After 表与串口原文。
| 动态波形验证读数的地方 = 派生标量(`meas:` / 104 / `phasor(hb)`) | 派生标量仍是**判据**,但样本改从录波段导出 → 判据升级为「PC 独立重算 vs 板上读数」对表 | 录波段就是现成的样本来源,不必再造一条串口通路 | | 动态波形验证读数的地方 = 派生标量(`meas:` / 104 / `phasor(hb)`) | 派生标量仍是**判据**,但样本改从录波段导出 → 判据升级为「PC 独立重算 vs 板上读数」对表 | 录波段就是现成的样本来源,不必再造一条串口通路 |
| 动态波形验证「手边可做、排在最前」 | 排在录波 P1 之后(用户裁定 2026-10-29:录波先行) | 先有样本通路,验证才不留遗憾 | | 动态波形验证「手边可做、排在最前」 | 排在录波 P1 之后(用户裁定 2026-10-29:录波先行) | 先有样本通路,验证才不留遗憾 |
(2026-10-30 更新:原卡片登记簿已销项并入本文,§10 尾有本波执行顺序图;排期顺位在 `docs/任务规划/README.md` §2.0「独立」行。) (2026-10-30 更新:原卡片已销项并入本文,§10 尾有本波执行顺序图;排期顺位在 `docs/任务规划/README.md` §2.0「独立」行。)
--- ---
@@ -635,7 +635,7 @@ Before/After 表与串口原文。
| 文档 / 工作 | 关系 | | 文档 / 工作 | 关系 |
|---|---| |---|---|
| 原任务规划《故障录波》卡片登记簿(2026-10-30 销项删除) | 卡片判据与顺序图已并入本文 §9 与 §10;排期顺位归 `docs/任务规划/README.md` §2.0「独立」行——判据不再另立文件 | | 原任务规划《故障录波》卡片(2026-10-30 销项删除) | 卡片判据与顺序图已并入本文 §9 与 §10;排期顺位归 `docs/任务规划/README.md` §2.0「独立」行——判据不再另立文件 |
| `docs/算法/采集与算法层设计说明.md §13` | 上游:静态与动态信度、削顶归属由它定义;本文 §11 记录因录波而变的三处口径 | | `docs/算法/采集与算法层设计说明.md §13` | 上游:静态与动态信度、削顶归属由它定义;本文 §11 记录因录波而变的三处口径 |
| `docs/子系统设计/ADC采样节拍设计说明.md` | 数据源与节拍属主;本波**不改**它,二期改节拍时必须回头改它 | | `docs/子系统设计/ADC采样节拍设计说明.md` | 数据源与节拍属主;本波**不改**它,二期改节拍时必须回头改它 |
| `docs/架构设计/STM32F4-Base存储架构说明.md` §10.1 | FatFs 陷阱与 8.3 短名的属主;本文 §5.2 只是消费者 | | `docs/架构设计/STM32F4-Base存储架构说明.md` §10.1 | FatFs 陷阱与 8.3 短名的属主;本文 §5.2 只是消费者 |
@@ -479,7 +479,7 @@ snapshot == required → miss_streak=0、证据门闩复位、喂狗
| R6 | **`RCC_CSR` 读后即清** | 已在 `main.c` 统一处理;漏清会让下次软复位读回上次标志 | | R6 | **`RCC_CSR` 读后即清** | 已在 `main.c` 统一处理;漏清会让下次软复位读回上次标志 |
| R7 | **UI 推流的网络往返卡死不占心跳位**(产品掩码仍 `0x77`) | 刻意:往返卡死的根因在 netTask,netTask 已在掩码内、由它暴露;为"远端显示卡了"新增一位只会把观感问题升级成整机复位。UI 心跳已由自身喂位自产、不受推流影响;推流耗时看 `[PROF]` 的 `uis`/`uisn`。成因与判读见本文 **§11.3 第 2 条**;门控方案与残留暴露见 `../UI设计/RemoDispBus协议与接收设计说明.md` §3 | | R7 | **UI 推流的网络往返卡死不占心跳位**(产品掩码仍 `0x77`) | 刻意:往返卡死的根因在 netTask,netTask 已在掩码内、由它暴露;为"远端显示卡了"新增一位只会把观感问题升级成整机复位。UI 心跳已由自身喂位自产、不受推流影响;推流耗时看 `[PROF]` 的 `uis`/`uisn`。成因与判读见本文 **§11.3 第 2 条**;门控方案与残留暴露见 `../UI设计/RemoDispBus协议与接收设计说明.md` §3 |
### 9.2 未办项(登记簿同步) ### 9.2 未办项
| 条目 | 内容 | 与本案关系 | | 条目 | 内容 | 与本案关系 |
|---|---|---| |---|---|---|
@@ -559,7 +559,7 @@ python scripts/check_cubemx_survival.py --write # 确认改动无误后重建
> **来源**:`[ERR][WD] task stall: mask=0x00000067 req=0x00000077`(缺 bit4 = `TASK_WD_UI`) > **来源**:`[ERR][WD] task stall: mask=0x00000067 req=0x00000077`(缺 bit4 = `TASK_WD_UI`)
> 的完整归因与处置。故障本身已结案——**累计 38 次上板启动 0 复现**(主机侧回归的早期基线 3/10), > 的完整归因与处置。故障本身已结案——**累计 38 次上板启动 0 复现**(主机侧回归的早期基线 3/10),
> 原始分析文档按登记簿"完成即销项"规则删除。本节只留**可复用的判读口径、诊断方法、 > 原始分析文档按"完成即销项"规则删除。本节只留**可复用的判读口径、诊断方法、
> 实测基线与教训**;ADC 侧的处置细节在 [`ADC采样节拍设计说明.md`](ADC采样节拍设计说明.md) §6 与 §9, > 实测基线与教训**;ADC 侧的处置细节在 [`ADC采样节拍设计说明.md`](ADC采样节拍设计说明.md) §6 与 §9,
> UI 推流门控在 `../UI设计/RemoDispBus协议与接收设计说明.md` §3,就绪门控 API 在 > UI 推流门控在 `../UI设计/RemoDispBus协议与接收设计说明.md` §3,就绪门控 API 在
> `../网络/BSD_Socket_API_使用指南.md` §10.1。 > `../网络/BSD_Socket_API_使用指南.md` §10.1。
+3 -2
View File
@@ -183,8 +183,9 @@ write=1
| `ca` | 公共地址(= 链路地址,ASDU 头 2B) | 1 | 1 ~ 65535 | | `ca` | 公共地址(= 链路地址,ASDU 头 2B) | 1 | 1 ~ 65535 |
| `port` | 被控站 TCP 监听端口 | 2404 | 1024 ~ 65535 | | `port` | 被控站 TCP 监听端口 | 2404 | 1024 ~ 65535 |
- **生效 = 改后重启**(与 [network] 免重启重建**不同**,验收口径 → - **生效 = 改后重启**(与 [network] 免重启重建**不同**;台架判据 = 改 `port` 后重启,
`docs/任务规划/登记簿.md` §7「通讯设置页真机判据」):iec104Task 启动时读一次 getter; 看实际监听端口是否跟着变,以及配置段数与键数上限 `CFG_FILE_MAX_KEYS = 16` 核对):
iec104Task 启动时读一次 getter;
端口另在下次重 bind(拆链/代次重建)自然生效。不挂段回调、不新增事件位—— 端口另在下次重 bind(拆链/代次重建)自然生效。不挂段回调、不新增事件位——
CH395F 单连接 socket 上「换端口/拒绝重听」= close + re-listen,做成热生效 CH395F 单连接 socket 上「换端口/拒绝重听」= close + re-listen,做成热生效
会被端口扫描打成 SPI/看门狗风暴(详论 → 本段只登记,正文唯一详述处 = 会被端口扫描打成 SPI/看门狗风暴(详论 → 本段只登记,正文唯一详述处 =
@@ -171,7 +171,7 @@ defaultTask(唯一写者,挂载成功后):
``` ```
- **日志读写放大收口(2026-10-15,写侧):一次排空合并成"每文件一次 open/write/close"**。旧实现每条记录一轮,而 `f_close` 要回写目录项、`f_write` 要对目标扇区做读-改-写 → **每条日志 2~4 次 NAND 页读写**。现在同一文件的一批(≤8 条 = 512 B 静态缓冲 `s_batch`)合并成一次追加写: - **日志读写放大收口(2026-10-15,写侧):一次排空合并成"每文件一次 open/write/close"**。旧实现每条记录一轮,而 `f_close` 要回写目录项、`f_write` 要对目标扇区做读-改-写 → **每条日志 2~4 次 NAND 页读写**。现在同一文件的一批(≤8 条 = 512 B 静态缓冲 `s_batch`)合并成一次追加写:
- **掉电语义不变**:批次仍在**同一次 `syslog_drain()` 调用内**写完并 `f_close`;`f_close` 内部 `sync_fs` → `disk_ioctl(CTRL_SYNC)` 会 `ftl_flush_cache()` 把 FTL 的单页写回缓存刷进 NAND(`Drivers/BSP/GD5F2GQ5UE/nand_ftl.c` 的 `CTRL_SYNC` 分支)。落盘时机与旧实现每条 close 等价,**批次不跨调用驻留 RAM**:"写完即关"的路径关文件即落盘,残余只到"单次写事务进行中掉电/复位"为止(`../任务规划/登记簿.md` 条目「写回缓存空闲 flush」:无空闲/掉电前周期 flush,2026-10-22 用户裁定暂不做)。 - **掉电语义不变**:批次仍在**同一次 `syslog_drain()` 调用内**写完并 `f_close`;`f_close` 内部 `sync_fs` → `disk_ioctl(CTRL_SYNC)` 会 `ftl_flush_cache()` 把 FTL 的单页写回缓存刷进 NAND(`Drivers/BSP/GD5F2GQ5UE/nand_ftl.c` 的 `CTRL_SYNC` 分支)。落盘时机与旧实现每条 close 等价,**批次不跨调用驻留 RAM**:"写完即关"的路径关文件即落盘,残余只到"单次写事务进行中掉电/复位"为止(无空闲/掉电前周期 flush,2026-10-22 用户裁定暂不做)。
- **条目不丢**:启动前数组按下标"看而不删",整批成功才删;队列条目在落盘失败(-2 卷忙 / -1 写失败 / -3 容量不足)时**回投队列**。 - **条目不丢**:启动前数组按下标"看而不删",整批成功才删;队列条目在落盘失败(-2 卷忙 / -1 写失败 / -3 容量不足)时**回投队列**。
⚠ **2026-10-24 更正本条**:旧实现里 -2 只在**按条慢路径**被正确回投,**批量路径根本没有 -2 分支**(`done` 保持 `n` → 回投循环空转)→ 卷忙时一批(≤8 条)既不落盘也不回投、静默丢失,而本节长期写着"条目不丢"替它背书。现已补 `rc == -2` 分支整批回投(不计故障、不打日志、保序),由 `test/host/sys_log_mcu/` 的 TC-SYSLOG-035 组逐条钉住。**真机必验**:FTP 传输期间持续投日志,传输结束后条数 == 投递条数、顺序不乱。 ⚠ **2026-10-24 更正本条**:旧实现里 -2 只在**按条慢路径**被正确回投,**批量路径根本没有 -2 分支**(`done` 保持 `n` → 回投循环空转)→ 卷忙时一批(≤8 条)既不落盘也不回投、静默丢失,而本节长期写着"条目不丢"替它背书。现已补 `rc == -2` 分支整批回投(不计故障、不打日志、保序),由 `test/host/sys_log_mcu/` 的 TC-SYSLOG-035 组逐条钉住。**真机必验**:FTP 传输期间持续投日志,传输结束后条数 == 投递条数、顺序不乱。
- **容量轮转仍只在按条慢路径做**:批量路径发现剩余容量装不下一批时返回 -3,退回逐条 `s_append()`("满了 unlink 重建"只保留一处实现,避免一批跨多轮重建)。 - **容量轮转仍只在按条慢路径做**:批量路径发现剩余容量装不下一批时返回 -3,退回逐条 `s_append()`("满了 unlink 重建"只保留一处实现,避免一批跨多轮重建)。
+1 -1
View File
@@ -375,7 +375,7 @@
| 项目级铁律、构建/烧录/测试命令、平台约束 | `AGENTS.md`(AI 协作上下文,**精简优先**) | | 项目级铁律、构建/烧录/测试命令、平台约束 | `AGENTS.md`(AI 协作上下文,**精简优先**) |
| 开发者入门、架构速览、目录导航 | `README.md` | | 开发者入门、架构速览、目录导航 | `README.md` |
| 详细设计、专项说明、测试指南 | `docs/` 下对应子目录 | | 详细设计、专项说明、测试指南 | `docs/` 下对应子目录 |
| 跨文档待办登记 | `docs/任务规划/README.md`(统一登记簿) | | 跨文档待办登记 | 各模块文档的「已知限制/重开条件」节(顺序归 `docs/任务规划/README.md`) |
| 评审报告与专项审计 | `docs/问题记录/` | | 评审报告与专项审计 | `docs/问题记录/` |
> **避免重复**:同一事实只在一处详述,其它位置用链接指向。典型如 FreeRTOS 任务表——`Src/freertos.c` 是唯一事实源,`README.md`/`AGENTS.md` 的表由脚本生成,不在别处再抄一份。 > **避免重复**:同一事实只在一处详述,其它位置用链接指向。典型如 FreeRTOS 任务表——`Src/freertos.c` 是唯一事实源,`README.md`/`AGENTS.md` 的表由脚本生成,不在别处再抄一份。
@@ -34,7 +34,7 @@ HAL_Init → SystemClock_Config → MX_GPIO/DMA/USART1/SPI2/SPI1/I2C1/UART4/IWDG
├─ adcTask → TIM3 1kHz 唤醒,ADC 采集(纯消费者) ├─ adcTask → TIM3 1kHz 唤醒,ADC 采集(纯消费者)
├─ iec104Task → IEC 60870-5-104 上行(默认 :2404) ├─ iec104Task → IEC 60870-5-104 上行(默认 :2404)
├─ protectTask → 保护判据 20ms 节拍 ├─ protectTask → 保护判据 20ms 节拍
└─ rs485Task → 未创建(RS-485 暂缓,见 docs/任务规划/暂缓-RS485.md) └─ rs485Task → 未创建(RS-485 暂缓,见 docs/产品需求/产品需求设计文档.md §5.10)
``` ```
--- ---
@@ -730,7 +730,7 @@ LPN 与原始码的位置**就地分类并打印(`ftl_err_name()` 给可读名
### 10.5 卷锁覆盖面审计与 dhara 重试自旋复核(2026-11-05,问题 #45 评估结论) ### 10.5 卷锁覆盖面审计与 dhara 重试自旋复核(2026-11-05,问题 #45 评估结论)
**结论先行:卷锁之外没有第二写者,登记簿「可选全序列卷锁」项就此关闭; **结论先行:卷锁之外没有第二写者,原「可选全序列卷锁」事项就此关闭;
「存储侧喂狗饥饿」无 2026-10-02 之后的新证据,dhara 重试自旋保留为长期观察。** 「存储侧喂狗饥饿」无 2026-10-02 之后的新证据,dhara 重试自旋保留为长期观察。**
判据 = 对 master `c487ce4` 的调用点枚举(判据:`App/` 与 `Drivers/BSP/` 下全部带 判据 = 对 master `c487ce4` 的调用点枚举(判据:`App/` 与 `Drivers/BSP/` 下全部带
`FA_WRITE` 的 `f_open` 与 `f_unlink`/`f_rename`/`f_mkdir`/`f_opendir` 调用点) `FA_WRITE` 的 `f_open` 与 `f_unlink`/`f_rename`/`f_mkdir`/`f_opendir` 调用点)
@@ -751,7 +751,7 @@ LPN 与原始码的位置**就地分类并打印(`ftl_err_name()` 给可读名
LVGL 的 FatFs 驱动桥(`Lib/lvgl/src/libs/fsdrv/lv_fs_fatfs.c`)`LV_USE_FS_FATFS` LVGL 的 FatFs 驱动桥(`Lib/lvgl/src/libs/fsdrv/lv_fs_fatfs.c`)`LV_USE_FS_FATFS`
默认关闭、本仓未接线,不是卷使用者;`test/board/` 的存储测试任务仅存在于互斥测试 默认关闭、本仓未接线,不是卷使用者;`test/board/` 的存储测试任务仅存在于互斥测试
构建(`test-suite-switch` 门禁),不在产品镜像。**登记簿原口径「卷锁仅覆盖 构建(`test-suite-switch` 门禁),不在产品镜像。**原口径「卷锁仅覆盖
syslog/cfg/lftpd 三条路径」是 2026-10-02 建档快照,已被本表取代**——SOE、录波段写、 syslog/cfg/lftpd 三条路径」是 2026-10-02 建档快照,已被本表取代**——SOE、录波段写、
`/prot_set.bin`、UI 读径与空闲 sync 随后都进了同一把锁。 `/prot_set.bin`、UI 读径与空闲 sync 随后都进了同一把锁。
@@ -767,4 +767,4 @@ defaultTask(喂狗点)内也不饿狗,残留形态收敛为「有界时长
复位默认值的 P0 修复,见 `../子系统设计/看门狗设计说明.md` 变更记录),此后 复位默认值的 P0 修复,见 `../子系统设计/看门狗设计说明.md` 变更记录),此后
2026-10-25 F2/F3 探针轮、2026-11-02 录波枚举台架轮(卷锁 try 超时 0 次)、 2026-10-25 F2/F3 探针轮、2026-11-02 录波枚举台架轮(卷锁 try 超时 0 次)、
2026-11-05 PR #82 补验 soak(STOR 密集)均无该签名。重开判据不变:**台架再出 2026-11-05 PR #82 补验 soak(STOR 密集)均无该签名。重开判据不变:**台架再出
存储侧喂狗饥饿才排期**;观察行留登记簿 §2。 存储侧喂狗饥饿才排期**;观察结论留本节。
@@ -18,7 +18,7 @@
| `iec104Task` | IEC 60870-5-104 上行(工厂默认 :2404 监听 + link 状态机,IEC 104 上行) | `osEventFlagsWait(SYS_EVT_NET_READY, … \| osFlagsNoClear)` | | `iec104Task` | IEC 60870-5-104 上行(工厂默认 :2404 监听 + link 状态机,IEC 104 上行) | `osEventFlagsWait(SYS_EVT_NET_READY, … \| osFlagsNoClear)` |
| `adcTask` | TIM3 1kHz 采样节拍**纯消费者**(`adc_input_poll()`,语义取数与有效性/全周傅氏相量取数,不做保护运算) | **无事件位依赖**:TIM3 ISR 内 `adc_tick_irq_notify()` 直接唤醒(TIM3 比调度器早 ≈100ms 启动,ISR 侧只能走该通知函数) | | `adcTask` | TIM3 1kHz 采样节拍**纯消费者**(`adc_input_poll()`,语义取数与有效性/全周傅氏相量取数,不做保护运算) | **无事件位依赖**:TIM3 ISR 内 `adc_tick_irq_notify()` 直接唤醒(TIM3 比调度器早 ≈100ms 启动,ISR 侧只能走该通知函数) |
| `protectTask` | 保护判据 20ms 节拍(`prot_elm_run()`,保护判据,保护任务) | 无(节拍自持,不依赖网络) | | `protectTask` | 保护判据 20ms 节拍(`prot_elm_run()`,保护判据,保护任务) | 无(节拍自持,不依赖网络) |
| `rs485_task` | RS-485 通信(任务体已实现) | **未在 `freertos.c` 创建**(RS-485 采集链路 暂缓,见 `docs/任务规划/暂缓-RS485.md`) | | `rs485_task` | RS-485 通信(任务体已实现) | **未在 `freertos.c` 创建**(RS-485 采集链路暂缓,见 `docs/产品需求/产品需求设计文档.md` §5.10) |
### 1.2 改造前(已废弃)的依赖管理手段 ### 1.2 改造前(已废弃)的依赖管理手段
> 以下为引入 Event Flags 之前的历史做法,仅作背景记录,当前代码已不再使用。 > 以下为引入 Event Flags 之前的历史做法,仅作背景记录,当前代码已不再使用。
+1 -1
View File
@@ -56,7 +56,7 @@
> **与 §1 分层图的分工**:§1 回答「谁属于哪一层、层间单向依赖」,本图回答「一条数据从引脚走到 104 报文 / 显存 / 记录文件要穿过哪些框、谁在什么时候被谁唤醒」。图里的五条纵带只是**列分组**(便于对齐),不是依赖声明——依赖方向仍以 §1.1 表与 `layer-deps` 门禁为准。 > **与 §1 分层图的分工**:§1 回答「谁属于哪一层、层间单向依赖」,本图回答「一条数据从引脚走到 104 报文 / 显存 / 记录文件要穿过哪些框、谁在什么时候被谁唤醒」。图里的五条纵带只是**列分组**(便于对齐),不是依赖声明——依赖方向仍以 §1.1 表与 `layer-deps` 门禁为准。
> 影响链路走向的两条行为条件已画进图内(RS-485 未接线 → 暂缓接语义取数层;跨任务握手集中经 `就绪屏障`);其余行为条件(未标定闭锁、`osFlagsNoClear`、CH395F 单连接、V0.1 双转换器无共同采样触发)不在图上重复,见 AGENTS.md「项目概况 / 平台约束」与 §2.2、§5。 > 影响链路走向的两条行为条件已画进图内(RS-485 未接线 → 暂缓接语义取数层;跨任务握手集中经 `就绪屏障`);其余行为条件(未标定闭锁、`osFlagsNoClear`、CH395F 单连接、V0.1 双转换器无共同采样触发)不在图上重复,见 AGENTS.md「项目概况 / 平台约束」与 §2.2、§5。
> `*` `rs485_task.c` 任务体已实现,但**当前未在 `freertos.c` 创建**(RS-485 采集链路 暂缓,见 `docs/任务规划/暂缓-RS485.md`);`adc_task.c` 已于 2026-10-10 接入创建(`adcTask`)。 > `*` `rs485_task.c` 任务体已实现,但**当前未在 `freertos.c` 创建**(RS-485 采集链路暂缓,见 `docs/产品需求/产品需求设计文档.md` §5.10);`adc_task.c` 已于 2026-10-10 接入创建(`adcTask`)。
> 串口三分(2026-10-29 屏板批 0 后的定态):**USART1 = 屏板链路 700 kbaud**、**UART4 = RS-485(115200,未接线)**、**UART5 = 控制台日志 115200**——日志口原在 USART1,屏板占用后迁至 UART5(RS232#1 台架线改接日志口)。 > 串口三分(2026-10-29 屏板批 0 后的定态):**USART1 = 屏板链路 700 kbaud**、**UART4 = RS-485(115200,未接线)**、**UART5 = 控制台日志 115200**——日志口原在 USART1,屏板占用后迁至 UART5(RS232#1 台架线改接日志口)。
--- ---
@@ -250,7 +250,7 @@ TPAFE 双极性补码可注负压;STM32 单极性负半周测不了。UA/UN/IA
| STM32(`UB`/`UC`/`IB`/`IC`/`IN`) | 0~3.3 V 单极性 | 无正向意义 | 只在削顶轮用:注交流 = **故意触底**,负半周本就钉 0 | | STM32(`UB`/`UC`/`IB`/`IC`/`IN`) | 0~3.3 V 单极性 | 无正向意义 | 只在削顶轮用:注交流 = **故意触底**,负半周本就钉 0 |
3. **一次只注一路**(相位轮除外,它要 `UA` 与 `UN` 两路同源),换表笔前先关输出。端子侧串阻 **1 k**(R31/R28/R19/R52…)。STM32 五路负半周经**片内**钳位灌向 VDDA(网表 `docs/硬件平台/V0.1.tel` :228-241 实证:无外置钳位二极管、无隔直电容);Vpp 2.828 V 时峰值电流 ≈ **1.1 mA**(量级估算),**别往上加幅度**——这种注入只允许出现在削顶轮。 3. **一次只注一路**(相位轮除外,它要 `UA` 与 `UN` 两路同源),换表笔前先关输出。端子侧串阻 **1 k**(R31/R28/R19/R52…)。STM32 五路负半周经**片内**钳位灌向 VDDA(网表 `docs/硬件平台/V0.1.tel` :228-241 实证:无外置钳位二极管、无隔直电容);Vpp 2.828 V 时峰值电流 ≈ **1.1 mA**(量级估算),**别往上加幅度**——这种注入只允许出现在削顶轮。
4. **电流通道也是注电压**:`IA` 注入点同样是电压进 R19 端子侧。这一轮证"给定引脚电压算得对不对",不是"一次侧 1 A 怎么办"——后者要变比,属 `docs/任务规划/登记簿.md §7` 的端子 / 子板变比确认。 4. **电流通道也是注电压**:`IA` 注入点同样是电压进 R19 端子侧。这一轮证"给定引脚电压算得对不对",不是"一次侧 1 A 怎么办"——后者要变比,见 `docs/硬件平台/ADC通道映射说明.md` §7.2 的端子 / 子板变比登记。
### 8.4 记录表抬头(每条用例一份,与日志一起归档) ### 8.4 记录表抬头(每条用例一份,与日志一起归档)
@@ -408,7 +408,7 @@ TPAFE 双极性补码可注负压;STM32 单极性负半周测不了。UA/UN/IA
| 注入分量 | 发生器设定 | UI 读数 (V) | 期望 (V) | 偏差 % | `phasor` 旁证 | 结论 | | 注入分量 | 发生器设定 | UI 读数 (V) | 期望 (V) | 偏差 % | `phasor` 旁证 | 结论 |
|---|---|---|---|---|---|---| |---|---|---|---|---|---|---|
| A 只注二次 | 100.00 Hz / Vpp 0.453 V | `Ia=0` / `Ia2=0.158` / `Ia5=0` | 0.160 / ≈0 | **−1.25 %** | —(A/B 步落在 18:22–18:28 日志盲区,心跳旁证未留) | **过**(±2 % 内;选择性成立——100 Hz 没漏进基波 / 五次桶) | | A 只注二次 | 100.00 Hz / Vpp 0.453 V | `Ia=0` / `Ia2=0.158` / `Ia5=0` | 0.160 / ≈0 | **−1.25 %** | —(A/B 步落在 18:22–18:28 日志盲区,心跳旁证未留) | **过**(±2 % 内;选择性成立——100 Hz 没漏进基波 / 五次桶) |
| B 只注五次 | 250.00 Hz / Vpp 0.453 V | `Ia=0` / `Ia2=0` / `Ia5=0.153`(2026-11-04 复测;11-02 初读 0.152) | ≈0 / 0.160 | **−4.4 %**(超 ±2 %) | —(两轮均未留 250 Hz 心跳旁证——带外信号 `meas:` 判不了,见上卡旁证行) | **过——已按「板端真实衰减」关闭(2026-11-04)**:−4.4 % = IA 前端差分滤波(C35 = 100 nF + R19/R21 各 1 k,一阶低通 fc ≈ 796 Hz)在 250 Hz 的真实衰减,**板端读数忠实,量与算都没错**(模型与数据 `docs/硬件平台/ADC通道映射说明.md` §8.2);工频 50 Hz 仅 −0.2 %,不受影响;选择性成立(基波 / 二次桶 = 0);谐波功能要板改(C35 换 10 nF)——登记 `docs/任务规划/登记簿.md` §3 | | B 只注五次 | 250.00 Hz / Vpp 0.453 V | `Ia=0` / `Ia2=0` / `Ia5=0.153`(2026-11-04 复测;11-02 初读 0.152) | ≈0 / 0.160 | **−4.4 %**(超 ±2 %) | —(两轮均未留 250 Hz 心跳旁证——带外信号 `meas:` 判不了,见上卡旁证行) | **过——已按「板端真实衰减」关闭(2026-11-04)**:−4.4 % = IA 前端差分滤波(C35 = 100 nF + R19/R21 各 1 k,一阶低通 fc ≈ 796 Hz)在 250 Hz 的真实衰减,**板端读数忠实,量与算都没错**(模型与数据 `docs/硬件平台/ADC通道映射说明.md` §8.2);工频 50 Hz 仅 −0.2 %,不受影响;选择性成立(基波 / 二次桶 = 0);谐波功能要板改(C35 换 10 nF)——登记 `docs/任务规划/登记簿.md` §1 |
| C 纯基波 | 50.00 Hz / Vpp 0.453 V(实际按 0.453 注,Vpp 2.263 那档未做) | `Ia=0.160` / `Ia2=0` / `Ia5=0`(2026-11-04 复测;11-02 初读 0.159) | ≈0 / ≈0 | 基波 **0.0 %**(对 0.160 读数;11-02 为 −0.6 %) | **有**:18:33:43 起串口可见窗 `C01 rms=1 / C04 rms=0 / C05 rms=0`,与 C 步工况吻合;2026-11-04 复测窗串口 `ia_mv=159↔160` 同刻印证屏显 | **过**(两谐波轨零值经串口旁证补认;基波读数两轮 ≤0.6 %,与幅值轮同档一致) | | C 纯基波 | 50.00 Hz / Vpp 0.453 V(实际按 0.453 注,Vpp 2.263 那档未做) | `Ia=0.160` / `Ia2=0` / `Ia5=0`(2026-11-04 复测;11-02 初读 0.159) | ≈0 / ≈0 | 基波 **0.0 %**(对 0.160 读数;11-02 为 −0.6 %) | **有**:18:33:43 起串口可见窗 `C01 rms=1 / C04 rms=0 / C05 rms=0`,与 C 步工况吻合;2026-11-04 复测窗串口 `ia_mv=159↔160` 同刻印证屏显 | **过**(两谐波轨零值经串口旁证补认;基波读数两轮 ≤0.6 %,与幅值轮同档一致) |
| 叠加(原行,**本轮不做**) | 基波 + 二次 + 五次同段 | — | — | — | — | 发生器无谐波叠加 / ARB 功能 → 本轮不做·设备缺口·TC-PHASOR-006 单测覆盖(`test/host/phasor/phasor_test.c`,3 条谱线各 ±1 %,实跑 57/57 PASSED) | | 叠加(原行,**本轮不做**) | 基波 + 二次 + 五次同段 | — | — | — | — | 发生器无谐波叠加 / ARB 功能 → 本轮不做·设备缺口·TC-PHASOR-006 单测覆盖(`test/host/phasor/phasor_test.c`,3 条谱线各 ±1 %,实跑 57/57 PASSED) |
@@ -53,7 +53,7 @@ flowchart LR
1. **[agent]** 在 `App/task/ui_task.c` 的扫描函数给 `f_opendir`/`f_readdir` 失败分支加带 FR 码的留痕(顺带修伴生纪律:失败不许钉 `s_wave_scanned=1`)→ `/keil-build` 0 错误 0 警告 → 烧录(`-Rst -Run` + 回读校验,见 `docs/测试说明/测试工具/ST-LINK_CLI_复位使用说明.md`)。 1. **[agent]** 在 `App/task/ui_task.c` 的扫描函数给 `f_opendir`/`f_readdir` 失败分支加带 FR 码的留痕(顺带修伴生纪律:失败不许钉 `s_wave_scanned=1`)→ `/keil-build` 0 错误 0 警告 → 烧录(`-Rst -Run` + 回读校验,见 `docs/测试说明/测试工具/ST-LINK_CLI_复位使用说明.md`)。
2. **[agent]** 等 30 s 装置起来 → 远程走 UI 开回放页 → 串口读那条带 FR 码的新留痕。 2. **[agent]** 等 30 s 装置起来 → 远程走 UI 开回放页 → 串口读那条带 FR 码的新留痕。
3. **你对结果做一次定性**(agent 会把原文贴给你):FR_DENIED → 锁纪律;FR_NO_PATH/FR_NOT_READY → 路径或挂载;FR_OK 但零条目 → readdir 与卷状态交互——**根因入登记簿,这条销项**。 3. **你对结果做一次定性**(agent 会把原文贴给你):FR_DENIED → 锁纪律;FR_NO_PATH/FR_NOT_READY → 路径或挂载;FR_OK 但零条目 → readdir 与卷状态交互——**根因入 `docs/子系统设计/故障录波设计说明.md` §10,这条销项**。
4. **[agent]** 按根因出修复构建,重烧重验:回放页开屏应列出 WAVE00…05 六段、`↑↓` 切道 `←→` 切段照常、`l` 切段不再空。 4. **[agent]** 按根因出修复构建,重烧重验:回放页开屏应列出 WAVE00…05 六段、`↑↓` 切道 `←→` 切段照常、`l` 切段不再空。
5. **要烧几次板,都由 agent 盯**;你只在会话里看到"请确认烧录"时回一个"烧"字(烧录动作属 Ask-first 边界,agent 不会自己烧)。 5. **要烧几次板,都由 agent 盯**;你只在会话里看到"请确认烧录"时回一个"烧"字(烧录动作属 Ask-first 边界,agent 不会自己烧)。
@@ -103,7 +103,7 @@ flowchart LR
**先讲人话**:过流启动录波的代码路已接在 `protect_task.c` 的启动边沿上(判据一 picked,录波同拍请求),但**保护判据现在整机闭锁**——`adc_cal_flags()` 的 VALID 位对 UA/UN/IA 三路都没置位,`protect_task` 直接停走判据。要让保护真出口,**必须先把这三路标定**;这正是 2026-10-25 你裁定"保持闭锁、不用万用表走捷径"守着的那道门。 **先讲人话**:过流启动录波的代码路已接在 `protect_task.c` 的启动边沿上(判据一 picked,录波同拍请求),但**保护判据现在整机闭锁**——`adc_cal_flags()` 的 VALID 位对 UA/UN/IA 三路都没置位,`protect_task` 直接停走判据。要让保护真出口,**必须先把这三路标定**;这正是 2026-10-25 你裁定"保持闭锁、不用万用表走捷径"守着的那道门。
- **决定一(解锁)**:这一幕要不要用**发生器为参考**给 UA/UN/IA 做两点标定换保护触发路(src=P)验证?它**不是送检级标定**(端子变比还挂着 `docs/任务规划/登记簿.md §7` 的原理图确认),做出来的工程量是"发生器刻度下的近似值"。**点头 → 往下走;摇头 → 第三幕整体顺延到标准源轮,本文其余各幕照做。** - **决定一(解锁)**:这一幕要不要用**发生器为参考**给 UA/UN/IA 做两点标定换保护触发路(src=P)验证?它**不是送检级标定**(端子变比是按参数算定的标称值,见 `docs/硬件平台/ADC通道映射说明.md` §7.2),做出来的工程量是"发生器刻度下的近似值"。**点头 → 往下走;摇头 → 第三幕整体顺延到标准源轮,本文其余各幕照做。**
- **决定二(还锁)**:这一幕验完,把标定清回闭锁(还原出厂系数)还是**留着 valid** 让保护继续在线(此后 UI 显示与 104 遥测的二次值都按这份近似标定出数——**留着就要在台账注明非送检级**)。 - **决定二(还锁)**:这一幕验完,把标定清回闭锁(还原出厂系数)还是**留着 valid** 让保护继续在线(此后 UI 显示与 104 遥测的二次值都按这份近似标定出数——**留着就要在台账注明非送检级**)。
步骤(决定一通过后): 步骤(决定一通过后):
@@ -143,7 +143,7 @@ flowchart LR
- [ ] `FILLER.BIN` 已从 `/` 删除;`/WAVE` 里**只剩真实段**(坏段样本若留着,在 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」里点名它是坏段,回放页翻到必须显拒收态——留着当常设负样本也行,二选一并记录) - [ ] `FILLER.BIN` 已从 `/` 删除;`/WAVE` 里**只剩真实段**(坏段样本若留着,在 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」里点名它是坏段,回放页翻到必须显拒收态——留着当常设负样本也行,二选一并记录)
- [ ] 标定与定值按**决定二**处置完毕,处置结果已写进 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」的后续小节 - [ ] 标定与定值按**决定二**处置完毕,处置结果已写进 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」的后续小节
- [ ] 设备跑的是**产品构建**且启动锚点全过;UI 停在主菜单;两把锁(build/bench)空闲 - [ ] 设备跑的是**产品构建**且启动锚点全过;UI 停在主菜单;两把锁(build/bench)空闲
- [ ] 现场记录表数值入档、抓屏证据归档到会话的 `ci-artifacts/wavebench/`,`docs/子系统设计/故障录波设计说明.md` §10 状态与登记簿同步销项 - [ ] 现场记录表数值入档、抓屏证据归档到会话的 `ci-artifacts/wavebench/`,`docs/子系统设计/故障录波设计说明.md` §10 状态同步更新
## 8. 出问题怎么办(三条,都别硬试) ## 8. 出问题怎么办(三条,都别硬试)
@@ -160,4 +160,4 @@ flowchart LR
| 中 | 第三幕(保护触发) | 30~60 min(含两个决定) | **是**(多点注入接线 + 加流) | | 中 | 第三幕(保护触发) | 30~60 min(含两个决定) | **是**(多点注入接线 + 加流) |
| 后 | 第四幕(bench 占卷) | 20~30 min | 否 | | 后 | 第四幕(bench 占卷) | 20~30 min | 否 |
第二、三幕共用同一次到场(都在 UA/IA 端子上做文章);第一、四幕可以排在任意工作日远程做。**四幕全过 = 录波本波收口**——`docs/任务规划/README.md` §2.0「独立」行的"一轮未跑"字样就可以清了。 第二、三幕共用同一次到场(都在 UA/IA 端子上做文章);第一、四幕可以排在任意工作日远程做。**四幕全过 = 录波本波收口**——届时把 `docs/任务规划/README.md` §2.0「独立」行里“还没跑的”那三项清掉。
@@ -444,7 +444,7 @@ med 65.0ms/max 133.5ms(133.5 = 压力启动瞬态单帧);**挂起 recv 化
¹ 队列往返两行为 2026-09-22 上午分片时代(M2 RS-485 采集链路 档)数值:发送分块握手对 DONTWAIT 快速路径**逐位不变**(dispatch ¹ 队列往返两行为 2026-09-22 上午分片时代(M2 RS-485 采集链路 档)数值:发送分块握手对 DONTWAIT 快速路径**逐位不变**(dispatch
→ `net_poll` → `get_recv_len` 读,无 readable 门控),pending tick 无 pending 时为纯指针读零 SPI → `net_poll` → `get_recv_len` 读,无 readable 门控),pending tick 无 pending 时为纯指针读零 SPI
(µs 级)——机制上不影响队列往返;M2 重验未在本轮执行(低风险,留待 Phase 13 下次窗口,见 `docs/任务规划/README.md` 条目「队列往返基线待重验」)。 (µs 级)——机制上不影响队列往返;M2 重验未在本轮执行(低风险,留待 Phase 13 下次窗口;该项未闭环,见 `docs/测试说明/板级测试/实机测试实施指南.md` §7.3)。
数据来源:SPI 字节命令/SPI DMA = §6.1;发送分块握手/队列往返/请求→首字节/整帧 3209B 往返 = M2 RS-485 采集链路 档(200ms、per-recv 日志已删)串口 `[LAT]` 行 数据来源:SPI 字节命令/SPI DMA = §6.1;发送分块握手/队列往返/请求→首字节/整帧 3209B 往返 = M2 RS-485 采集链路 档(200ms、per-recv 日志已删)串口 `[LAT]` 行
(`../测试数据/m2_data/m2_quiet_r200.json`);生产路径帧周期/连接/重监听/uiTask 节拍 = **挂起 recv 构建 2026-09-22 16:42/16:43 重锁** (`../测试数据/m2_data/m2_quiet_r200.json`);生产路径帧周期/连接/重监听/uiTask 节拍 = **挂起 recv 构建 2026-09-22 16:42/16:43 重锁**
@@ -263,6 +263,6 @@ test/host/adc_input/adc_input_test.c
### 4.3 不覆盖 V0.1 的硬件缺陷(双转换器无共同采样触发) ### 4.3 不覆盖 V0.1 的硬件缺陷(双转换器无共同采样触发)
V0.1 上 8 路电气量分属两片转换器且**无共同采样触发**(登记簿条目「双转换器无共同采样触发」),本层只做**逐通道独立监视**。 V0.1 上 8 路电气量分属两片转换器且**无共同采样触发**(`docs/任务规划/登记簿.md` §1),本层只做**逐通道独立监视**。
"跨转换器相量合成"(线 / 负序 / 零序)不得在本层或 全周傅氏相量上做——属「线/负序/零序合成」且 V0.1 受限 "跨转换器相量合成"(线 / 负序 / 零序)不得在本层或 全周傅氏相量上做——属「线/负序/零序合成」且 V0.1 受限
(见 `docs/算法/继电保护功能复现规划.md` §1.6)。 (见 `docs/算法/继电保护功能复现规划.md` §1.6)。
@@ -1133,7 +1133,7 @@ WAIT_CLOSE 阶段已内置二段补发(只补一次),生产 net 层则靠
主机单测(`test/host/net_socket/ns_s7_udp.c`,`docs/测试说明/单元测试/主机单测覆盖率口径.md` 第 4 轮) 主机单测(`test/host/net_socket/ns_s7_udp.c`,`docs/测试说明/单元测试/主机单测覆盖率口径.md` 第 4 轮)
把逻辑面钉死了,但芯片行为——DesIP 生效时机、UDP 的 SINT 触发、读指针上的残包排空——在桩里怎么编都"对"。 把逻辑面钉死了,但芯片行为——DesIP 生效时机、UDP 的 SINT 触发、读指针上的残包排空——在桩里怎么编都"对"。
**这句话在 2026-11-04 被兑现了:桩里全绿的"按形态决定剥不剥",真机第一轮就翻车**(见下面「实测把设计改写了」)。 **这句话在 2026-11-04 被兑现了:桩里全绿的"按形态决定剥不剥",真机第一轮就翻车**(见下面「实测把设计改写了」)。
下面 5 条就是那轮登记簿留下的「台架必验」的可执行形态。 下面 5 条就是那轮留下的「台架必验」的可执行形态。
**架构**:板端一个 UDP socket,先 `net_bind(:6001)` 做服务端,再从收到的包里学对端地址回显。 **架构**:板端一个 UDP socket,先 `net_bind(:6001)` 做服务端,再从收到的包里学对端地址回显。
**必须板端先听**:PC 侧是 DHCP(本轮实测 192.168.31.161),`net_test_task.h` 里那个 **必须板端先听**:PC 侧是 DHCP(本轮实测 192.168.31.161),`net_test_task.h` 里那个
@@ -5,8 +5,7 @@
> **已完成事项**(S7、A1~A4)的实施细节与证据**不在本文**,见对应模块文档(§10 状态与去向)。 > **已完成事项**(S7、A1~A4)的实施细节与证据**不在本文**,见对应模块文档(§10 状态与去向)。
> **前置铁律**:本文所有步骤**均在接上 MCU / 串口 / ST-LINK 之后**执行; > **前置铁律**:本文所有步骤**均在接上 MCU / 串口 / ST-LINK 之后**执行;
> 无实机时**只读本文,不执行任何烧录**。 > 无实机时**只读本文,不执行任何烧录**。
> **上游**:`docs/任务规划/README.md`(统一登记簿:P-x / N·S·T-x / > **上游**:`docs/任务规划/README.md`(全项目阶段排序)·
> S1x·A-x / 阶段排序 / 诊断基线)·
> `子系统设计/看门狗设计说明.md`(§7 验证记录)。 > `子系统设计/看门狗设计说明.md`(§7 验证记录)。
> **约定**:本文事项完成后**先销上游登记**,再把结论写进正文对应小节(本文不再记流水,过程查 `git log`); > **约定**:本文事项完成后**先销上游登记**,再把结论写进正文对应小节(本文不再记流水,过程查 `git log`);
> 结论与证据沉淀进对应模块文档/问题记录(2026-10-02 台架窗口的完整取证链—— > 结论与证据沉淀进对应模块文档/问题记录(2026-10-02 台架窗口的完整取证链——
@@ -101,7 +100,7 @@
> **2026-10-03 台架结论**(实施细节与证据见 `子系统设计/看门狗设计说明.md` 变更记录): > **2026-10-03 台架结论**(实施细节与证据见 `子系统设计/看门狗设计说明.md` 变更记录):
> V2/V4/V5 三用例全部通过——V2(任务饿死)声明 stall 后 ≤2.5s `reset cause: IWDG`;V4(关中断死循环)每 ~4.9s 稳定 IWDG 复位(IWDG 独立于中断);V5(30 min 真实负载)**120/120 次 FTP 传输全 PASS、零 IWDG 复位**。 > V2/V4/V5 三用例全部通过——V2(任务饿死)声明 stall 后 ≤2.5s `reset cause: IWDG`;V4(关中断死循环)每 ~4.9s 稳定 IWDG 复位(IWDG 独立于中断);V5(30 min 真实负载)**120/120 次 FTP 传输全 PASS、零 IWDG 复位**。
> **遗留观察**:V5 期间 44 次 stall 声明 100% 与 `e02_probe` 探针的 time_sync 30s 掉线+监听重建重合;隔离实验(仅 FTP 120s)**0 次 stall** → 探针场景专属,非一般负载误杀(已登记 `docs/任务规划/登记簿.md`)。 > **遗留观察**:V5 期间 44 次 stall 声明 100% 与 `e02_probe` 探针的 time_sync 30s 掉线+监听重建重合;隔离实验(仅 FTP 120s)**0 次 stall** → 探针场景专属,非一般负载误杀(结论留本节)。
> 来源:`子系统设计/看门狗设计说明.md` §7 验证记录(原实施步骤已并入该文档文末变更记录)。 > 来源:`子系统设计/看门狗设计说明.md` §7 验证记录(原实施步骤已并入该文档文末变更记录)。
> 判定状态机与 IWDG 配置(PR/RLR 按设计值写入)已落地并经真机验证(2026-10-02,`930215f`, > 判定状态机与 IWDG 配置(PR/RLR 按设计值写入)已落地并经真机验证(2026-10-02,`930215f`,
@@ -251,12 +250,12 @@ time_sync 触发形态,退役后该触发场景不再存在。
- **正常路径 ✅**:V5 长跑(30 min,FTP 512 KB 上/下传)**120/120 PASS、零 IWDG 复位**, - **正常路径 ✅**:V5 长跑(30 min,FTP 512 KB 上/下传)**120/120 PASS、零 IWDG 复位**,
网络重建后的 FTP/time_sync 服务据代次号重建监听、功能正常(证据 `/tmp/v5_soak_serial_20261003.log`)。 网络重建后的 FTP/time_sync 服务据代次号重建监听、功能正常(证据 `/tmp/v5_soak_serial_20261003.log`)。
- **负向路径(拔线/芯片级 `net_init` 失败)**受**台架拓扑**限制(CH395↔交换机, - **负向路径(拔线/芯片级 `net_init` 失败)**受**台架拓扑**限制(CH395↔交换机,
拔交换机侧线缆链路仍 UP;芯片级失败需 SPI 故障注入)→ 已登记 `docs/任务规划/登记簿.md` 条目「网络负向场景台架验证」 拔交换机侧线缆链路仍 UP;芯片级失败需 SPI 故障注入)→ 这三条负向场景(① PHY 拔线 ② A2 `net_init` 失败分支 ③ A4 短写压测)
(① PHY 拔线负向 ② A2 `net_init` 失败分支 ③ A4 短写压测),需专项窗口。 仍待专项台架窗口,判据与现状即本节,别处不另存一份。
### 7.2 日志静默观察项:49s 全系统日志静默复现与定位 · ✅ 判据②已满足 / 判据①未复现 ### 7.2 日志静默观察项:49s 全系统日志静默复现与定位 · ✅ 判据②已满足 / 判据①未复现
**现状证据**(登记簿条目「日志静默观察项」):2026-09-22 台架实测,串口日志 **49s 无行** **现状证据**:2026-09-22 台架实测,串口日志 **49s 无行**
(testTask/netTask/[STACK] 行全缺),期间 net 栈照常处理外部连接 → **日志管线停滞**, (testTask/netTask/[STACK] 行全缺),期间 net 栈照常处理外部连接 → **日志管线停滞**,
队列满后各任务日志行被丢;系统功能不受损。 队列满后各任务日志行被丢;系统功能不受损。
@@ -471,7 +470,7 @@ CH395F / STORAGE / GD5F,未含 RTC;怀疑 RTC 构建下 `testTask` 不被创
| 2026-10-02 台架取证链(IWDG PR/RLR 错配 / dhara resume 回滚 / ORE 僵尸通道) | ✅ 已修 | `子系统设计/看门狗设计说明.md` 2026-10-02 变更记录 · `架构设计/STM32F4-Base存储架构说明.md` §5.4.1 · `子系统设计/控制台单写者日志设计说明.md` §12;提交 `930215f` | | 2026-10-02 台架取证链(IWDG PR/RLR 错配 / dhara resume 回滚 / ORE 僵尸通道) | ✅ 已修 | `子系统设计/看门狗设计说明.md` 2026-10-02 变更记录 · `架构设计/STM32F4-Base存储架构说明.md` §5.4.1 · `子系统设计/控制台单写者日志设计说明.md` §12;提交 `930215f` |
> **真机判定汇总**(2026-10-03,本机 MCU,新固件全闭环 `@test` PASS 7/7):A1 ✅ PASS(含配置持久化); > **真机判定汇总**(2026-10-03,本机 MCU,新固件全闭环 `@test` PASS 7/7):A1 ✅ PASS(含配置持久化);
> A2/A3/A4 正常路径零回归;芯片级失败分支 / 短写 / 拔线负向场景记 `docs/任务规划/登记簿.md` 条目「网络负向场景台架验证」,待专项台架窗口。 > A2/A3/A4 正常路径零回归;芯片级失败分支 / 短写 / 拔线负向场景待专项台架窗口(判据见 §7.1)。
--- ---
@@ -483,7 +482,7 @@ CH395F / STORAGE / GD5F,未含 RTC;怀疑 RTC 构建下 `testTask` 不被创
| V2/V4/V5 | `子系统设计/看门狗设计说明.md` §7 验证记录 | `子系统设计/看门狗设计说明.md` 变更记录(2026-10-03) | | V2/V4/V5 | `子系统设计/看门狗设计说明.md` §7 验证记录 | `子系统设计/看门狗设计说明.md` 变更记录(2026-10-03) |
| S11 堆告警 | —(原复审项,已闭环 2026-10-03) | `内存管理/RAM使用分析与优化方案.md`(基线更新) | | S11 堆告警 | —(原复审项,已闭环 2026-10-03) | `内存管理/RAM使用分析与优化方案.md`(基线更新) |
| S9 GD5F | —(第二档 #1) | `问题记录/GD5F2GQ5UE_Trap_Records.md`、`docs/测试说明/板级测试/GD5F2GQ5UE_Test_Guide.md` | | S9 GD5F | —(第二档 #1) | `问题记录/GD5F2GQ5UE_Trap_Records.md`、`docs/测试说明/板级测试/GD5F2GQ5UE_Test_Guide.md` |
| 日志静默观察项 | `docs/任务规划/登记簿.md` | `网络/Net层阻塞模型架构设计.md`(头阻塞,历史编号) | | 日志静默观察项 | 本文 §7.2(原上游登记簿已清空,本文即其归属) | `网络/Net层阻塞模型架构设计.md`(头阻塞,历史编号) |
| 网络重建 | —(原台账项,已闭环 2026-10-02) | `网络/Net层阻塞模型架构设计.md` | | 网络重建 | —(原台账项,已闭环 2026-10-02) | `网络/Net层阻塞模型架构设计.md` |
| S5/S4 | —(原复审项,已闭环 2026-10-03) | `docs/测试说明/流程与规范/测试开发标准流程.md` | | S5/S4 | —(原复审项,已闭环 2026-10-03) | `docs/测试说明/流程与规范/测试开发标准流程.md` |
| 模拟器差距 | `docs/测试说明/专项验证/模拟器差距清单.md` §3 决策规则 | 本文为"需回真机"项的执行面 | | 模拟器差距 | `docs/测试说明/专项验证/模拟器差距清单.md` §3 决策规则 | 本文为"需回真机"项的执行面 |
@@ -10,4 +10,4 @@ e5dc076bc4c975eac92f93b2db8e0e81 相位轮 0°/90° 段原件(触发 19:15:32
b853cd0c34d3698184782a32cb34c2d2 无归属切换瞬态段(触发 19:22:19,UA 1408 mVpk 瞬态,不判任何行,留证溯源) 5250 B 20261104_ac_unattributed_wave10.BIN b853cd0c34d3698184782a32cb34c2d2 无归属切换瞬态段(触发 19:22:19,UA 1408 mVpk 瞬态,不判任何行,留证溯源) 5250 B 20261104_ac_unattributed_wave10.BIN
599e8c5b79a590089f3bd47134c2e1be 6442 B 20261104_ac_wave09_scriptout.txt 599e8c5b79a590089f3bd47134c2e1be 6442 B 20261104_ac_wave09_scriptout.txt
783b45fe3fcf5034a0a84954c34a2d5d 6033 B 20261104_ac_wave10_11_scriptout.txt 783b45fe3fcf5034a0a84954c34a2d5d 6033 B 20261104_ac_wave10_11_scriptout.txt
236c34c4f33105d7c653f7939d3a2e3c 谐波 B 行归因证据:前端差分 RC 三点拟合模型输出(脚本 ia_rc_model.py,见登记簿 §3 与通道映射 §8.2) 818 B 20261104_ac_ia_rc_model.txt 236c34c4f33105d7c653f7939d3a2e3c 谐波 B 行归因证据:前端差分 RC 三点拟合模型输出(脚本 ia_rc_model.py,见登记簿 §1 与通道映射 §8.2) 818 B 20261104_ac_ia_rc_model.txt
@@ -36,8 +36,7 @@
当时那 56 条早被后续台架长跑覆盖,**不可复现、不可重生成**。把它写成「可由脚本重新生成」= 新造一条无法 当时那 56 条早被后续台架长跑覆盖,**不可复现、不可重生成**。把它写成「可由脚本重新生成」= 新造一条无法
核实的断言,比现在这条断链更糟(这正是本卡要修的毛病,不能拿一个新毛病换一个旧毛病)。 核实的断言,比现在这条断链更糟(这正是本卡要修的毛病,不能拿一个新毛病换一个旧毛病)。
- 体积可忽略:两个文件合计 **6,528 B**(2,944 + 3,584,64 B/条的裸记录),比同目录**已入库**的两份解码 - 体积可忽略:两个文件合计 **6,528 B**(2,944 + 3,584,64 B/条的裸记录),比同目录**已入库**的两份解码
文本 `20261012_B9_soe_decode_pre.txt` / `20261012_B9_soe_decode_post.txt`(7,861 + 9,521 B)还小;对登记簿 文本 `20261012_B9_soe_decode_pre.txt` / `20261012_B9_soe_decode_post.txt`(7,861 + 9,521 B)还小;对仓库体积(.git 约 233 MB)没有可测影响。
「仓库体积膨胀观察」那条(.git 约 233 MB)没有可测影响。
- 不放宽任何规则:全局 `*.bin` 与 `simulator/tests/ref/*.bin` 的显式反选(`.gitignore` 第 130 行)**都不动**, - 不放宽任何规则:全局 `*.bin` 与 `simulator/tests/ref/*.bin` 的显式反选(`.gitignore` 第 130 行)**都不动**,
只对这两个具名文件各 `git add -f` 一次。入库理由要与黄金参考区分开:那边入库是因为它是**判据本体** 只对这两个具名文件各 `git add -f` 一次。入库理由要与黄金参考区分开:那边入库是因为它是**判据本体**
(不入库则新克隆上这条门禁直接不存在),这边入库是因为它是**不可复现的原始证据**——理由不同, (不入库则新克隆上这条门禁直接不存在),这边入库是因为它是**不可复现的原始证据**——理由不同,
@@ -14,7 +14,7 @@
## 1. 目的与范围 ## 1. 目的与范围
**要解决的问题**:多个任务同时推进时,若共用同一个工作目录,会互相踩——构建产物、日志目录、 **要解决的问题**:多个任务同时推进时,若共用同一个工作目录,会互相踩——构建产物、日志目录、
Python 环境、以及 `docs/任务规划/` 这类**全局唯一登记簿**都会被并发写坏。 Python 环境、以及 `docs/任务规划/` 这类**全局唯一顺序权威**都会被并发写坏。
**做法**:每个任务一棵 `git worktree` + 一条任务分支,任务之间物理隔离;干完由固定命令合回主干。 **做法**:每个任务一棵 `git worktree` + 一条任务分支,任务之间物理隔离;干完由固定命令合回主干。
@@ -127,11 +127,11 @@ D:/Code/DTU Code/
| -------- | ---------------------------------------------------------------------------------------------------- | | -------- | ---------------------------------------------------------------------------------------------------- |
| 集成分支(主干) | `v2-on-ui` | | 集成分支(主干) | `v2-on-ui` |
| 任务分支 | `task/<ID>-<slug>`,从主干当前 HEAD 切出 | | 任务分支 | `task/<ID>-<slug>`,从主干当前 HEAD 切出 |
| `<ID>` | **沿用 `docs/任务规划/README.md` 的编号空间**(`P0-x`/`N-x`/`S-x`/`T-x`/`B-x`/`C-x`/`D-x`);无对应条目的临时任务用 `X-<日期>-<slug>` | | `<ID>` | **语义短语**(如 `wave-replay-fix`),对应 `docs/任务规划/README.md` §2 顺序表里的那一行;纯临时任务用 `<日期>-<slug>` |
| 合并方式 | `git merge --no-ff` 合入主干 | | 合并方式 | `git merge --no-ff` 合入主干 |
| 并发上限 | **同时最多 8 棵登记工作树**(2026-10-29 由 3 上调,用户裁定;另有插件树不计入,见 §3.4) | | 并发上限 | **同时最多 8 棵登记工作树**(2026-10-29 由 3 上调,用户裁定;另有插件树不计入,见 §3.4) |
**`<ID>` 复用登记簿编号**是为了可追溯:任务分支名直接对应待办条目,回收时销项有据可查。 **`<ID>` 用语义短语**是为了可追溯:任务分支名直接对应待办条目,回收时销项有据可查。
**并发上限的依据**(2026-10-29 由 3 上调到 8,用户裁定;脚本常量 `MAX_CONCURRENT`): **并发上限的依据**(2026-10-29 由 3 上调到 8,用户裁定;脚本常量 `MAX_CONCURRENT`):
磁盘从来不是这条线的硬约束——实测一棵纯净检出 **84.0 MiB / 2857 个受控文件**(含 LFS smudge 磁盘从来不是这条线的硬约束——实测一棵纯净检出 **84.0 MiB / 2857 个受控文件**(含 LFS smudge
@@ -167,12 +167,12 @@ D:/Code/DTU Code/
### 6.1 单写者文档 ### 6.1 单写者文档
并行失败通常不是代码冲突,而是**多个任务同时改同一个「登记簿」**。以下文件在任务期间 并发失败通常不是代码冲突,而是**多个任务同时改同一个共享索引**。以下文件在任务期间
**禁止在任务工作树里修改**,一律由 `done` 回收阶段在主工作树统一处理: **禁止在任务工作树里修改**,一律由 `done` 回收阶段在主工作树统一处理:
| 文件 | 冲突原因 | 回收时的处理 | | 文件 | 冲突原因 | 回收时的处理 |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `docs/任务规划/`(整个文件夹) | 全项目唯一登记簿,每个任务都要销项 | 由主工作树统一改,任务分支不碰 | | `docs/任务规划/`(整个文件夹) | 全项目顺序唯一权威,任务销项时要改 | 由主工作树统一改,任务分支不碰 |
| `AGENTS.md`、`docs/README.md`(索引/登记类) | 每个任务都要在 AGENTS.md 的「按主题查哪份文档」表、`docs/README.md` §9.2 环境表、`docs/README.md` 的文档索引表里**各加一行** → 同一张表的新增行两任务必撞(2026-10-12 实测:主工作树里本任务的行与他任务的行已并排混在**同一 hunk**)。变更记录那一路**不再是冲突面**:2026-10-28 起新文档一律不设变更记录节(`docs/文档规范.md` §5.1),存量也只剩 5 篇台账/证据文档 | 由主工作树统一追加;提交时**只 `git add` 本任务的行**(`git apply --cached` 选择性入库),勿整文件 `git add` | | `AGENTS.md`、`docs/README.md`(索引/登记类) | 每个任务都要在 AGENTS.md 的「按主题查哪份文档」表、`docs/README.md` §9.2 环境表、`docs/README.md` 的文档索引表里**各加一行** → 同一张表的新增行两任务必撞(2026-10-12 实测:主工作树里本任务的行与他任务的行已并排混在**同一 hunk**)。变更记录那一路**不再是冲突面**:2026-10-28 起新文档一律不设变更记录节(`docs/文档规范.md` §5.1),存量也只剩 5 篇台账/证据文档 | 由主工作树统一追加;提交时**只 `git add` 本任务的行**(`git apply --cached` 选择性入库),勿整文件 `git add` |
| `AGENTS.md` 的 `TASK_TABLE` 块 | 生成物,两个任务都抬栈就冲突 | 合并后重跑 `scripts/gen_task_table.py` **重新生成**,不手工并 | | `AGENTS.md` 的 `TASK_TABLE` 块 | 生成物,两个任务都抬栈就冲突 | 合并后重跑 `scripts/gen_task_table.py` **重新生成**,不手工并 |
| `MDK-ARM/STM32F407-Demo.uvprojx` | 新源文件注册 + UV4 自动改写 | 手工并 `<File>` 条目 → 重跑 `registration-check` → `/keil-build` | | `MDK-ARM/STM32F407-Demo.uvprojx` | 新源文件注册 + UV4 自动改写 | 手工并 `<File>` 条目 → 重跑 `registration-check` → `/keil-build` |
@@ -238,7 +238,7 @@ D:/Code/DTU Code/
### 7.3 并行道与写范围规则(规划层 ↔ 执行层映射) ### 7.3 并行道与写范围规则(规划层 ↔ 执行层映射)
规划层(任务卡在 `docs/任务规划/登记簿.md §7`,其余待办在 `docs/任务规划/登记簿.md`); 规划层(全项目顺序在 `docs/任务规划/README.md` §2,设计类待办在各模块文档);
五字段 = **DoD / 硬依赖 / 资源 / 写范围 / 状态**) 五字段 = **DoD / 硬依赖 / 资源 / 写范围 / 状态**)
按**资源属性**把任务切进三条道,本方案(工作树 + 锁)是它的执行层: 按**资源属性**把任务切进三条道,本方案(工作树 + 锁)是它的执行层:
@@ -250,15 +250,15 @@ D:/Code/DTU Code/
**四条规则**: **四条规则**:
1. **WIP ≤ 2**:每道最多 1 个进行中(典型 = 台架道 1 + 代码道 1),先完再开——登记簿需可见 1. **WIP ≤ 2**:每道最多 1 个进行中(典型 = 台架道 1 + 代码道 1),先完再开——进度需可见
`⬜ 未开始 / 🟦 进行中` 两态,销项仍删行。 `⬜ 未开始 / 🟦 进行中` 两态,销项仍删行。
2. **写范围相交 = 声明合并次序**:任务卡必须写写范围(目录级);相交不排队等待,而是**声明谁先合** 2. **写范围相交 = 声明合并次序**:任务卡必须写写范围(目录级);相交不排队等待,而是**声明谁先合**
(后合者在主工作树 rebase 后继续),claim 时定。 (后合者在主工作树 rebase 后继续),claim 时定。
3. **分支存活 ≤2 天、绿即合**:合并走 `done` 预演(§6.3);单写者文档(§6.1)仍由主工作树统一处理。 3. **分支存活 ≤2 天、绿即合**:合并走 `done` 预演(§6.3);单写者文档(§6.1)仍由主工作树统一处理。
4. **里程碑不拖延、功能顺延下一轮**(时间驱动):里程碑的退出判据写在登记簿,判据不满足则该**功能** 4. **里程碑不拖延、功能顺延下一轮**(时间驱动):里程碑的退出判据写在任务所属文档,判据不满足则该**功能**
移入下一波次,里程碑本身按判据改期而非无限等待。 移入下一波次,里程碑本身按判据改期而非无限等待。
> 登记簿是规划层唯一权威(§2 铁律不变);本节只定义执行层映射,**不在本文排任务顺序**。 > 规划层唯一权威仍是 `docs/任务规划/README.md` §2;本节只定义执行层映射,**不在本文排任务顺序**。
--- ---
@@ -439,4 +439,4 @@ docs\内存管理\RAM使用分析与优化方案.md:585 [路径引用] docs/内
| 自动化测试与台架流程 | `docs/测试说明/流程与规范/自动化测试流程.md` | | 自动化测试与台架流程 | `docs/测试说明/流程与规范/自动化测试流程.md` |
| 文档写作规范(编码/链接/登记) | `docs/文档规范.md` | | 文档写作规范(编码/链接/登记) | `docs/文档规范.md` |
| 工具路径环境变量(换机) | `docs/环境与部署/本地工具路径环境变量方案.md` | | 工具路径环境变量(换机) | `docs/环境与部署/本地工具路径环境变量方案.md` |
| 待办与排序登记簿 | `docs/任务规划/README.md` | | 待办与排序 | `docs/任务规划/README.md` |
@@ -543,7 +543,7 @@ $env:DTU_KEIL_UV4 = 'D:\NotExist\UV4.exe' # 仅当前会话,不动用户级
| 开关 | 位置 | 当前值 | 说明 | | 开关 | 位置 | 当前值 | 说明 |
|---|---|---|---| |---|---|---|---|
| 功能裁剪开关 | — | 无 | **当前没有任何可裁剪的编译开关**(2026-10-22):原 `APP_NET_ENABLE` / `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 三个宏全库零消费点,已于 2026-10-22 删除,`App/app/app_cfg.h` 只留决策占位说明。要不要真实门控取决于产品定义(开放问题见 `docs/任务规划/登记簿.md` §9);在此之前各模块一律编译进产品 | | 功能裁剪开关 | — | 无 | **当前没有任何可裁剪的编译开关**(2026-10-22):原 `APP_NET_ENABLE` / `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 三个宏全库零消费点,已于 2026-10-22 删除,`App/app/app_cfg.h` 只留决策占位说明。要不要真实门控取决于产品定义(属产品口径,未定);在此之前各模块一律编译进产品 |
| `TEST_SUITE_*` | `test/board/test_config.h` | 全注释(产品构建) | 测试套件**互斥**:一次构建只开一个(CH395F / 存储 / GD5F / RTC);全注释 = 正常产品固件 | | `TEST_SUITE_*` | `test/board/test_config.h` | 全注释(产品构建) | 测试套件**互斥**:一次构建只开一个(CH395F / 存储 / GD5F / RTC);全注释 = 正常产品固件 |
--- ---
+4 -4
View File
@@ -253,7 +253,7 @@ STM32(U17)为 LQFP144 脚号。
**观察项(都判读过、非缺陷)**:TPAFE 输入浮空读数钉在 ≈1743/1747 mV 静态(撤线后 UA/IA 出现——读 `meas:` 时先确认接线);未接线的 STM32 侧引脚码值随环境缓漂(UC/IC/IN/T),不消费即可;录波触发后 `drop` 涨一截是 SEALED 窗口设计内(`App/algo/wave_ring.c:50`,涨完冻结,判失败只看 `err`/`ovf`);采集链全程 Δ9998/10 s、`idle=0`、`adc1_err=0`(前置门 8 条全过)。 **观察项(都判读过、非缺陷)**:TPAFE 输入浮空读数钉在 ≈1743/1747 mV 静态(撤线后 UA/IA 出现——读 `meas:` 时先确认接线);未接线的 STM32 侧引脚码值随环境缓漂(UC/IC/IN/T),不消费即可;录波触发后 `drop` 涨一截是 SEALED 窗口设计内(`App/algo/wave_ring.c:50`,涨完冻结,判失败只看 `err`/`ovf`);采集链全程 Δ9998/10 s、`idle=0`、`adc1_err=0`(前置门 8 条全过)。
**IA 前端差分滤波 = 低通 fc ≈ 796 Hz**:C35 = 100 nF 跨接差分对,与 R19/R21 各 1 k([`V0.1.tel`](V0.1.tel):49)构成一阶低通;拓扑为 1 k 串联 + 1 k 接差分负端、不分压(`docs/产品需求/产品需求设计文档.md` FR-ADC-5)。**250 Hz 的 −4.4 % 就是这颗电容在该频点的真实衰减,板端读数忠实**,工频 50 Hz 仅 −0.2 % 不受影响。谐波测量不够用——同拓扑外推:5 次 ≈ −4.6 %(出 ±2 % 判据)、7 次 −8.5 %、9 次 −13.0 %、11 次 −17.7 %、13 次 −22.6 %、15 次 −27.2 %、21 次(1050 Hz)−39.6 %;C35 改 10 nF 则 fc ≈ 8 kHz、21 次仅 −0.9 %。**谐波功能产品化的硬件前置 = 板改小 C35 + 清点其余各路差分滤波电容容值**(登记 `docs/任务规划/登记簿.md` §3)。**为什么改板而不是软件逐阶修正**:修正系数依赖这颗电容的实际容值,而它有容差、随温度漂,每块板、每个温度都不一样,修正表跟不上;二次谐波制动这类“拿某次谐波幅值与基波比值”的判据,比值被前端畸变后判定就不可信。换 10 nF 后测量带内是平的,板端读数直接可信。证伪条件(有示波器再复核):该低通预测 250 Hz 差分分量额外滞后 ≈17°;模型与三点拟合 `docs/测试说明/测试数据/boot_log_data/20261104_ac_ia_rc_model.txt`。 **IA 前端差分滤波 = 低通 fc ≈ 796 Hz**:C35 = 100 nF 跨接差分对,与 R19/R21 各 1 k([`V0.1.tel`](V0.1.tel):49)构成一阶低通;拓扑为 1 k 串联 + 1 k 接差分负端、不分压(`docs/产品需求/产品需求设计文档.md` FR-ADC-5)。**250 Hz 的 −4.4 % 就是这颗电容在该频点的真实衰减,板端读数忠实**,工频 50 Hz 仅 −0.2 % 不受影响。谐波测量不够用——同拓扑外推:5 次 ≈ −4.6 %(出 ±2 % 判据)、7 次 −8.5 %、9 次 −13.0 %、11 次 −17.7 %、13 次 −22.6 %、15 次 −27.2 %、21 次(1050 Hz)−39.6 %;C35 改 10 nF 则 fc ≈ 8 kHz、21 次仅 −0.9 %。**谐波功能产品化的硬件前置 = 板改小 C35 + 清点其余各路差分滤波电容容值**(登记 `docs/任务规划/登记簿.md` §1)。**为什么改板而不是软件逐阶修正**:修正系数依赖这颗电容的实际容值,而它有容差、随温度漂,每块板、每个温度都不一样,修正表跟不上;二次谐波制动这类“拿某次谐波幅值与基波比值”的判据,比值被前端畸变后判定就不可信。换 10 nF 后测量带内是平的,板端读数直接可信。证伪条件(有示波器再复核):该低通预测 250 Hz 差分分量额外滞后 ≈17°;模型与三点拟合 `docs/测试说明/测试数据/boot_log_data/20261104_ac_ia_rc_model.txt`。
**边界**:本节不证端子二次值(④ 段变比已算定、两点标定未做,`eng` 仍为 0,见 §7.2)/ 精度等级(要标准源)/ 跨转换器相位(V0.1 硬件缺陷)/ THD。 **边界**:本节不证端子二次值(④ 段变比已算定、两点标定未做,`eng` 仍为 0,见 §7.2)/ 精度等级(要标准源)/ 跨转换器相位(V0.1 硬件缺陷)/ THD。
@@ -288,8 +288,8 @@ STM32(U17)为 LQFP144 脚号。
接在**已经验证过的那个注入点**上就行。它比第 4、5 级安全一个量级——只需 ±2 V 以内的正弦, 接在**已经验证过的那个注入点**上就行。它比第 4、5 级安全一个量级——只需 ±2 V 以内的正弦,
而端子级验证要上 100 V / 220 V 二次值。 而端子级验证要上 100 V / 220 V 二次值。
3. **第 4、5 级在等外部**:④ 子板/端子板变比(仓库里没有原理图)与标准源两点标定, 3. **第 4、5 级在等外部**:④ 子板/端子板变比(仓库里没有原理图)与标准源两点标定,
两者完成前 `eng` 保持 0,本波只承诺"ADC 引脚电压"。两张待做任务卡见 两者完成前 `eng` 保持 0,本波只承诺"ADC 引脚电压"。开工前置见
`docs/任务规划/登记簿.md` §7。 `docs/算法/采集与算法层设计说明.md` §13.13。
### 9.2 波次退出判据与现状 ### 9.2 波次退出判据与现状
@@ -305,7 +305,7 @@ STM32(U17)为 LQFP144 脚号。
| ⑥ 量纲回归用例(不该动作时不动作)通过 | ✅ | `test/host/prot_dim/`,口径 `docs/算法/采集与算法层设计说明.md` §13.6 | | ⑥ 量纲回归用例(不该动作时不动作)通过 | ✅ | `test/host/prot_dim/`,口径 `docs/算法/采集与算法层设计说明.md` §13.6 |
**所以差的是"台架面",它分两半**:动态这半已于 2026-11-02 / 11-04 台架闭环(§8.2); **所以差的是"台架面",它分两半**:动态这半已于 2026-11-02 / 11-04 台架闭环(§8.2);
端子与精度那半要等子板与标准源(`docs/任务规划/登记簿.md` §7)。 端子与精度那半要等子板与标准源(开工前置见 `docs/算法/采集与算法层设计说明.md` §13.13)。
遥测链(快照发布)与运行参数/点表均已达成,口径沉淀在 `App/algo/meas.h`、`App/algo/run_par.h` 遥测链(快照发布)与运行参数/点表均已达成,口径沉淀在 `App/algo/meas.h`、`App/algo/run_par.h`
头注释与 `docs/算法/采集与算法层设计说明.md` §13.9;其中"104 上送值与**工程量**一致"仍挂在 头注释与 `docs/算法/采集与算法层设计说明.md` §13.9;其中"104 上送值与**工程量**一致"仍挂在
@@ -63,7 +63,7 @@
| V7 | **VCAP1/VCAP2(U17.71/106)旁路电容 C94/C79 值未标注**:数据手册要求 VCAP1/VCAP2 各接 1~4.7µF 低 ESR 陶瓷电容至 VSS(内部 1.2V LDO 稳定裕量) | 实测 C94/C79 容值(若为 100nF 则低于手册建议,168MHz 满负荷下 1.2V 轨纹量/稳定性需留意);值补录 BOM | | V7 | **VCAP1/VCAP2(U17.71/106)旁路电容 C94/C79 值未标注**:数据手册要求 VCAP1/VCAP2 各接 1~4.7µF 低 ESR 陶瓷电容至 VSS(内部 1.2V LDO 稳定裕量) | 实测 C94/C79 容值(若为 100nF 则低于手册建议,168MHz 满负荷下 1.2V 轨纹量/稳定性需留意);值补录 BOM |
| V8 | **V15/J3/F3 子板 LED 3 线落在 PC13/PC14/PC15**(脚 7/8/9):备份域电源开关供电,手册 Note 3 限**灌流 ≤3mA、≤2MHz、不可作电流源** | 核子板 LED 驱动电流需求;超 3mA 则 V0.2 移足驱力脚或子板加三极管扩展 | | V8 | **V15/J3/F3 子板 LED 3 线落在 PC13/PC14/PC15**(脚 7/8/9):备份域电源开关供电,手册 Note 3 限**灌流 ≤3mA、≤2MHz、不可作电流源** | 核子板 LED 驱动电流需求;超 3mA 则 V0.2 移足驱力脚或子板加三极管扩展 |
| V9 | **V0.1 主板 SDIO 固定引脚组全被占用**:PC6/PC7/PC8/PC9/PA8(TPAFE 控制)+ PA9(USART1)+ PC10/PC11/PC12/PD2(UART4/UART5)= SDIO 全部 10 脚(F407 SDIO 无重映射) | 架构约束备案:V0.1 主板**无 SDIO 能力**;当前设计不受影响(代码未启用 SDIO,FatFs 卷在 SPI NAND 上) | | V9 | **V0.1 主板 SDIO 固定引脚组全被占用**:PC6/PC7/PC8/PC9/PA8(TPAFE 控制)+ PA9(USART1)+ PC10/PC11/PC12/PD2(UART4/UART5)= SDIO 全部 10 脚(F407 SDIO 无重映射) | 架构约束备案:V0.1 主板**无 SDIO 能力**;当前设计不受影响(代码未启用 SDIO,FatFs 卷在 SPI NAND 上) |
| **V10** | **8 路电气量分属两片转换器(V0.1 硬件缺陷,V0.2 改版项)**:UA/UN/IA 走 TPAFE5160(16 位、同步、±5 V 双极性),UB/UC/IB/IC/IN 走 STM32 ADC(12 位、顺序扫描、0~3.3 V 单极性)→ 跨转换器通道**无同一时刻性**(相位关系不确定)、精度与量程不一致。详见 §6-3 与 [`ADC通道映射说明.md`](ADC通道映射说明.md) §1(2026-10-10 定性更正,登记簿条目「双转换器无共同采样触发」) | **V0.2 改版**:8 路电气量 UA/UB/UC/UN/IA/IB/IC/IN **全部接 TPAFE5160**,与 TPAFE 上 5 路备用路(AIN5/13/7/15/12)对调串联电阻在转换器一侧的目的地——元件数量与料号不变,属走线级改动。V0.1 现板:主板侧只做逐通道监视,**不做**跨转换器的相位/功率/功率因数/矢量运算 | | **V10** | **8 路电气量分属两片转换器(V0.1 硬件缺陷,V0.2 改版项)**:UA/UN/IA 走 TPAFE5160(16 位、同步、±5 V 双极性),UB/UC/IB/IC/IN 走 STM32 ADC(12 位、顺序扫描、0~3.3 V 单极性)→ 跨转换器通道**无同一时刻性**(相位关系不确定)、精度与量程不一致。详见 §6-3 与 [`ADC通道映射说明.md`](ADC通道映射说明.md) §1(2026-10-10 定性更正;缺陷登记在 `docs/任务规划/登记簿.md` §1) | **V0.2 改版**:8 路电气量 UA/UB/UC/UN/IA/IB/IC/IN **全部接 TPAFE5160**,与 TPAFE 上 5 路备用路(AIN5/13/7/15/12)对调串联电阻在转换器一侧的目的地——元件数量与料号不变,属走线级改动。V0.1 现板:主板侧只做逐通道监视,**不做**跨转换器的相位/功率/功率因数/矢量运算 |
## 2. 元件级变化 ## 2. 元件级变化
@@ -39,7 +39,7 @@
| 采样硬件 | TPAFE5160(16 位、8 通道**同步**、±5 V 双极性、并行 `GPIOG[15:0]`)+ STM32 内部 ADC1(12 位、9 通道**顺序**扫描、0~3.3 V 单极性) | | 采样硬件 | TPAFE5160(16 位、8 通道**同步**、±5 V 双极性、并行 `GPIOG[15:0]`)+ STM32 内部 ADC1(12 位、9 通道**顺序**扫描、0~3.3 V 单极性) |
| 采样软件 | `Drivers/BSP/TPAFE5160/tpafe5160.h` 驱动就绪(原子快照 API);`App/task/adc_task.c` **已实现真实消费者(ADC 采集链路,2026-10-10)**——`tpafe5160_snapshot()` 取数 + 帧统计;**采样节拍由 TIM3 更新事件(1 kHz)硬件触发**(2026-10-10;同一事件经 TRGO 触发 ADC1 + DMA);STM32 侧 **`App/algo/adc_input.c` 已实现语义映射 + ADC1 DMA 乒乓帧消费(「STM32 ADC1 启动与扫描」,v2.0)**,`HAL_ADC_Start_DMA` 已出现 | | 采样软件 | `Drivers/BSP/TPAFE5160/tpafe5160.h` 驱动就绪(原子快照 API);`App/task/adc_task.c` **已实现真实消费者(ADC 采集链路,2026-10-10)**——`tpafe5160_snapshot()` 取数 + 帧统计;**采样节拍由 TIM3 更新事件(1 kHz)硬件触发**(2026-10-10;同一事件经 TRGO 触发 ADC1 + DMA);STM32 侧 **`App/algo/adc_input.c` 已实现语义映射 + ADC1 DMA 乒乓帧消费(「STM32 ADC1 启动与扫描」,v2.0)**,`HAL_ADC_Start_DMA` 已出现 |
| 保护算法层 | **全周傅氏相量层已实现并台架闭环**(`App/algo/sample_ring.c` + `phasor.c`:全周傅氏 5 实例、双区交换、每 1 ms 刷新,2026-10-11 `/serial-boot-test`);**保护判据元件框架 + 过流/过负荷/过压/欠压/零序过压 + 定值模型软件侧完成**(`prot_elm.c` + `prot_set.c`,2026-10-11,57 项主机单测);**出口 / SOE 记录仍缺失**(P4) | | 保护算法层 | **全周傅氏相量层已实现并台架闭环**(`App/algo/sample_ring.c` + `phasor.c`:全周傅氏 5 实例、双区交换、每 1 ms 刷新,2026-10-11 `/serial-boot-test`);**保护判据元件框架 + 过流/过负荷/过压/欠压/零序过压 + 定值模型软件侧完成**(`prot_elm.c` + `prot_set.c`,2026-10-11,57 项主机单测);**出口 / SOE 记录仍缺失**(P4) |
| 已知硬件缺陷 | 登记簿条目「双转换器无共同采样触发」:8 路电气量分属两片转换器 → V0.1 上禁止跨转换器做相位/功率/矢量运算 | | 已知硬件缺陷 | `docs/任务规划/登记簿.md` §1:8 路电气量分属两片转换器 → V0.1 上禁止跨转换器做相位/功率/矢量运算 |
### 1.3 复现范围界定 ### 1.3 复现范围界定
@@ -138,7 +138,7 @@
| # | 约束 | 出处 | 后果 | | # | 约束 | 出处 | 后果 |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| 双转换器无共同采样触发 | 8 路电气量分属 TPAFE5160 与 STM32 ADC1 **两片**,两片**无共同采样触发** | `ADC通道映射说明.md` §1、登记簿条目「双转换器无共同采样触发」 | 跨转换器的相位 / 矢量 / 功率 / 功率因数 / 负序运算**不成立** | | 双转换器无共同采样触发 | 8 路电气量分属 TPAFE5160 与 STM32 ADC1 **两片**,两片**无共同采样触发** | `ADC通道映射说明.md` §1、`docs/任务规划/登记簿.md` §1 | 跨转换器的相位 / 矢量 / 功率 / 功率因数 / 负序运算**不成立** |
| R5 | STM32 侧**无中点偏置**(1k 串联 + 1k 到 `*_GND`),0~3.3 V 单极性 | `ADC通道映射说明.md` §1、§7 | STM32 侧交流量负半周**削顶** → 该侧**算不出有效值 / 相量** | | R5 | STM32 侧**无中点偏置**(1k 串联 + 1k 到 `*_GND`),0~3.3 V 单极性 | `ADC通道映射说明.md` §1、§7 | STM32 侧交流量负半周**削顶** → 该侧**算不出有效值 / 相量** |
**(2)净效果:V0.1 只有 TPAFE 三路"测量有效"** **(2)净效果:V0.1 只有 TPAFE 三路"测量有效"**
@@ -189,7 +189,7 @@
| **出口与记录与信号** | 跳闸/告警出口、信号灯 | `TripKO` / KO | `App/protect/` + BSP 出口驱动 | | **出口与记录与信号** | 跳闸/告警出口、信号灯 | `TripKO` / KO | `App/protect/` + BSP 出口驱动 |
| **动作留痕记录与上送** | SOE/动作记录、UI 显示、遥测上送 | 记录模块 + 通信 | `App/log/` + `Drivers/BSP/UI/` + `App/protocol/` | | **动作留痕记录与上送** | SOE/动作记录、UI 显示、遥测上送 | 记录模块 + 通信 | `App/log/` + `Drivers/BSP/UI/` + `App/protocol/` |
> **分层原则**:语义取数与有效性只做"数"(码值→工程量),全周傅氏相量只做"相量"(工程量→复相量),保护判据只做"判据"(相量 + 定值→布尔),出口与记录/动作留痕只做"动作与留痕"。**算法与 I/O 分离**,使 全周傅氏相量/保护判据成为主机侧纯逻辑单测的天然适格对象(落实 `docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」)。 > **分层原则**:语义取数与有效性只做"数"(码值→工程量),全周傅氏相量只做"相量"(工程量→复相量),保护判据只做"判据"(相量 + 定值→布尔),出口与记录/动作留痕只做"动作与留痕"。**算法与 I/O 分离**,使 全周傅氏相量/保护判据成为主机侧纯逻辑单测的天然适格对象(三条采集链路设计约束的正文在 `docs/产品需求/产品需求设计文档.md` §5.10)。
### 2.2 任务与中断模型(映射到 STM32F4 + FreeRTOS) ### 2.2 任务与中断模型(映射到 STM32F4 + FreeRTOS)
@@ -426,7 +426,7 @@
| --- | --- | --- | --- | | --- | --- | --- | --- |
| AD 器件 | 专用同步采样 AD | TPAFE5160(16 位、8 通道同步、±5 V)+ STM32 ADC1(12 位、顺序、0~3.3 V) | 统一到"工程量"层,屏蔽码值差异 | | AD 器件 | 专用同步采样 AD | TPAFE5160(16 位、8 通道同步、±5 V)+ STM32 ADC1(12 位、顺序、0~3.3 V) | 统一到"工程量"层,屏蔽码值差异 |
| 通道数 | 8 实通道(4U+4I,自产零序) | 8 路电气量(4U+4I)+ 温度 | 语义映射见 `docs/硬件平台/ADC通道映射说明.md` | | 通道数 | 8 实通道(4U+4I,自产零序) | 8 路电气量(4U+4I)+ 温度 | 语义映射见 `docs/硬件平台/ADC通道映射说明.md` |
| 同一时刻性 | 单芯片同步 | **跨转换器无共同触发**(登记簿条目「双转换器无共同采样触发」) | V0.1 只做逐通道独立监视 | | 同一时刻性 | 单芯片同步 | **跨转换器无共同触发**(`docs/任务规划/登记簿.md` §1) | V0.1 只做逐通道独立监视 |
| 量程/精度 | 一致 | TPAFE LSB ≈ 152.6 µV vs STM32 LSB ≈ 806 µV | 同族量不可统一算法处理 | | 量程/精度 | 一致 | TPAFE LSB ≈ 152.6 µV vs STM32 LSB ≈ 806 µV | 同族量不可统一算法处理 |
### 6.2 双转换器无共同采样触发:影响与降级口径 ### 6.2 双转换器无共同采样触发:影响与降级口径
@@ -516,9 +516,9 @@ B0 产品定义 ✅(2026-10-10 已确认,见 §1.5)
| 语义取数与有效性板端套件 | 采样/相量/保护元件 | `test/run_all_suites.py` 板端套件 | | 语义取数与有效性板端套件 | 采样/相量/保护元件 | `test/run_all_suites.py` 板端套件 |
| 全周傅氏相量/保护判据台架 | 标准源注入、动作出口、时序 | 台架闭环(COM6 @115200) | | 全周傅氏相量/保护判据台架 | 标准源注入、动作出口、时序 | 台架闭环(COM6 @115200) |
### 8.2 `docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」落实 ### 8.2 采集链路三条设计约束落实
`docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」对采集链路提出三条设计约束,保护层须一并满足: `docs/产品需求/产品需求设计文档.md` §5.10 对 RS-485 采集链路提出三条设计约束,保护层须一并满足:
1. **协议解析与硬件 I/O 分离**——保护判据函数只吃相量 + 定值,可单测; 1. **协议解析与硬件 I/O 分离**——保护判据函数只吃相量 + 定值,可单测;
2. **采集缓冲双缓冲 + 序号**——防撕裂(单测测不出时序撕裂,须设计上消除); 2. **采集缓冲双缓冲 + 序号**——防撕裂(单测测不出时序撕裂,须设计上消除);
+20 -7
View File
@@ -6,8 +6,8 @@
> 本文不重复其内容;本文不写历史演进、门禁复测记录与修订日志(需要时查 git 历史)。 > 本文不重复其内容;本文不写历史演进、门禁复测记录与修订日志(需要时查 git 历史)。
> **状态**:语义取数与有效性 → 全周傅氏相量 → 保护判据主线已闭环到板端消费者(`protectTask`,20 ms 判据节拍); > **状态**:语义取数与有效性 → 全周傅氏相量 → 保护判据主线已闭环到板端消费者(`protectTask`,20 ms 判据节拍);
> 标定折算层 `App/algo/adc_cal` 已于 2026-10-25 落地(标定折算与落盘整定,§13.2, > 标定折算层 `App/algo/adc_cal` 已于 2026-10-25 落地(标定折算与落盘整定,§13.2,
> 引脚电压量纲 + 系数落盘 + 未标定闭锁);**幅值精度判据**仍待标准源两点注入复核(§13 状态段与 > 引脚电压量纲 + 系数落盘 + 未标定闭锁);**幅值精度判据**仍待标准源两点注入复核(§13 状态段;
> `docs/任务规划/登记簿.md` §7)。 > 推进顺序与等待的外部资源见 `docs/任务规划/README.md` §2)。
> **相关文档**: > **相关文档**:
> 分层与功能项(语义取数与有效性~动作留痕)的唯一属主登记处:`docs/算法/继电保护功能复现规划.md` §2.1(分层)、§3(功能清单)、§4.2(精度)、§7(路线图) > 分层与功能项(语义取数与有效性~动作留痕)的唯一属主登记处:`docs/算法/继电保护功能复现规划.md` §2.1(分层)、§3(功能清单)、§4.2(精度)、§7(路线图)
> `docs/硬件平台/ADC通道映射说明.md`(**语义映射唯一权威口径**) > `docs/硬件平台/ADC通道映射说明.md`(**语义映射唯一权威口径**)
@@ -41,7 +41,8 @@
ADC1)、不做出口动作。 ADC1)、不做出口动作。
- **这样分离换到什么**:`sample_ring` / `phasor` / `adc_health` / `prot_set` / `prot_elm` / - **这样分离换到什么**:`sample_ring` / `phasor` / `adc_health` / `prot_set` / `prot_elm` /
`freq` **零平台依赖**(只用 `stdint.h` / `math.h` / `stddef.h` 与本目录头),因此可被主机侧 `freq` **零平台依赖**(只用 `stdint.h` / `math.h` / `stddef.h` 与本目录头),因此可被主机侧
单测以 `#include` 原样纳入、离线全覆盖(落实 `docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」),不需要真机就能钉死判据。 单测以 `#include` 原样纳入、离线全覆盖,不需要真机就能钉死判据(采集链路三条设计约束见
`docs/产品需求/产品需求设计文档.md` §5.10)。
- **上下文约束**:`*_init()` 一律无 RTOS 依赖、幂等,由 `app_main_init()` 在**内核启动前**调用; - **上下文约束**:`*_init()` 一律无 RTOS 依赖、幂等,由 `app_main_init()` 在**内核启动前**调用;
`adc_input_poll()` / `phasor_run()` / `freq_run()` **仅任务上下文**(快照走临界区)。 `adc_input_poll()` / `phasor_run()` / `freq_run()` **仅任务上下文**(快照走临界区)。
- **消费者在 `App/task/`**:`adcTask` 采集并压环、`protectTask`(保护任务)跑 `prot_elm_run()`; - **消费者在 `App/task/`**:`adcTask` 采集并压环、`protectTask`(保护任务)跑 `prot_elm_run()`;
@@ -416,8 +417,8 @@ UA 无幅值落 IA → 0.0020 Hz。
2. **禁止跨转换器运算**(V0.1 硬件缺陷**双转换器无共同采样触发**):`UA/UN/IA` 在 TPAFE、`UB/UC/IB/IC/IN` 在 2. **禁止跨转换器运算**(V0.1 硬件缺陷**双转换器无共同采样触发**):`UA/UN/IA` 在 TPAFE、`UB/UC/IB/IC/IN` 在
STM32 ADC1,两片转换器没有共同采样触发 → 无同一时刻性、相位不确定。故本层**不做**跨转换器的 STM32 ADC1,两片转换器没有共同采样触发 → 无同一时刻性、相位不确定。故本层**不做**跨转换器的
相位 / 功率 / 功率因数 / 负序零序类矢量运算;**8 路全接 TPAFE(V0.2 硬件)后方可解禁**。 相位 / 功率 / 功率因数 / 负序零序类矢量运算;**8 路全接 TPAFE(V0.2 硬件)后方可解禁**。
3. **标定折算已落地、精度复核未做**(2026-10-25 `App/algo/adc_cal`;两点标定与精度目标见 3. **标定折算已落地、精度复核未做**(2026-10-25 `App/algo/adc_cal`;两点标定怎么开工见 §13.13):
`docs/任务规划/登记簿.md` §7):帧值现 = 引脚侧工程量(ROM 默认系数 = 转换器 LSB 事实值), 帧值现 = 引脚侧工程量(ROM 默认系数 = 转换器 LSB 事实值),
前端分压读法判别与端子变比仍待台架——**精度结论前不得把幅值当计量证据**(§13)。 前端分压读法判别与端子变比仍待台架——**精度结论前不得把幅值当计量证据**(§13)。
4. **本层无副作用外溢**:不建任务、不等事件、不写日志(日志由调用侧打)、不碰寄存器 4. **本层无副作用外溢**:不建任务、不等事件、不写日志(日志由调用侧打)、不碰寄存器
(例外只有 `adc_input.c` 驱动 ADC1)。 (例外只有 `adc_input.c` 驱动 ADC1)。
@@ -621,8 +622,7 @@ V0.1 恒命中 UB/UC/IB/IC/IN,位图 `0xE6`),它表示"这路不能测交
> **承诺边界**:只到 **ADC 引脚电压**(`eng = 0`)。"端子二次值"要等子板变比确认、 > **承诺边界**:只到 **ADC 引脚电压**(`eng = 0`)。"端子二次值"要等子板变比确认、
> 标准源两点标定写入 `[adc_cal]` 并置 `VALID`;`eng` 升 1 的条件是电气 8 路 VALID **全置位** > 标准源两点标定写入 `[adc_cal]` 并置 `VALID`;`eng` 升 1 的条件是电气 8 路 VALID **全置位**
> (`App/app/ui_data_feed.c` 的 `feed_eng()`)。两张待做任务卡见 > (`App/app/ui_data_feed.c` 的 `feed_eng()`)。两点标定怎么开工见 §13.13。
> `docs/任务规划/登记簿.md` §7。
**动态验证已跑两轮(2026-11-02 / 11-04),六轮全部闭合**——幅值 / 波形 / 相位 / 测频 / 谐波 / **动态验证已跑两轮(2026-11-02 / 11-04),六轮全部闭合**——幅值 / 波形 / 相位 / 测频 / 谐波 /
削顶直流档都过了;实测数与逐轮结论只详述在 `docs/硬件平台/ADC通道映射说明.md` §8.2,本节不抄第二份。 削顶直流档都过了;实测数与逐轮结论只详述在 `docs/硬件平台/ADC通道映射说明.md` §8.2,本节不抄第二份。
@@ -773,6 +773,19 @@ typedef struct {
新增决策照上表格式往下加:一行一个问题、一行定成了什么、一行为什么。 新增决策照上表格式往下加:一行一个问题、一行定成了什么、一行为什么。
### 13.13 两点标定开工前必须先拍板的三件事
拍板前,相应验收判据无法判定——这是**开跑的前置**,不是排期问题。
| 待定 | 备选 | 为什么必须先定 |
|---|---|---|
| **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据,否则"误差 ≤ 目标精度"这条无法判定。保护判据本身只需 3~5 %,0.5 级是计量口径 |
| **端子 / 子板变比从哪来** | ① 有原理图(直接算)② 只有实物(万用表同时量端子与引脚)③ 都没有 | 决定 `eng` 能否置 1。现状已按 ① 的参数算定(`docs/硬件平台/ADC通道映射说明.md` §7.2),等实物复核;② 同样可行且够用;③ 则只交付引脚电压、二次值登记为缺口 |
| **`eng = 0` 期间测频幅值门怎么处置** | 保持恒失效(现状,UI 恒 `--`)/ 台架临时把 `FREQ_AMP_MIN` 降到引脚域量级跑一轮再还原 / 换成相对量门限 | 建议**常态保持恒失效 + 需要时临时降门跑一轮**;换相对量门限要先重新论证,别在过渡期改。临时降门会改产品头文件,收尾必须还原到 `git diff` 为空并重跑构建 |
**送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 `VALID` 全部置位才走保护判据。
未完成标准源标定就送检,保护会表现为不动作。保持该闭锁,不用非标准源标定走捷径。
## 14. 相关文档 ## 14. 相关文档
- 目录索引与构建 / 测试入口:`App/algo/README.md` - 目录索引与构建 / 测试入口:`App/algo/README.md`
+2 -2
View File
@@ -18,7 +18,7 @@
| `形态①`~`形态⑤` | `net_reconcile_tick` 的五类**失同步判据** | §4.1 | | `形态①`~`形态⑤` | `net_reconcile_tick` 的五类**失同步判据** | §4.1 |
| `U1`~`U15` | 状态迁移的**"无人负责"组合**(架构欠债清单) | `docs/问题记录/CH395F_Trap_Records.md` 审计遗留章节 | | `U1`~`U15` | 状态迁移的**"无人负责"组合**(架构欠债清单) | `docs/问题记录/CH395F_Trap_Records.md` 审计遗留章节 |
| `TRAP-NET-nn` | **陷阱记录**条目 | 同上 | | `TRAP-NET-nn` | **陷阱记录**条目 | 同上 |
| `N-nn` | `docs/任务规划/登记簿.md` 的**任务/发现编号**(⚠ 已销项的号不再可查,本文引用处即其最终事实描述) | 该登记簿 | | `N-nn` | 历史上的**任务/发现编号**(已停发;⚠ 已销项的号不再可查,本文引用处即其最终事实描述) | 本文各节 |
| `D1`~`D7` | 本文**决策记录** | §10 | | `D1`~`D7` | 本文**决策记录** | §10 |
| `自愈收敛阶段 N` | 2026-10 的分阶段实施标签,**只存在于历史文档与归档**(2026-10-29 起全仓仅剩 5 篇保留的变更记录真台账)(代码注释已全部改为平实语言);勾选清单已归档(§12)——**勿用它叙述设计,也勿再写回注释** | §12 | | `自愈收敛阶段 N` | 2026-10 的分阶段实施标签,**只存在于历史文档与归档**(2026-10-29 起全仓仅剩 5 篇保留的变更记录真台账)(代码注释已全部改为平实语言);勾选清单已归档(§12)——**勿用它叙述设计,也勿再写回注释** | §12 |
| `TSL` / `TSC` / `TSD` | SPI 命令与数据之间的**时序间隔**要求 | `docs/芯片手册/CH395F.md` §7.4 | | `TSL` / `TSC` / `TSD` | SPI 命令与数据之间的**时序间隔**要求 | `docs/芯片手册/CH395F.md` §7.4 |
@@ -699,7 +699,7 @@ DISCONNECT 会被 `(void)` 丢掉。但 RECV_OK 是条件位(下轮补回)
③ **槽位可加入**:每 Socket 只有一个复位槽位,`ch395f_sock_reset_begin` 返 -1(已在运行) ③ **槽位可加入**:每 Socket 只有一个复位槽位,`ch395f_sock_reset_begin` 返 -1(已在运行)
不等于失败——同步包装必须**加入**已在跑的复位机,否则 `net_close` 走 "proceed 不等于失败——同步包装必须**加入**已在跑的复位机,否则 `net_close` 走 "proceed
anyway"、排渣被跳过。 anyway"、排渣被跳过。
补齐 ①②③ 并各自回归后再接;登记 `docs/任务规划/登记簿.md` 条目「relisten 沉降段原语化受阻」。 补齐 ①②③ 并各自回归后再接;三条前置语义与本条现状见本节。
2. **部分读→再查 recv_len 定向 TC**:旧"部分读归零"机理未证实(与手册 §5.34 及 2. **部分读→再查 recv_len 定向 TC**:旧"部分读归零"机理未证实(与手册 §5.34 及
TC-NET-201 相反),注释约束已降级为历史观察——以定向用例结案(陷阱记录「台架纪律」 TC-NET-201 相反),注释约束已降级为历史观察——以定向用例结案(陷阱记录「台架纪律」
节已挂该待办)。 节已挂该待办)。
+1 -1
View File
@@ -5,7 +5,7 @@
- 配置:`entry: python scripts/ram_baseline.py --gate`、`pass_filenames: false`、 - 配置:`entry: python scripts/ram_baseline.py --gate`、`pass_filenames: false`、
`files:` 覆盖 `App/`、`Drivers/BSP/`、`Src/`、`Inc/`、`Lib/lv_conf.h` 等会影响占用面。 `files:` 覆盖 `App/`、`Drivers/BSP/`、`Src/`、`Inc/`、`Lib/lv_conf.h` 等会影响占用面。
- 背景:登记簿条目「缩堆迁 CCM 后半(暂缓)」的前半;三件套里的机械部分(阈值门禁 + 趋势台账 + 台账受管区)。 - 背景:内存治理三件套的机械部分为「缩堆迁 CCM 后半(暂缓)」的前半;三件套里的机械部分(阈值门禁 + 趋势台账 + 台账受管区)。
## 1. 它在查什么 ## 1. 它在查什么
+1 -1
View File
@@ -4,7 +4,7 @@
> ——这一门专抓"写了却从不生效"的死代码,包括第四种更隐蔽的:页面描述符没接线。 > ——这一门专抓"写了却从不生效"的死代码,包括第四种更隐蔽的:页面描述符没接线。
- 配置:`entry: python scripts/check_registration.py --strict`、`pass_filenames: false`。 - 配置:`entry: python scripts/check_registration.py --strict`、`pass_filenames: false`。
- 背景:登记簿条目「rs485_task 白名单缺口」;UI 页面那类是「UI 字符集与像素回归门禁」补强(2026-10-15)。 - 背景:`App/task/rs485_task.c` 的白名单缺口;UI 页面那类是「UI 字符集与像素回归门禁」补强(2026-10-15)。
## 1. 它在查什么(四类缺口) ## 1. 它在查什么(四类缺口)
@@ -1,7 +1,7 @@
# 采集与数据处理短板评测(2026-10-23) # 采集与数据处理短板评测(2026-10-23)
> **定位**:以参考项目 CLS100(`Scatter_P_HV03.01_SV01.01`)的"采样 → 预处理 → 相量 → 遥测 → 录波 → 上送"全链路为对照,评测本项目在**电力采集与数据处理**上的完成度,指出下一步该补的短板与顺序。 > **定位**:以参考项目 CLS100(`Scatter_P_HV03.01_SV01.01`)的"采样 → 预处理 → 相量 → 遥测 → 录波 → 上送"全链路为对照,评测本项目在**电力采集与数据处理**上的完成度,指出下一步该补的短板与顺序。
> **不是待办登记簿**:排序权威仍是 `docs/任务规划/README.md` §2;本文只出评测结论与建议,条目落地时按语义标识登记进 `docs/任务规划/登记簿.md`。 > **不是待办表**:排序权威仍是 `docs/任务规划/README.md` §2;本文只出评测结论与建议;待办按语义标识登记在该模块自己的文档里。
> **对照口径**:项目内以 `docs/算法/继电保护功能复现规划.md` §3 的 语义取数与有效性~动作留痕清单为准;参考侧以参考项目 `项目分析文档/04-算法与采样专题/` 三篇(《ADC采集至数据使用全流程详解》《项目详细分析-交流采样与有效值计算》《傅氏算法详解》)与源码为准。 > **对照口径**:项目内以 `docs/算法/继电保护功能复现规划.md` §3 的 语义取数与有效性~动作留痕清单为准;参考侧以参考项目 `项目分析文档/04-算法与采样专题/` 三篇(《ADC采集至数据使用全流程详解》《项目详细分析-交流采样与有效值计算》《傅氏算法详解》)与源码为准。
> **硬件前提**:结论只针对 **V0.1 现板**;受「双转换器无共同采样触发」(8 路电气量分属两片转换器)制约的项单独标注,V0.2 改版后解禁。 > **硬件前提**:结论只针对 **V0.1 现板**;受「双转换器无共同采样触发」(8 路电气量分属两片转换器)制约的项单独标注,V0.2 改版后解禁。
@@ -344,7 +344,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
(38 次上板启动复现)读作主机侧回归的早期基线,改写为「主机侧回归的早期基线 3/10」。 (38 次上板启动复现)读作主机侧回归的早期基线,改写为「主机侧回归的早期基线 3/10」。
4. **登记簿条目 `L5 队列往返基线待重验` 改名**为「队列往返基线待重验」:这里的 `L5` 曾**长在语义 4. **登记簿条目 `L5 队列往返基线待重验` 改名**为「队列往返基线待重验」:这里的 `L5` 曾**长在语义
短语里**(`id_aliases.json` 当年就是这么登记的),属"短语里混着号"的坏例子——`编号规范.md` 短语里**(`id_aliases.json` 当年就是这么登记的),属"短语里混着号"的坏例子——`编号规范.md`
§1 的好例子清单里正是它。引用侧 5 处同批改(登记簿 §1/§7、实机测试实施指南 §7.3 标题与步骤表、 §1 的好例子清单里正是它。引用侧 5 处同批改(原登记簿两节、实机测试实施指南 §7.3 标题与步骤表、
编号规范好例子清单);归档里那条历史 note 原文不动,它是当时决定的记录。 编号规范好例子清单);归档里那条历史 note 原文不动,它是当时决定的记录。
另修一处上一批路径残留:`net_latency_test.c/.h` 三处注释把 peer 少写一级目录(正确路径是 另修一处上一批路径残留:`net_latency_test.c/.h` 三处注释把 peer 少写一级目录(正确路径是
+2 -2
View File
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""check_registration.py - 双端注册反向校验门禁(纯标准库)。 """check_registration.py - 双端注册反向校验门禁(纯标准库)。
背景(登记簿条目「rs485_task 白名单缺口」): 背景(rs485_task 白名单缺口):
本工程 Keil 工程与 PC 模拟器都用**显式文件列表**(无通配扫描)。新 `.c` 本工程 Keil 工程与 PC 模拟器都用**显式文件列表**(无通配扫描)。新 `.c`
必须手动注册两处才会被编译: 必须手动注册两处才会被编译:
① `MDK-ARM/STM32F407-Demo.uvprojx` 的 `<FilePath>` 条目(MCU 固件构建) ① `MDK-ARM/STM32F407-Demo.uvprojx` 的 `<FilePath>` 条目(MCU 固件构建)
@@ -46,7 +46,7 @@
& '.venv\\Scripts\\python.exe' scripts/check_registration.py & '.venv\\Scripts\\python.exe' scripts/check_registration.py
& '.venv\\Scripts\\python.exe' scripts/check_registration.py --strict & '.venv\\Scripts\\python.exe' scripts/check_registration.py --strict
设计依据:docs/任务规划/登记簿.md 条目「rs485_task 白名单缺口」;.dsh/skills/new-source-file 设计依据:rs485_task 白名单缺口(`docs/产品需求/产品需求设计文档.md` §5.10);.dsh/skills/new-source-file
创建日期:2026-10-12 创建日期:2026-10-12
""" """
+1 -1
View File
@@ -37,7 +37,7 @@
& '.venv\\Scripts\\python.exe' scripts/check_test_suite.py --allow-test-build & '.venv\\Scripts\\python.exe' scripts/check_test_suite.py --allow-test-build
& '.venv\\Scripts\\python.exe' scripts/check_test_suite.py --file <路径> & '.venv\\Scripts\\python.exe' scripts/check_test_suite.py --file <路径>
设计依据:docs/任务规划/登记簿.md;docs/测试说明/流程与规范/测试开发标准流程.md §3.1 设计依据:docs/测试说明/流程与规范/测试开发标准流程.md §3.1
创建日期:2026-10-01 创建日期:2026-10-01
""" """
+2 -2
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
RAM 预算门禁 + 趋势台账(登记簿条目「缩堆迁 CCM 后半(暂缓)」的台账/门禁那半 / 审查报告 §5.5 三件套,2026-10-12)。 RAM 预算门禁 + 趋势台账(内存治理三件套,2026-10-12)。
三件套的机械部分收在本脚本(事实源 = Keil `.map`,与 `check_mem_numbers.py` 同口径): 三件套的机械部分收在本脚本(事实源 = Keil `.map`,与 `check_mem_numbers.py` 同口径):
@@ -28,7 +28,7 @@ RAM 预算门禁 + 趋势台账(登记簿条目「缩堆迁 CCM 后半(暂
python scripts/ram_baseline.py --trend [-n 10] python scripts/ram_baseline.py --trend [-n 10]
退出码:0 通过/跳过;1 门禁失败或受管区漂移;2 事实源解析失败。 退出码:0 通过/跳过;1 门禁失败或受管区漂移;2 事实源解析失败。
创建日期:2026-10-12(登记簿条目「缩堆迁 CCM 后半(暂缓)」的台账/门禁那半) 创建日期:2026-10-12(内存治理三件套的台账/门禁件)
""" """
import argparse import argparse
import pathlib import pathlib
+1
View File
@@ -19,3 +19,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
2026-11-04 254332 30824 2072 150104 285156 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 2026-11-04 254332 30824 2072 150104 285156 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
2026-11-05 254820 30896 2072 150104 285716 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 2026-11-05 254820 30896 2072 150104 285716 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
2026-11-09 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 2026-11-09 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
2026-11-10 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
1 date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
19 2026-11-04 254332 30824 2072 150104 285156 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
20 2026-11-05 254820 30896 2072 150104 285716 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
21 2026-11-09 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
22 2026-11-10 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132
+4 -4
View File
@@ -1,15 +1,15 @@
{ {
"built_at": "2026-11-09T16:09:17+08:00", "built_at": "2026-11-10T11:42:28+08:00",
"fingerprint": "a7e57c2a7e70ba95944f64b9254e5ec3ed4c0b4482dfc73276912cf53bea4df5", "fingerprint": "bd97996ef0586e185e13beca01d36f43fdbc118c69c0833166065752aacae96c",
"fingerprint_files": 1479, "fingerprint_files": 1479,
"fingerprint_source": "git-index", "fingerprint_source": "git-index",
"gated_regions": [ "gated_regions": [
"RW_IRAM1", "RW_IRAM1",
"RW_CCM" "RW_CCM"
], ],
"git_head": "7027718dcd67cfe84128b9dabf3acc53b5cf740c", "git_head": "ae09c5737a0bc56cddc469fc2ca0afe78e6cbd74",
"map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map", "map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map",
"map_mtime": 1794211736, "map_mtime": 1794282125,
"pct": { "pct": {
"ER_IROM1": 27.31, "ER_IROM1": 27.31,
"RW_CCM": 87.89, "RW_CCM": 87.89,
+1 -1
View File
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""B6 bench leg: IEC 60870-5-104 master client (GI + COV round-trip). """B6 bench leg: IEC 60870-5-104 master client (GI + COV round-trip).
Historical bench leg; current acceptance index: docs/任务规划/登记簿.md §7. Historical bench leg; acceptance criteria: docs/子系统设计/IEC104上行设计说明.md §8.
docs/子系统设计/IEC104上行设计说明.md §3/§4. Constants mirror docs/子系统设计/IEC104上行设计说明.md §3/§4. Constants mirror
App/protocol/iec104/iec104_asdu.h / iec104_link.h. App/protocol/iec104/iec104_asdu.h / iec104_link.h.