最近一直在想给自己做的简易Hmi组态屏做一个保证FAT的稳定层,也就是所谓的日志系统(好像听人说这类玩意有个名字叫做FTL,又叫擦写均衡算法,嘛,反正纠结名词不是我喜欢的做法,所以就叫FTL吧)。
首先我用的硬件是LPC1788+SDRAM+W25Q128的组合,软件用的是RT-Thread RTOS以及它的组件driversSpi框架和DFS文件系统,底层文件系统则是FAT。
为什么是是FAT呢?首先是考虑到拷贝数据方便。因为实际上我开发能力很弱,没多少开发经验,所以要我用一个人做LPC1788跟电脑的USB device驱动并自动读写,这是不可能的,我欠缺必要的USB知识,另外一个人搞HIM组态是很吃力的,还去学驱动是不可能有时间的,所简单的,选择直接跑Host Massstoge协议,直接读取U盘文件,因为一般我们用的都是Windows,U盘都是FAT系统,所以下面也跑FAT系统比较方便,可以实现文件拷贝。此外,因为用的是SPI flash,空间很小,但是本身坏块概率不大,如果上linux上面的那些文件系统,感觉是相当不靠谱的……
正题,FAT文件系统本身比较简单,什么都不带,它的功能就是读取跟保存,不带其他多余的东西,不像别的系统一样带FTL算法(就是擦写均衡以及坏块管理、日志),一般情况下只要操作得当,系统是没问题,但是当所在环境不对的时候,问题就会出来了。因为FAT读写都是直接地址,比如说,它的系统信息必定会保存在一开始连着的那几块里面,而任何文件系统相关改写劲操作,都会写这部分区域。而就我们知道的,spiflash是写前要先擦除的,如果在擦除到写入这短时间整个系统掉电,那么恭喜你。你系统可能挂了!!!
在一开始用这个的时候我就知道有这个弊端了,但是当时没办法,首先是因为我用的环境很少断电,另外,则是因为基本功能都没做完就去考虑别的是傻逼的行为!!!基本东西都没做完考虑稳定性是有毛用?
但是后面随着自己上位机也开发出来,硬件也定型后,也得考虑怎么去解决这个问题的,因此就开始用笔在纸上画,考虑具体环境与相应解决措施:
1.系统日志
首先要考虑的是,FAT为什么会挂掉呢?说白了是表头信息丢失或者不完整,这后果简单的,只需要重新创建文件系统,下对应资源就好,但是丢失的文件是找不回来了。而严重的就是因为表信息不完整,FAT在解析一半的时候直接死机了,这时候真是没办法了,只能维修了(刷修复系统固件,拒收再刷回来)。