本帖最后由 爱吃鱼的宇仔 于 2022-4-13 16:21 编辑
反反复复测试发现,向SD卡写入数据的瓶颈是在4GB左右,不由让人想起SDIO接口寻址的问题,如果地址为32位,即寻址范围在0~2^32,所以猜测有可能是这方面出现了问题。 查阅资料和分析代码之后,可知: (1)Diskio.c文件:在FATfs文件系统应用中,如下图,此时函数参数中sector表示的是扇区地址,DWORD表示32位,且每个扇区有512字节,这是有ffconf.h头文件中定义的,所以可以访问2^32*512个地址,即可以访问4G*512字节的容量,没有问题。
(2)我们继续继续看SD_WriteDisk()函数里面的内容:由下图可知,两个函数将参数中的sector扇区地址左移了9位赋值给lsector,即扩大了512倍,正好符合一个扇区512字节的数据的理论。然后将lsector(64位)传给sd_block_write()函数中,接着看这个函数接口(步骤三); (3)函数接口里,如下图:参数readaddr表示数据的字节地址,32位宽度,而传进来的参数为64位,所以当我们在FATfs文件系统应用层向SD卡写入大于4GB的数据时,将会产生溢出,把32位宽度以上的值舍弃掉,所以才会导致写入数据失败,将此参数变量改成uint64_t就可以接收完整的64位宽的参数即可以访问大于4G地址。
到此,FATfs文件系统不能写大于4GB数据的问题觉得到解决了。
|