fatfs文件系统使用描述

1、文件系统中在前一篇文章中已经说了要改动比较多的地方就是diskio.c里面的函数。
其次就是ffconf.h文件中,有一个地方必须要修改的 就是
fatfs文件系统使用描述_第1张图片
这个里面的数字 代表你的磁盘个数,就比如你的嵌入式系统中 挂载了3中不同的存储介质。

假设上面的接口对应的不同的存储介质 都已经使用 那么你的_VOLUMES 设置的数量一定要比你的逻辑驱动磁盘数多才可以,否则后面可能在挂载文件系统的时候出错。
因为在USB挂载时候 会查找逻辑驱动号 在范围内正常,不在范围内的会报错。
fatfs文件系统使用描述_第2张图片
这个地方也要修改,意思是你的存储介质的扇区操作大小,有的存储介质扇区操作大小是512Byte 有的是2048Byte 我们使用的存储扇区大小是4096Byte。
所以这个地方 要改成4096Byte.
特别注意的是:
这个地方的改动会对MCU的Ram影响很大,因为在挂载的时候FAT类型的数据 要进行开辟空间,里面有个数组,数组的大小是根据_MAX_SS来进行定义的,所以这个存储介质对于RAM比较小的MCU来说不太适合,建议使用扇区操作是512Byte的存储芯片,这样移植的时候不会出现RAM范围超出的现象。因为这个扇区的操作不仅仅用在这个地方影响RAM,在USB进行在电脑上挂载的时候,MSC里面的代码也会要求提取扇区的操作大小,这个也会被USB开辟空间的时候进行占用4096Byte的RAM。仅仅的这两个地方都已经占用了8K的RAM,其他的集成功能代码想想可知,还有多少余量。我承认我们的RAM比较小才32K,在IAR编译在软件中查看内存的分配地址可以看到:
fatfs文件系统使用描述_第3张图片

fatfs文件系统使用描述_第4张图片
从上面的看出,标红的都是占用RAM高的源文件,里面都是开辟了存储空间的大小就是4096,msdd.o中用到了USB协议栈挂载U盘的文件系统占用的RAM。
text.o中是在操作文件系统函数的时候,挂载了U盘的大小。也占用了较高的RAM。

f_mount(&Fat, "2:", 1);这个是挂载文件系统的函数
你只要想用文件操作函数API,那么f_mount()挂载是第一步 也是必须的,否则所有的API函数都不可以用。

重点说一下第二个参数,这个是物理的逻辑驱动号,这个是写0 1 还是2呢?这个是依据什么来的呢?
这个值是取决于物理接口的定义,也就是
#define ATA 0
#define MMC 1
#define USB 2
当你的USB协议栈的底层函数写的逻辑驱动号是多少,你挂载的逻辑驱动号最好一致。
这样才不会报错,否则你在代码里面挂载的逻辑驱动号可能无法操作flash芯片,配置都是在diskio.c中配置的。

f_mkfs("2:",1,1);
重点讲一下这个函数的第三个参数。
我们这里写的1,表明里面的文件都是按照1字节操作的。
我之前试过,虚拟了一个3M的U盘,当格式化的时候这个地方写成1的话,我在里面存储的1K的大小的文件,那么在windows平台上可以看到占用的U盘的空间是1K。
当你把第三个参数改成512时候,当我在这个U盘存储1k的文件,但是你可以看到U盘的占用属性上面写着是512K左右,直接就是原先的数据的512倍大小的占用。

你可能感兴趣的:(嵌入式系统框架协议栈)