提供一种思路:把 FatFS 跑在独立低优先级任务 + 使用 f_sync 延迟提交
- 给 FatFS 单独建一个任务(优先级最低或次低);
- 所有文件操作(f_open、f_write、f_read)都在这个任务里完成,或者通过消息队列/事件标志组把请求投递给这个任务;
- 写数据时先调用 f_write,返回后立即返回给高层任务,不等真正落盘;
- 关键:只在以下时机才调用耗时的 f_sync(真正触发 Flash 擦除+编程):
- 定期的定时器(比如每 1~5 秒调用一次 f_sync);
- 关键数据写完后必须立即刷盘时才调用;
- 系统空闲时;
- 关机/掉电前;
这样平时写文件几乎不存在阻塞,真正的慢操作被推迟到系统空闲或定时刷盘时执行,实时任务基本不受影响。
打个比方,食堂吃饭: - 坏做法(现在的方式): 你每吃一口饭,就立刻跑到厨房把碗洗干净再回来继续吃 → 吃饭时间被严重拉长。
- 好做法(推荐方式):你放心大胆吃,吃完一口就把脏碗先堆到桌子旁边(ringbuffer)→ 吃饭速度飞快。
假设食堂只请了一个最懒的清洁工(低优先级日志任务),他每3秒钟来收一次碗、慢慢去厨房洗(f_sync),或者等你吃完饭要走了他才去洗。
这样,你吃饭的速度(实时任务)完全不受洗碗速度的影响!
|