硬汉嵌入式论坛

 找回密码
 立即注册
查看: 756|回复: 4
收起左侧

[有问必答] fatfs文件系统在freertos下频繁读写sd卡

[复制链接]

6

主题

5

回帖

23

积分

新手上路

积分
23
发表于 2023-10-20 10:32:30 | 显示全部楼层 |阅读模式
现在的要求是每50ms需要记录大约150个16位数据,freertos创建了6个任务,分别是1ms,10ms,10ms,100ms,100ms,1000ms,用的是vTaskDelayUntil延时,优先级从1ms到1000ms依次降低,这个记录的功能要怎么实现才能保证每次写入的时候都是准确的50ms间隔(每条数据都有记录的时间),而且不会因为任务切换写入被打断导致写入出现问题(我在测试的时候发现用sd卡底层驱动用dma方式会出现偶尔写入失败会导致文件修改时间丢失的现象。sd卡底层驱动用轮询方式,写入和读取前后使用taskENTER_CRITICAL() taskEXIT_CRITICAL()能保证每次写入数据都是正确的,但每条数据写入都要大约二十多ms的时间,影响到了1ms和10ms任务的运行
mcu用的gd32f470,老哥们有没有什么建议,感谢。
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-10-20 11:18:48 | 显示全部楼层
再强的卡写这么频繁都会被你写坏。可以搞个缓存,先把数据写到缓存里,每隔几分钟或者多少次再把缓存里的数据写入到SD卡中。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-10-20 14:44:17 | 显示全部楼层
本帖最后由 caicaptain2 于 2023-10-20 14:49 编辑

默认的任务切换间隔就是1ms。 你的那个1ms任务已经把cpu占完了啊。。。 需要选更快的mcu,再改任务时间切片为10us或以下才能匹配你的需求了。

你可以参考这个帖子的内容:
https://www.armbbs.cn/forum.php? ... 0%BB%BB%CA%B1%BC%E4
FreeRTOS 388ns切换一次,RTT 540ns切一次,RTX 1.04us才切换一次。 这个是基于RT1502,主频500MHz的mcu。


还有一篇帖子说道,RTX的任务切换大约需要200个主频周期。
回复

使用道具 举报

5

主题

165

回帖

180

积分

初级会员

积分
180
发表于 2023-10-20 19:13:42 | 显示全部楼层
这个数据量不算多的,算下来每秒6KB,完全可以搞个几KB或者十几KB的缓冲区,收到数据后先保存到缓冲区,等装满或者到一定数量后再写入sd卡,数据多点还能利用上sd卡的写入速度,单次写入数据太少的话sd卡速度其实是很慢的

可以搞两个任务,一个负责接收数据,组织好数据格式后丢到缓冲区,等缓冲区装满后发送信号量,另一个负责数据写入sd卡,阻塞等待信号量,信号量来了才写入,写完以后继续阻塞等待下个信号量,这样既不会丢数据,也延长sd卡寿命
不过缓冲区的方式需要考虑异常断电的时候,缓冲区内剩余数据的处理

dma写入失败有可能是DMA的4字节对齐问题
回复

使用道具 举报

6

主题

5

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-10-24 13:41:11 | 显示全部楼层
DX3906 发表于 2023-10-20 19:13
这个数据量不算多的,算下来每秒6KB,完全可以搞个几KB或者十几KB的缓冲区,收到数据后先保存到缓冲区,等 ...

感谢,我去试试看
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 01:06 , Processed in 0.233605 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表