484d068250
道F 批 2 / task-16。FTL 单页写回缓存(nand_ftl.c s_cache_dirty)与 dhara journal 只在换页/整页写/f_close 时刷出,漏网脏页的掉电驻留窗无上限。本 提交以最小面收口:不碰 GD5F/dhara 驱动,全部走既有 FatFs CTRL_SYNC 路径。 实现 App/fs/vol_idle_sync.[ch](新增,仅 MCU 端,uvprojx App 组注册): - 四级门:STORAGE_READY 就绪门 → 5 s 节流(无符号差回绕安全判据)→ vol_lock_wait(0) try(锁被持有=文件序列在做,跳过,不改 STOR 持有期 语义)→ disk_ioctl(0, CTRL_SYNC); - clean 态脏标志+journal 双短路、零 NAND 触点;脏态最坏 = 一次 f_close 的同步段同型成本,不引入新磨损来源; - 失败按边沿 latch 一条 DBG_ERROR、成功重新武装;失败路径也成对放锁; - TEST_SUITE_STORAGE 构建整体 no-op(卷由 testTask 独占)。 接线:defaultTask 主循环 syslog_drain 之后(default_task.c v1.3)。 文档:docs/架构设计/STM32F4-Base存储架构说明.md §5.5 补空闲兜底与边界; 本板无掉电检测硬件、不做掉电前强制 flush、勿当掉电保护——口径同步落 注释与文档(sys_log_mcu.c 两处旧「暂不做」注释随实现改口)。 测试:新主机单测 test/host/vol_idle_sync/(TC-VOLSYNC-001..012,19 断言 全过);scripts/id_registry.json 建 TC-HOST-VOLSYNC 族(仿 ADCCAL 先例); .pre-commit-config.yaml 加 vol-idle-sync-unit-test hook(只加自己条目)。 越界申报(①②③ 均 lead 批准,④ 为门禁连带必要): ① App/task/default_task.c 单点接线(include + 1 调用 + 头修改记录); ② docs/架构设计/STM32F4-Base存储架构说明.md §5.5; ③ .pre-commit-config.yaml 单 hook + scripts/id_registry.json 单族; ④ scripts/check_registration.py SIM_EXEMPT 加一行(vol_idle_sync.c 模拟器 侧豁免,registration-check GAP 所需;与批准③同类别但未列名,特此申报)。 体积增量(vs scripts/ram_baseline.tsv 2026-10-25 行): Flash(Code+RO) 237140→237328(+188 B)、RW 1224→1232(+8 B)、ZI 0; 增量 = 3 个文件级 static + 一处 DBG_ERROR 调用点;栈/堆无变化。 gate: only mem-budget/mem-numbers pending lead ledger backfill 全量 pre-commit --all-files:40 项 Passed,仅 mem-numbers(D-7 体积档)与 mem-budget 两条红 = 台账数字待回填(增量如上,属 lead 单写者禁区); 其余含 doc-links/id-check/registration/test-coverage/全部主机单测皆绿。 @build 0 错误 0 警告(Code=215932 RO=21396 RW=1232 ZI=131984)。 台架:空闲 sync 实机节奏(clean 零触点、脏态时长、无心跳扰动)属实际 测量采样类——本批跳过,留「待台架实测」。
51 lines
2.5 KiB
C
51 lines
2.5 KiB
C
/*
|
||
* 模块名称:Volume Idle Sync(写回缓存空闲 flush)
|
||
* 模块功能:随 defaultTask 主循环周期轮询,在存储**空闲**时对 NAND FatFs 卷
|
||
* 补发一次 CTRL_SYNC(FatFs 幂等落盘语义 = FTL 单页写回缓存脏页刷入
|
||
* + dhara journal 待办收账,见 docs/架构设计/STM32F4-Base存储架构说明.md
|
||
* §5.5),作为写回缓存持久性的兜底网:
|
||
* - 正常写事务语义不变:f_close 内部 sync_fs 已同步,本模块零干预;
|
||
* - 价值在漏网兜底:任何"缓存留脏、之后再无调用触发 sync"的状态
|
||
* (异常路径中途放锁等)其掉电驻留窗从"无限期,直到下一笔写"
|
||
* 收敛为"不超过本模块周期";
|
||
* - 卷不空闲(卷锁被持有:syslog 落盘 / 配置保存 / lftpd
|
||
* open...close 序列进行中)本轮跳过——不改变文件持有期(如 FTP
|
||
* STOR 进行中)的既有语义。
|
||
* clean 态零 NAND 触点(脏标志与 journal 双短路);脏态成本与一次
|
||
* f_close 同型。周期 5 s(.c 内 VOL_IDLE_SYNC_PERIOD_MS)。
|
||
* ⚠ 边界(勿当成掉电保护):本板无掉电检测硬件,"掉电前强制 flush"
|
||
* 不可行;"单次写事务进行中掉电"的丢失边界也不因本模块改变。
|
||
* 适用平台:STM32F407ZGTx + FreeRTOS(CMSIS-RTOS V2);仅 MCU 端,
|
||
* 主机侧 L0.5 单测 test/host/vol_idle_sync/
|
||
* 作者:DTU 项目组
|
||
* 创建日期:2026-10-25(道F 批 2:写回缓存空闲 flush 收口)
|
||
* 修改记录:
|
||
* v1.0 2026-10-25 DTU 项目组 创建:STORAGE_READY 门控 + 周期节流 +
|
||
* 卷锁 try + disk_ioctl(CTRL_SYNC) + 失败边沿 latch
|
||
*/
|
||
|
||
#ifndef VOL_IDLE_SYNC_H
|
||
#define VOL_IDLE_SYNC_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*
|
||
* 函数功能:存储空闲周期同步的轮询入口(内部自带就绪门控 / 节流 / 非阻塞
|
||
* try 锁 / clean 短路,调用点每轮无条件调用即可)
|
||
* 入口参数:无 void
|
||
* 返回值:无 void
|
||
* 限定条件:仅 defaultTask 主循环调用(存储属主任务;本函数内部绝不阻塞——
|
||
* defaultTask 是看门狗喂狗点,见 vol_lock.h 使用约定);
|
||
* TEST_SUITE_STORAGE 构建下为空实现(卷由 testTask 独占,后台同步
|
||
* 必须彻底静默)
|
||
*/
|
||
void vol_idle_sync_poll(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* VOL_IDLE_SYNC_H */
|