fatfs文件系统在freertos下频繁读写sd卡
现在的要求是每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,老哥们有没有什么建议,感谢。
再强的卡写这么频繁都会被你写坏。可以搞个缓存,先把数据写到缓存里,每隔几分钟或者多少次再把缓存里的数据写入到SD卡中。 本帖最后由 caicaptain2 于 2023-10-20 14:49 编辑
默认的任务切换间隔就是1ms。 你的那个1ms任务已经把cpu占完了啊。。。 需要选更快的mcu,再改任务时间切片为10us或以下才能匹配你的需求了。
你可以参考这个帖子的内容:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=86520&highlight=%C8%CE%CE%F1%C7%D0%BB%BB%CA%B1%BC%E4
FreeRTOS 388ns切换一次,RTT 540ns切一次,RTX 1.04us才切换一次。 这个是基于RT1502,主频500MHz的mcu。
还有一篇帖子说道,RTX的任务切换大约需要200个主频周期。
这个数据量不算多的,算下来每秒6KB,完全可以搞个几KB或者十几KB的缓冲区,收到数据后先保存到缓冲区,等装满或者到一定数量后再写入sd卡,数据多点还能利用上sd卡的写入速度,单次写入数据太少的话sd卡速度其实是很慢的
可以搞两个任务,一个负责接收数据,组织好数据格式后丢到缓冲区,等缓冲区装满后发送信号量,另一个负责数据写入sd卡,阻塞等待信号量,信号量来了才写入,写完以后继续阻塞等待下个信号量,这样既不会丢数据,也延长sd卡寿命
不过缓冲区的方式需要考虑异常断电的时候,缓冲区内剩余数据的处理
dma写入失败有可能是DMA的4字节对齐问题 DX3906 发表于 2023-10-20 19:13
这个数据量不算多的,算下来每秒6KB,完全可以搞个几KB或者十几KB的缓冲区,收到数据后先保存到缓冲区,等 ...
感谢:lol,我去试试看
页:
[1]