打印
[PIC32/SAM]

SAMD21驱动SD卡程序开发遇到的问题分享

[复制链接]
676|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Vansm|  楼主 | 2020-4-22 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Vansm 于 2020-4-22 18:17 编辑

      本人最近在做一个项目,利用SAMD21芯片控制一个SD卡的存储文本文件,用的是SPI接口,文件控制系统和SD卡驱动是用Harmony3自动生成的。开发工具用的是MPLAB 5.30。

      问题描述:做项目的时候发现当如果我的SD卡中目标文件太大时,利用SYS_FS_FileOpen(SDCARD_FILE_A_NAME, SYS_FS_FILE_OPEN_APPEND)函数打开目标文件所消耗的时间特别长,当文件大于40M的时候,打开时间甚至超过200mS。

      原来的程序流程是:安装SD卡 -> 打开文件 -> 写入文件 -> 关闭文件  -> 打开文件 -> 写入文件 -> 关闭文件  -> ...

      问题原因:如果按照这个流程  每次打开文件都需要等待200mS以上,十分浪费CPU资源,经过对SYS_FS_FileOpen函数分析发现时间消耗在了f_lseek中,也就是打开文件时设置文件写指针的过程。因为我在SYS_FS_FileOpen()函数中传递的参数是SYS_FS_FILE_OPEN_APPEND,表示在文件后面追加数据。所以文件打开时需要定位文件的写指针到文件最后,文件非常大时,这个过程自然非常长。

      解决方法:如果文件要频繁写入读取,不要频繁的打开文件和关闭文件,只需要打开一次即可,后面直接写入文件,有人怕没有关闭文件造成数据丢失,这里就需要用到SYS_FS_FileSync()函数,此函数的描述是:


    Description:
      This function flushes the cached information when writing to a file. The
      SYS_FS_FileSync function performs the same process as SYS_FS_FileClose
      function; however, the file is left open and can continue read/write/seek
      operations to the file.


此函数的流程与文件关闭流程类似,但是不会关闭文件,可以方便下次写入。  
这样写文件的过程变成:  安装SD卡 -> 打开文件 -> 写入文件 -> 同步文件 -> 写入文件 -> 同步文件  -> 。。。 -> 关闭文件

这样就不会发生频繁打开关闭文件造成的额外CPU开销。


PS: 分享一点开发过程的技巧和知识点,高手勿喷。, 如果其他更好的解决方法或者技巧,欢迎留言交流。 By Vansm



使用特权

评论回复
沙发
magicmcu| | 2020-4-27 10:02 | 只看该作者
实践高手  有好的体会以后多多分享

使用特权

评论回复
板凳
martin| | 2020-4-27 11:37 | 只看该作者
本帖最后由 martin 于 2020-4-27 16:28 编辑

赞!很好的分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

187

帖子

3

粉丝