故障录波回放页:开机后新段不进钉住的段表(F1)+ 数据 CRC 判废串口静默(F2)——#68 第二幕尾步现场发现建档,方案待裁定 #93
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This is by an automated agent, not a human.
立单缘由
2026-11-06 #68 第二幕尾步(回放页「坏段 / 无录波段」两画面板级闭环)的台架远程轮记下两条现场发现:F1 开机后新段不进回放页段表、F2 数据 CRC 判废在串口静默。收工报告(#91 尾步评论)口径「记录在案,不修码」;本次按 @wandering1 指示另立本单,把两条发现从「在案」升级为「带完整方案与影响评估的可排期工单」。本单零代码改动,是否执行、按哪个方案执行等用户裁定。
两条发现的实测画面与串口摘录在
docs/测试说明/测试数据/wave_shot_20261106/(发现原文见该 README §两条现场发现;复现口令同目录);台账面见docs/子系统设计/故障录波设计说明.md§10「回放页坏段/空态画面闭环记录」末段。本单不改动 #68 已闭环的判定。F1|开机后新段不进回放页段表(段表钉住缓存的实面)
现象(实测):开机后 FTP
STOR /WAVE/WAVE09.BIN(坏版与有效版都试过),回放页段表始终不出现该段号——左右键把段环游满圈(周期 9,导航脚本连发r)也到不了它,静默出局、串口零留痕。本轮据此按手册原文改用列内既有段同号覆盖(RETR WAVE06.BIN → byte[130]^=0x01 → STOR 同号),一次即中;手册 §4 步 7 的「同号覆盖」纪律本来就是绕着这条路写的。本单把「为什么投放新段号不行」钉成工单,免得后人重踩。机理(代码钉死;钉表本身不是 bug,是 11-02 v1.6 的防抖纪律):回放页段表是 RAM 缓存静态表(
App/task/ui_task.c)——s_wave_idx / s_wave_cnt / s_wave_scanned(ui_task.c:434–436);ui_task_wave_scan()(:464)成功即钉s_wave_scanned=1(:535),失败不钉(11-02 修复)。ui_task_wave_manual_req()清s_wave_scanned(:691,同一支还清段头缓存:692,lead 裁定 2026-10-29 第 3 条);② 当前段号不在表内时先重扫再定位ui_task_wave_seg_around()(:732–734)——即「当前段消失」天然收敛面。Drivers/BSP/UI/ui_page_wave_play.c的pg_init只清页状态、零 I/O,:328–331);ui_task_wave_table()见s_wave_scanned==1直接返回不重扫(:545–550)。⇒ 开机会话内,凡是磁盘上新出现的段号(FTP STOR、defaultTask 落盘占用新号)对已钉的表一律不可见,直到下一次作废触发。
影响:
pg_key空态按左右键 =wp_ensure再探(ui_page_wave_play.c:408–411,注释原话「新段可能已落」),但seg_first → ui_task_wave_table被钉住的表短路,永远不会去枚举目录。钉表纪律与这句页面承诺之间存在缝隙——这是 F1 定性的本体:不是新缺陷复活(11-02 的「枚举恒空」是判返回值错误,性质不同),而是缓存失效面覆盖不全。manual_req的落盘路径(P 触发现被标定闭锁,故未实测)——在回放页不可见,直到某次作废触发;同号轮转覆盖则可见(本轮坏段即这样命中),所以暴露面收窄为「段号尚未在表上出现过」的窗口。录波功能的核心场景恰恰是事后取新段,这个窗口值得修。DELE后钉住的表仍会对已删文件逐个撞open fail fr=4(本轮 18:14:55–58 三条)——画面结论仍对(「无录波段」),但取证面呈「表盘不一致的重试」而非dir ok, 0 seg entries(ui_task.c:520)那条干净事实。候选方案:
Drivers/BSP/UI/ui_data.h加wave_enterop(契约与manual_req同族,ui_data.h:951–957);App/task/ui_task.c实现 = 清s_wave_scanned且清s_wave_cache_ok(与manual_req:690–697同纪律——同名文件被顶掉后旧段头不能拿旧尺子量新段);ui_page_wave_play.c的pg_init调用一行;simulator/main.c假桩补字段保编译。重扫仍懒在首帧,开页链零 I/O 不破f_opendir+ 至多WAVE_ST_SEG_MAX(100)次f_readdir——这笔账ui_task.c:412–414已列入既有「一次渲染最坏包络」,页内按键不新增任何重扫,11-02 钉表防抖纪律原样保留pg_key的 IDLE 分支调wp_ensure前先调同一作废 opA+B 后仍剩一个残余面:页开着时投放的新段要再开一次页才可见——属缓存语义内,写进手册 §4 与设计说明 §10 的纪律性事实段即可,不为它加机制。
验收标准(板级远程轮,bench 锁):
DELE全空 → STOR 任一文件 → 空态按左右键 → 该段可见(B 的独立判据);UD/LR连按不新增ui wave scan串口锚点(钉表防抖回归面:11-02 行为零变化);manual_req同时作废段表+段头缓存行为回归不变;坏段/空态两画面判据复跑 = 与wave_shot_20261106三态帧同判(F2 修前修后画面本就如此);验证盲区点名:模拟器用假
s_wave_ops桩、主机单测不编译ui_task.c读路径(11-02 修复记录原话:「模拟器……不编译读路径,黄金参考图与三组主机单测从未暴露此病」)——本单两条的验收只能落板级轮,主机全绿不构成修复证据。F2|数据 CRC 判废在串口静默(靠画面自证)
现象(实测):坏版同号覆盖后进入该段,画面即刻「该段不可读」(
WP_ST_BAD显式文案、零波形元素、绝不平线——判据本身过,ui_page_wave_play.c:343–346),串口同一时刻零新增留痕。本轮靠 PC 侧对同一份字节test/host/wave_read.py dump打出REJECT: data CRC16 mismatch: stored 0xF991 calc 0xB111 over 5120 bytes at offset 128(rc=1)才完成互证。机理(设计如此,非漏修):
ui_task_wave_load_head()(ui_task.c:586)判废共五类出口——头解析 / 尺寸自相矛盾(head_parse)、长度等式不符、数据窗读失败、尾 2B 读失败、CRC 比对不符——统一归UI_WAVE_BAD;串口留痕只给「表上列着、开档失败」那一类(ofr != FR_OK分支:669–674,即open fail fr=)。11-02 的设计逻辑:没视觉面的失败必须留痕,有画面自证的可以静默。本轮实测无违和,F2 不是翻案,是把该口径的适用边界钉出来。影响:「画面自证」的前提是画面在场。
RETR复取 +wave_read判(本轮即为此多走两道传输);候选方案:
load_head五类 BAD 出口汇成一个DBG_*留痕调用点(AGENTS.md 日志成本口径:每调用点约 90 B Flash),形如ui wave head idx=%u reject=%u,原因枚举 = 1 头解析 / 2 长度等式 / 3 窗读 / 4 尾读 / 5 CRC 不符;第 5 类可再带 stored/calc CRC16——与 PC 侧wave_read的 REJECT 行同名互证。行长远低于DBG_LINE_BUF_MAX(192)无需单独抬。:667–668s_wave_cache_ok=0),天然形态 = 每次进入坏段一行,与按键、画面一一对应;若嫌反复进出坏段刷行,可加「(idx, 原因) 相对上一次变化才记」的去重——代价是同号再投放再判废不留行。默认推荐不去重(判废是低频人工动作,逐次留痕正是取证要的东西),取舍留给裁定。DBG_ERROR与同函数既有留痕同面(open fail即 ERROR),但[ERR]是/serial-boot-test的 Forbidden 标记——故意投放坏段的轮次会命中(本轮已把fr=4按「留痕本意」写进证据 README 豁免口径)。不想扩豁免面可用DBG_INFO(0 段事实行有 INFO 先例,ui_task.c:520)。推荐:保持 ERROR + 手册 §3 判读表补一行「坏段轮 reject 行 = 预期内」,拒收本属红色事件;最终级别留给用户拍板。/log文件——判废要进七本定长记录就得开持久化新面(单写者纪律、记录格式扩容),成本一个量级、收益不比串口常驻的这行字多。验收标准(板级远程轮):
wave_read同判一致(第 5 类附两组 CRC 值可逐值核对),画面「该段不可读」逐比特不变;/serial-boot-test:零新增[ERR],启动门禁标记不受扰;docs/子系统设计/故障录波设计说明.md§10 同步新留痕口径(含级别裁定记录)。执行约束(排期时照此办)
App/task/ui_task.c读侧(F1 另触ui_data.h注入契约、ui_page_wave_play.c一行、simulator/main.c假桩),数十行级 + 文档同步(设计说明 §10、手册 §3/§4 判读面;登记簿按「完成即销项」删行、不留已消化行)。/keil-build0 错 0 警;F1 触页文件须跑ui-golden(回放页黄金参考);bom-guard——App/task/ui_task.c与Drivers/BSP/UI/两文件都在带 BOM 名单内,Edit 后须核对补回;doc-links三件套。scripts/board_ui_nav.py取帧注键 +test/host/wave_read.py互证 + serial-assistant 摘录),复现口令现成,见docs/测试说明/测试数据/wave_shot_20261106/README.md。关联
docs/子系统设计/故障录波设计说明.md§10);#90 / #67(测试面代码已在库)。docs/测试说明/测试数据/wave_shot_20261106/(三态帧 +_raw3200.bin原帧 + 串口摘录 +samples/坏样本 / 原件对,sha256 全清单)。docs/子系统设计/故障录波设计说明.md§10「回放页枚举恒空缺陷修复记录」(2026-11-02,钉表纪律与留痕设计的诞生地);docs/测试说明/专项验证/故障录波板级到场轮执行手册.md§4(同号覆盖纪律原文)、§7(收工二选一)。