最近用fatfs读tf内mp3文件并解码播放,发现随着时间推移音乐出现周期卡顿,而且越来越明显,于是排查函数耗时情况,首先是mp3软解部分,排查耗时1ms以内且比较稳定,接着看tf卡读数据,耗时长且逐渐增加,发现是f_lseek的问题,因为mp3文件是分段读-解码,循环往复,需用f_lseek更新定位文件读取位置,随着读取深入f_lseek寻找簇的时间会增加(网上有相关讨论),参考博客和论坛找到解决方法,使用快速seek,文件对象中的成员cltbl不是NULL时启用快速查找函数。
首先,在ffconf.h将FF_FS_MINIMIZE 设置为≤2的值,再将FF_USE_FASTSEEK使能;然后参考以下代码使用lseek:
/* Using fast seek function */
DWORD clmt[SZ_TBL]; /* Cluster link map table buffer */
res = f_open(fp, fname, FA_READ | FA_WRITE); /* Open a file */
res = f_lseek(fp, ofs1); /* This is normal seek (cltbl is nulled on file open) */
fp->cltbl = clmt; /* Enable fast seek function (cltbl != NULL) */
clmt[0] = SZ_TBL; /* Set table size */
res = f_lseek(fp, CREATE_LINKMAP); /* Create CLMT */
...
res = f_lseek(fp, ofs2); /* This is fast seek */
SZ_TBL可以定义大一些,我设置为30*1024。