0

我正在开发一个带有 stm32L496 + FreeRtos + FatFs 的数据记录器。数据记录器将数据保存到缓冲区,当缓冲区满时,借助 fatfs 和 SDMMC+DMA 将缓冲区保存在 SD 卡上的文件中。当工作文件太大(15Mo)时,这个文件被移动到另一个目录。但有时,由于 f_rename 的时间很长(500 毫秒),我已经超限了。我可以增加缓冲区来隐藏问题,但我不明白为什么这个函数需要这么多时间。

有人有这个问题吗?我使用的是 FAT32 格式的 Fatfs R0.12c。

我发现当函数调用“follow_path”、检查新文件是否存在以及调用“dir_find”而变量“path”为空时,代码需要很长时间。(所以当这是最后一段时)。

在 f_rename :

/* At FAT12/FAT16/FAT32 */
                mem_cpy(buf, djo.dir + DIR_Attr, 21);   
                mem_cpy(&djn, &djo, sizeof (DIR));      
                res = follow_path(&djn, path_new);   ==> This is the problematic function   
                if (res == FR_OK) {                     
                    res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST;
                }

在 follow_path 中:

for (;;) {
            res = create_name(dp, &path);   ==> if after this function, path == ""
            if (res != FR_OK) break;
            res = dir_find(dp);  ==> this function can takes 500ms even @ 50Mhz
            ns = dp->fn[NSFLAG];

如果我提高时钟速度,代码不会更快,所以我认为这是一个软件问题。

任何想法 ?

4

0 回答 0