【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们已经实现了spi norflash的驱动,理论上这已经可以实现数据的持久化保存了。为什么还需要一个文件系统呢?主要原因还是不方便。如果没有文件系统的话,我们访问文件都需要知道确切文件的sector地址和大小,这样很麻烦。此外,写入、读取文件的时候,还要提前规划好文件的大小,防止不同的文件之间相互覆盖。而有了fatfs之后,使用上就不需要这么小心翼翼了。
另外,今天我们还提出了一个中间件的概念。什么叫中间件呢,其实就是说这部分代码本身处于系统中间的位置。对上,它提供调用接口;对下,它需要具体硬件的适配。所以,只有这样的代码才称之为中间件。
1、除了fatfs之外,还有哪些中间件
广义的中间件还是蛮多的。比如说图形界面的lvgl,网络协议栈的lwip,实时操作系统rtos严格意义上也可以看成是中间件,毕竟它下面对着cpu,上面提供os接口。
2、fatfs需要适配哪些接口
目前来说,fatfs需要适配这么几个接口函数,
disk_status
disk_initialize
disk_read
disk_write
disk_ioctl
get_fattime
其中disk_status一般就是判断一下硬件的状态。disk_initialize代表硬件初始化,norflash的初始化话就在这里。disk_read代表读取数据。disk_write代表写入数据。disk_ioctl主要就是回复一些硬件属性,比如sector多大,整个硬件容量多大等等。get_fattime获取系统时间。
这几个接口都是在diskio.c文件里面,还是很好辨认的。
3、fatfs支持哪些硬件
理论上fatfs支持任何的硬件,只要按照它的要求做好底层适配就好了。不过目前为止,用的比较多的还是norflash和tf卡。norflash一般是固化在开发板的,往里面存文件不太方便。这个时候如果有一个可插拔的tf卡,直接通过fatfs,把文件从tf卡copy到norflash,那就很方便了。
4、fatfs给上层提供的接口
fatfs对外提供的接口其实和大多数文件系统都差不多,一般就是这些接口,大家不用全部掌握,用的什么学什么就可以了,
f_mount
f_mkfs
f_open
f_write
f_read
f_close
5、配置fatfs
fatfs自身也是可以配置的,比如我们希望对fatfs进行功能裁剪的话,直接配置ffconf.h文件就可以了。
6、测试方案
fatfs的测试还是比较容易的。首先对norflash进行fatfs加载,如果发现不能加载,那么先进行格式化操作,格式化完了再加载。接着就是写入数据、读取数据。判断一下写入的数据和读取的数据是不是吻合。最后就是卸载fatfs了。
7、调试
本身作者给出了完整的项目代码,和之前norflash相比较,其实就多了fatfs三个文件,
编译、烧入后,我们发现fatfs执行是失败的。进一步调试,发现在disk_status状态确认的时候,返回值是错误的。单步后发现,还是flashid判断的问题,重新调整修改一下代码,
if(SPI_FLASH_ReadID() == 0x684016)
{
status &= ~STA_NOINIT;
}
else
{
status = STA_NOINIT;;
}
至此,我们可以看到在上位机串口打印上,一切ok正常了,