[APM32F1] 管与rtos和fatfs的读写数据问题

[复制链接]
268|4
zrf11123 发表于 2025-11-19 11:13 | 显示全部楼层 |阅读模式
各位大佬,你们好,rtos是为了保证任务的实时响应,所以每个任务的执行时间都不能过长。但是我在使用fatfs写flash数据时,发现耗时很长,这个你们是怎么解决的呢?或者是fatfs写flash不用rtos任务吗
海洋凝视 发表于 2025-11-24 18:44 | 显示全部楼层
把阻塞部分挑出来
梦境摆渡人 发表于 2025-11-25 21:41 | 显示全部楼层
可以考虑将fatfs的写操作放到一个单独的缓冲区中,然后由一个专门的任务或者中断服务程序来负责将数据从缓冲区写入flash,这样可以减少主任务的阻塞时间。
天鹅绒之夜 发表于 2025-11-24 21:52 | 显示全部楼层
在进入等待的时候主动让出来当前任务进程,然后,再通过中断返回当前的任务。
DKENNY 发表于 2025-11-25 18:02 | 显示全部楼层
     提供一种思路:把 FatFS 跑在独立低优先级任务 + 使用 f_sync 延迟提交

     - 给 FatFS 单独建一个任务(优先级最低或次低);
     - 所有文件操作(f_open、f_write、f_read)都在这个任务里完成,或者通过消息队列/事件标志组把请求投递给这个任务;
     - 写数据时先调用 f_write,返回后立即返回给高层任务,不等真正落盘;
     - 关键:只在以下时机才调用耗时的 f_sync(真正触发 Flash 擦除+编程)
          - 定期的定时器(比如每 1~5 秒调用一次 f_sync);
          - 关键数据写完后必须立即刷盘时才调用;
          - 系统空闲时;
          - 关机/掉电前;

    这样平时写文件几乎不存在阻塞,真正的慢操作被推迟到系统空闲或定时刷盘时执行,实时任务基本不受影响。

    打个比方,食堂吃饭
      - 坏做法(现在的方式): 你每吃一口饭,就立刻跑到厨房把碗洗干净再回来继续吃 → 吃饭时间被严重拉长。
      - 好做法(推荐方式):你放心大胆吃,吃完一口就把脏碗先堆到桌子旁边(ringbuffer)→ 吃饭速度飞快。
    假设食堂只请了一个最懒的清洁工(低优先级日志任务),他每3秒钟来收一次碗、慢慢去厨房洗(f_sync),或者等你吃完饭要走了他才去洗。
    这样,你吃饭的速度(实时任务)完全不受洗碗速度的影响!


您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0