f_lseek速度优化

最近用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。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值