数据面(App/algo,纯逻辑,双端编译) - wave_ring:8 路 × 320 点列优先环(1 kHz,预触发 160 + 后触发 160),adcTask 唯一写者;触发/冻结/封存/冷却四态,冻结持续到落盘回执才解冻,滞留 2 s 自弃 兜底——下一次真故障无波可录比丢一段更贵 - wave_store:段头编解码 + 拉模式打包游标 + 自带无表位运算 CRC-16/MODBUS(带 锚点自检)+ 段名与整段长度等式;格式不依赖平台类型宽度 - 段头只存原始码值与封存瞬间生效系数,工程量只当单位标签、不进任何算式 - 三套主机单测(环 113 / 编解码 170 / 触发状态机 110),全部无桩、生产源原样 纳入;新文件补 stddef 是 ARMCC 与主机差异,主机侧照不出这条分叉 - test/host/wave_read.py 是按 §6.2 的独立第二实现(dump/fft/shape/plot),92 条 自洽断言;三份合成段互读双校验全过、哈希钉死,格式面双向闭合 - 三套新单测不加专属钩子,由覆盖率总闸全量真跑(沿用既有裁定) 接线(任务层) - adc_cal:新增生效系数的 32 位定点原值入口(与既有浮点入口共用生效视图), 段头按最低有效位精确记账,不经浮点回算 - adcTask:每拍压 8 路语义原始码值并推进状态机,封存那一拍同拍交棒封存瞬间事实; 台架定周期自抓走双层编译门,产品镜像里零存在;串口新增一条 wave: 周期行 - defaultTask:卷空闲后一次心跳整段搬完(try 锁 + 256 字节分片 + 一次完整开档到 关档),成败都回执;失败先删半成品再计错,段号只在成功时推进;持锁超 50 ms 补一条告警并记历史峰值(喂狗余量可核) - Lead 复核补第四道并发陷阱:采集任务优先级高于落盘道,搬段中途它可能正好把滞留 超时的本段自弃、甚至封出下一段——数据区校验和是对「实际读到的字节」算的, 半新半旧的段照样自洽,故关档后复检环侧身份判废:删文件、不补账、段号不推进 - Lead 复核抓到触发挂号不是原子操作(旧实现分三个字节写,消费者可在窗口里读到 上一段的触发源与元件号):已把载荷压进一个字节,越界当场拒且不记任何计数; 段文件字节布局零改动,三份合成段哈希逐字节不变 - protectTask:保护启动上升沿同点请求录波,一拍一次、元件号取最低位;判据本体 零改动 人机(160×160 单色屏) - 菜单树节点 26「手动录波」绑页面 + 记录查询组末新增「录波回放」叶,重跑生成器 得 43 节点 / 34 叶 / 30 已绑,页面映射 28 → 30 - 回放页一屏一路、触发点前后各一周波共 40 点、每点 3 像素阶梯线(只用水平与 垂直两种线段——单色屏斜线会被阈值裁掉);零点虚线、触发光标、窗口峰值、 单位徽标与形状受限徽标;空态与坏段各一句显式文案,绝不用半截波形冒充数据 - ui_data 新增录波注入通道(六件操作表、三态返回);执行侧胶水带段头缓存、 手动请求后连缓存一起作废、逐点走全仓唯一的码值换算入口 - 模拟器接真实环与编解码合成两段(含坏段与空态旗标),6 张新黄金参考,既有 60 张逐字节零漂移未用更新模式;字库 218 → 224 字 / 319 字形 - 两份图形配置里图表组件仍为关;零堆分配;页面池水位不变 - 回放读路径的 uiTask 阻塞上界按实码写清:一次渲染 = 段表刷新 + 未缓存段头最坏 22 次小读;已验段只剩一次开窗读 + 40 点解码;无实测数不编,实测归台架、 仪器用已在跑的单轮工作耗时探针,不新加埋点 台账与文档 - 内存台账:录波环与落盘/回放静态逐条入册,三档对照 81,536 → 88,296 → 89,936 字节(62.2% → 68.6%),累计 +8,400;预估 5.9 KB 与实测 +6,760 的差额点名; 散列文件头注释同步;任务栈表核对后无需抬栈;体积趋势行与同码凭证由权威构建 重打(0 错误 0 警告,四项体积与上一轮相同——本轮改动只有注释与声明位置) - 设计说明:§5 补第四条并发陷阱;§6.3 定字段口径(两份独立实现的共同依据); §7 回填实测;§9 周期行写实;§10 台架判据改两段式且不比绝对相位;§12 补读路径 风险行;抬头状态改成「代码面已交付、未做完的只有板级那一轮」 - 卡片:软件闭环一栏列证据;台架三条按用户裁定保持未完成,不做虚假销项 - 口径同步:数据可信、UI 补齐、页面补齐规划、产品需求、采集短板评测、任务规划 索引与两份 README;陈旧现状句清扫 16 处(带日期戳的历史取数行一律不动) - 门禁说明:nested-comment 记仓库根探测必须兼容 linked worktree 的 gitdir 文件 形态(修前该钩子在任务树里恒报环境错、静默不可用);coding-standard 记 「函数头注释超过 24 行就把函数功能挤出回看窗口」这条机制与本次现场 - 覆盖率基线登记两个新覆盖模块(套件 41 → 44 套);环单测重打后该文件有效行 227 → 226、覆盖行 226 → 225,比率仍 99.6%,是分母变小不是覆盖率回退 为什么是单一提交:文档链接、双端注册、生成器幂等(菜单与字库)、内存数字与 体积事实源、编号门禁这五道整仓门禁要求代码、页面、菜单树、字库、文档与台账 同处一个提交才自洽,按数据面/接线/人机/台账拆成四笔必然红其中至少四道 编号门禁新增行 14 处命中已按语义改写:魔数常量按字符命名、段名样例改由格式串 生成、频谱表头改 f / 2x / 5x 并加一行图例;改写后自洽断言 92 条仍全过
12 KiB
故障录波(立项 · 卡片登记簿)
本文管排期与判据:卡片表、顺序、资源占用、边界。设计与口径的属主是
docs/子系统设计/故障录波设计说明.md——为什么存原始码值、为什么先做 1 kHz、段文件格式、回放页画什么,都写在那份里,本文不重抄。 本文的待办只认下面的卡片表;设计层面的开放项去设计文档找。
1. 现状一句话
数据面与接线已在仓内,板级判据一轮未跑(诚实口径,2026-10-29 更新):录波环与段格式编解码在 App/algo/wave_ring.c 与 App/algo/wave_store.c,压环与落盘与保护启动接线、以及两条 UI 页的代码侧判据已过(三套主机单测 100 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 解码器两份独立实现字节级互验通过;「手动录波」第 26 叶与「录波回放」两叶均已绑页,UI_PAGE_MAP_COUNT = 30,内容页黄金参考 60 → 66 张含录波 6 态)。没做完的是板级那一轮:注 1 V / 50 Hz、FTP 拉回、与 meas: 行和 104 浮点 YC 对表、CRC 不符必须拒收的实测、真机上看回放页放一段真波;产品需求把「录波文件存储」「文件传输(录波)」两行的更新排在台架轮次之后。旧口径把录波挂在「工程量口径实测闭环之后」,本波用原始码值解掉了这个依赖(docs/子系统设计/故障录波设计说明.md §3.2)。
三条已裁定口径(用户裁定 2026-10-29,理由见docs/子系统设计/故障录波设计说明.md §1.2 与 §2):
- 采样率 1 kHz(每周波 20 点)——复用现有 TIM3 节拍,与产品需求「80 点/周波」的偏离已在
docs/子系统设计/故障录波设计说明.md§2 显式登记; - 8 路电气量全录,含 V0.1 下必削顶的 STM32 五路,数据不筛选、用位图标记可信性;
- 一屏只画一路、8 路可切换——160×160 单色屏画不出多路,且跨转换器本就没有同一时刻性。
2. 卡片表
资源图例:🔴 标准源(需送检机构/0.05 级标准表)· 🟡 台架可做(信号发生器、注入、FTP、串口)· 🟢 纯软件(主机单测、构建、模拟器)。
| 卡 | 内容 | 退出判据 | 资源 | 依赖 |
|---|---|---|---|---|
| 录波数据面最小闭环〔代码侧完成 / 板级待台架〕 | 新增专用录波环与段格式编解码(docs/子系统设计/故障录波设计说明.md §5 到 §7);bench 构建定周期自抓;FTP 拉回;仓内新增一个纯标准库 PC 脚本读段、画图、重算全周傅氏 |
代码侧判据已完成:三套主机单测 100 / 170 / 110 全 rc=0(环 100、段格式 170、触发状态机 110)、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器两份独立实现字节级互验通过(同一份字节两边同解)。下列判据要板子与台架,一轮未跑:注入 1 V / 50 Hz 正弦 → 拉回段文件 → PC 脚本量出周波数、幅值、极性与注入一致(绝对相位不可比,段内相位以点 0 为参考、触发瞬间在段内点 159,与发生器无相位锁定关系,可核对的是相对相位与极性——见 docs/子系统设计/故障录波设计说明.md §4.2 与 §10);钉轨路数与头里 clip_mask 的合格判据是「头位图 ⊇ 实测钉轨路数,且差异必须能由注入条件解释」(clip_mask 按来源派生、非本段实测,V0.2 后该位恒 0、这条退化为只查实测);强观察项:V0.1 下这五路做交流注入时反而没钉轨 → 先查接线或该路未驱动,属告警面不属失败面;PC 重算的基波有效值与板上 meas: 行、104 浮点 YC 逐个对表通过;段文件 CRC 不符时脚本必须拒绝而不是画出东西 |
🟡+🟢(需信号发生器与板,不需标准源) | 无(可与固件其他道并行;独占构建锁) |
| 手动触发与保护启动接线〔代码侧完成 / 板级待台架〕 | 触发状态机接两路真实来路:UI「手动录波」操作页(第 26 叶绑页,形态沿用已规划好的操作页确认模式)+ 保护启动的元件 picked 上升沿(落点 App/task/protect_task.c 的 s_log_record_edge(),不是判据核本身) |
代码侧已完成:保护启动来路与并发语义(同拍多请求只录一段、冷却期内二次触发只加 ovf、冻结窗口只丢录波样本不丢采集)已在主机单测里钉住,双端编译 0 错误 0 警告。下列属板级未完成(第 26 叶已于 2026-10-29 绑页,模拟器侧手动触发路径已有黄金用例;剩下的必须在真机面板上按):面板按一次出一段;造一次过流,段号与该时刻 /log/start.log 事件能对齐;冷却期内二次触发只加 ovf 计数、不重录(同时看 armed 与那一刻 /log/start.log 的时刻,不要只盯 ovf 数字:这两个计数是跨上下文自增、并发拒绝时可能少计一次,容差见 docs/子系统设计/故障录波设计说明.md §9);冻结窗口内 104 上送与保护判据不受影响(这条是"丢录波样本不丢采集"的验收) |
🟡+🟢+UI 道(菜单树与字库是整文件生成物,须单写者) | 上一张卡 |
| 现场单通道回放页〔代码侧完成 / 板级待台架〕 | 新增「录波回放」叶子与内容页:单通道 2 周波 40 点、阶梯线、0 线与峰值标注、单位徽标、削顶标记、空态文案(docs/子系统设计/故障录波设计说明.md §8) |
代码侧判据已完成:两叶绑页(UI_PAGE_MAP_COUNT = 30)、ui-golden 内容页黄金参考 60 → 66 张(录波 6 态:手动录波 3 态 + 录波回放 3 态),任务树重建模拟器后同一批 66 张连跑三次逐字节一致(页面池水位 5,448 B)、菜单侧 8 状态连跑三次一致(5,368 B),generated-fresh 退出码 0(菜单树与中文字库生成物与源一致),双端编译 0 错误 0 警告。下列判据要板子与台架,一轮未跑:真机上放一段真波(不是模拟器合成节拍)、远端看图能拍到此页(只作留证,不当波形通路)、空态与 CRC 失败态绝不允许画成一条直线要在真机上用坏段复现一次 |
🟢+🟡+UI 道(模拟器与黄金参考) | 上一张卡 |
| 二期(不在本波) | 4 kHz 全速与 80 点/周波、突变量启动、COMTRADE、104 文件传输、分段与参考机形态(录波 65 通道、多类型多段) | 不在本波验收面内;重开条件见 §4 | 🔴/独立立项 | — |
落盘道的失败留痕名(单板上一律一行 [WAVE] seg drop: <原因> (idx=… written=…),统一打印点 App/task/default_task.c:816):crc selftest FAIL / mkdir /wave / opendir /wave / readdir /wave / seg_path / pack_start / f_open / pack_next / f_write short / pack stall / f_close / len mismatch / ring abandoned。最后一条是 docs/子系统设计/故障录波设计说明.md §5.2 第四条陷阱的处置留痕(写完关档后复检环侧身份不过 → 判废本段、err 加一、段号不推进),代码与主机单测面已有、板级未测;另有一条非失败的慢段留痕 [WAVE][WARN] seg held <毫秒> ms (idx=…)(App/task/default_task.c:831)——搬得慢不是错,真失败才走 seg drop。
为什么录波排在信号发生器动态验证之前(用户裁定):动态验证真正缺的不是信号源,是样本出口——录波段文件一旦有了,动态验证就从「比对几个派生标量」升级成「PC 独立重算 vs 板上读数」的对表,同一套台架接线两次都用得上,不必再造一条串口通路。docs/子系统设计/故障录波设计说明.md §11 记了因此而变的三处口径。
3. 顺序与并行度
flowchart TD
DSG[设计定稿: 设计文档 + 本卡片表] --> RING[专用录波环与段格式编解码]
RING --> PC[PC 侧读段脚本与对表]
PC --> BENCH{bench 台架对表通过?}
BENCH -- 否: 回头改环或格式 --> RING
BENCH -- 是 --> TRIG[两路真实触发来路: 手动 + 保护启动]
TRIG --> COOL{冻结窗口内采集与上送无恙?}
COOL -- 否 --> TRIG
COOL -- 是 --> PAGE[单通道回放页与叶子上线]
PAGE --> DONE[录波本波收口: 台账回填 + 文档现状化]
PAGE -. 二期另立项 .-> NEXT[4 kHz 全速 / 突变量启动 / COMTRADE / 104 文件传输];
图内不写步骤号,卡名与 §2 卡片表逐字对应。并行度规则见 docs/环境与部署/并行任务工作树方案.md §7.3;UI 道是单写者——菜单树与中文字库都是整文件生成物,动叶子的那张卡不许与别的改 UI 的道并行。
4. 落地时的硬前置(每张卡收尾都要过)
| 前置 | 为什么 |
|---|---|
跑 scripts/ram_report.py 与 scripts/stack_report.py 前后各一次,回填 scripts/ram_baseline.py --update |
录波环与落盘缓冲约 5.9 KB 静态增量,大于 4 KB 触发 R6 规则(docs/内存管理/内存内容分配策略.md §6 台账与 R6);CCM 只剩七千余字节 → 落位必须进 SRAM1(docs/子系统设计/故障录波设计说明.md §7) |
| 新 .c 双端注册 | new-source-file:MDK-ARM/STM32F407-Demo.uvprojx 与 simulator/CMakeLists.txt 都是显式文件列表 |
@build 0 错误 0 警告 |
任何代码改动后的固定动作 |
| 主机侧单测新增三套并挂总闸 | 环、段格式、触发状态机都是纯逻辑,能被 test-coverage 真跑;别把该测的部分留给台架 |
| 菜单与字库生成物重跑 | 新增叶子改叶数 → 同步 docs/UI设计/页面补齐规划.md 与 docs/任务规划/UI补齐.md 的口径闭合,重跑 tools/menu_gen/gen_menu.py 与中文字库链,过 generated-fresh 与 font-charset |
| 台账回填与文档现状化 | docs/任务规划/README.md 登记簿销项时同步清理引用;docs/子系统设计/故障录波设计说明.md §11 的三处口径要回写 docs/任务规划/数据可信.md |
一期不做(重开条件):4 kHz 全速要等采集节拍改造与算法层抽取结构一并评审(结构约束已写进docs/子系统设计/故障录波设计说明.md §2.1,二期只加不改);突变量启动跟 docs/算法/继电保护功能复现规划.md 的「故障启动(波形启动)」行;COMTRADE 与 104 文件传输等送检或第三方交接需求。
5. 与其它文档的关系
| 文档 | 关系 |
|---|---|
docs/子系统设计/故障录波设计说明.md |
设计与口径属主;本文只登记卡片与判据 |
docs/任务规划/数据可信.md |
上游信度口径;动态波形验证卡因录波而改排在其后,读数出口升级见docs/子系统设计/故障录波设计说明.md §11 |
docs/任务规划/登记簿.md |
原「故障录波与 104 文件传输」暂缓行已随本波立项销项(104 文件传输仍留二期) |
docs/任务规划/UI补齐.md、docs/UI设计/页面补齐规划.md |
「手动录波」叶子旧状态是「不做(录波模块不存在)」,重开条件正是本波;上线后两处的叶数闭合要一起改 |
docs/问题记录/采集与数据处理短板评测.md |
记录链缺口的登记处;本波落地后该行改指设计文档 |
docs/产品需求/产品需求设计文档.md |
「录波采样率」行是本波偏离的对照基准;「立项未排」行与「文件传输(录波)」行按本波状态更新 |