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