fix(wave): 落盘道改覆盖写,修回放页全板「该段不可读」
段名是 100 个槽位的轮转复用,而写者用 FA_OPEN_APPEND 打开:槽位复用时撞上 同名旧文件,新段接在旧段尾巴上,文件长成 5250 的整数倍。回放页读侧按单段 判 size == total,于是逐件落进 UI_WAVE_REJ_LEN(reject=2),全板没有一段 放得出来。 板级取证(100 件全部归档到 ci-artifacts/wave_append_backup_20261110/): /wave 共 1868 段、9,807,000 B,尺寸全为 5250 的整数倍,恰好等于 5250 的 文件数为 0;逐段过 wave_read 校验全部合法、零损坏——数据一直是好的,只是 容器尺寸与写者语义相抵。 修法(用户裁定取写者截断,否掉读侧多段感知):打开模式改为 FA_WRITE|FA_CREATE_ALWAYS。本移植的覆盖分支会 remove_chain 并清零目录项 FileSize,是真截断;FA_CREATE_ALWAYS 单独用不含 FA_WRITE,两个位必须同给。 日志七本与 soe.log 仍用追加(靠历史累积,语义正确),读侧口径不动。 板端验收:新段尺寸恰好 5250 B;对已有 28 段的 WAVE00.BIN(147,000 B)录 一次当场变 5250 B,全目录总字节减 141,750 = 147,000 - 5,250。回放页从 bad 态(与黄金参考 shot_wave_play_bad 逐比特相同)转为正常态,页眉 24/24 行、页脚 20/20 行与 shot_wave_play 逐字节一致。 文档:故障录波设计说明 §5.2 陷阱表改打开模式完整口径,§10 新增收口记录; 带日期戳的 11-07 取证归档正文按当时口径冻结,只加一条口径已被推翻的指向。
This commit is contained in:
+12
-4
@@ -629,9 +629,17 @@ static FRESULT storage_bring_up(FATFS *fs) {
|
||||
* 函数说明:所有权按 docs/子系统设计/故障录波设计说明.md §5.1——环的生产者是
|
||||
* adcTask,本道是唯一落盘消费者;跨任务握手只认 wave_ring_sealed()。
|
||||
* 本道承担五条口径:
|
||||
* ① 打开一律 FA_WRITE|FA_OPEN_APPEND:本移植 FA_OPEN_APPEND 不含 FA_WRITE
|
||||
* (docs/架构设计/STM32F4-Base存储架构说明.md §10.1 陷阱一),少写位
|
||||
* f_write 恒 FR_DENIED;
|
||||
* ① 打开一律 FA_WRITE|FA_CREATE_ALWAYS(**覆盖,不是追加**):段名是 100 个
|
||||
* 槽位的轮转复用(wave_store.h 的「号 0..99 轮转覆盖,写满回绕盖最老的」),
|
||||
* 槽位被复用时同名文件已存在——用 FA_OPEN_APPEND 会把新段接在旧段尾巴上,
|
||||
* 文件长成 5250×N,而回放页的单段读侧要求 size == 5250,于是逐件判
|
||||
* 「长度废」(reject=2),全板没有一段放得出来。2026-11-10 板级实测:
|
||||
* 100 个文件 / 1868 段全部合法、零损坏,纯粹是容器尺寸与写侧追加语义相抵。
|
||||
* 本移植 FA_CREATE_ALWAYS 会 remove_chain 并清零目录项的 FileSize,
|
||||
* 是真正的截断(Lib/FatFs/ff.c 的 f_open 覆盖分支);
|
||||
* 注意 FA_CREATE_ALWAYS 单独用**不含 FA_WRITE**(本移植旧式标志位),
|
||||
* 缺写位 f_write 恒 FR_DENIED(docs/架构设计/STM32F4-Base存储架构说明.md
|
||||
* §10.1 陷阱一),两个位必须同时给;
|
||||
* ② 每次 f_write 比对写回字节数:本移植簇分配失败返 FR_OK+短写无错误码
|
||||
* (同处陷阱二),短写一律判失败;
|
||||
* ③ 轮转号由本道自持(lead 转告(b)):ring.seg_idx 只是本 boot 本地计数,
|
||||
@@ -766,7 +774,7 @@ static void wave_store_drain(void) {
|
||||
s_wnext_idx) <= 0) {
|
||||
why = "seg_path";
|
||||
} else {
|
||||
fr = f_open(&s_wfil, s_wpath, FA_WRITE | FA_OPEN_APPEND);
|
||||
fr = f_open(&s_wfil, s_wpath, FA_WRITE | FA_CREATE_ALWAYS);
|
||||
if (fr != FR_OK) {
|
||||
why = "f_open";
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user