我的测试代码以SD卡上的大型现有文件test.dat开头,测试执行此操作:
f_open(&fp, "test.dat", FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
f_write(&fp, bufferOfZeros, 4096, &ioBytes);
似乎直截了当。
f_write的结果是SD卡损坏。
我已在我的嵌入式设备上跟踪EDMA以观看FatFs读/写请求。 f_open读取请求都是健康的,它们可以正确找到文件和FAT表。
f_write首先将第一个扇区读入暂存缓冲区,非常好。然后它将零填充到暂存缓冲区中,非常棒。在memcpy为512个零之后,它需要提交扇区并移动到下一个扇区。
此时代码混淆了。它将零的临时缓冲区写入FAT表!!
ff.c / f_write()中的违规代码是:
if (fp->flag & FA__DIRTY) { /* Write-back sector cache */
if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
fp->flag &= ~FA__DIRTY;
这里,fp-> buf是零的扇区缓冲区,但是fp-> dsect是FAT扇区(8318),而不是文件数据扇区(10240)!哎呀。在disk_write()fp-> buf匹配fp-> sect。
这似乎是一个基本用例,我很震惊地看到这一点。
我希望世界上有人有任何人在使用FatF之前解决过这样的问题吗?
答案 0 :(得分:1)
Clifford是正确的 - 这是我的问题,我知道这样一个简单的用例必须有效。
我把测试改为
f_open(&fp, "test.dat", FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
f_write(&fp, pattern, 512, &ioBytes);
f_lseek(&fp, 0);
f_read(&fp, zeroedBuffer, 512, &ioBytes);
这揭示了一个缓存问题。 f_read操作成功,DMA完成正常,但是zeroedBuffer保持不变,因为L0没有被刷新。因此,FatFs看到了正确值和陈旧值的混合。我修复了EDMA缓存,现在一切正常。
另一项学习,TI Starterware附带R0.4b。我从那开始,它返回了令人困惑的FR_RW_ERROR。我向上移动到R0.11a并获得了更好的错误反馈。
有人知道FatFs的单元测试吗?