| 
 
| 本帖最后由 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 
 
 
 
 | 
 |