以前NOR FLASH用得比较多,因为此类FLASH一般是不考虑坏块的,若有坏块就不能使用。而NAND FLASH坏块现象非常普遍,
大部分人都在操作系统的基础上使用,不会发现有什么问题。因为操作系统对NAND的读写操作做了封装,并且是基于文件系统之上,
对用户是透明的。其实之前刚用NAND FLASH时,也没有发现什么需要特殊注意的地方。但今天的调试后发现的问题,让我感觉使用
两者FLASH时需要考虑的程序设计细节!
下面就举一个嵌入式开发过程中FLASH分区的例子,警惕自己以后特别注意:
FLASH划分为boot, para, kernel, rootfs(yaffs), dbase(yaffs)。假设:
boot +loader 512K
para 512k
kernel 6M
rootfs 12M
dbase 6M
系统启动后,boot部分引导代码处于NAND FLASH的无坏块区,即第一个BANK。之后的运行过程中如果涉及到读写FLASH,都需要进行坏块的
计算。所以,如果BOOT+LOADER编译出来就由512K,那么千万不要把BOOT分区只定义到512K这么大。万一后续升级后发现有坏块,都没地方
写了,只有溢出BOOT分区,写到PARA参数分区。
同样,当通过boot写其他分区时,避免整块的读写操作。比如更新PARA时,一般NORFLASH经常都从PARA读512K数据,修改后直接存储512K进去。
即便参数有可能只有几十K的数据大小。(并且千万不要按以前通过分区尾最后一个字节来判断分区的有效性,这里是行不通的)
如果有坏块,实际的phylength肯定要大于512K,就会产生错误。最好定义一个PARA的结构体,通过结构体的大小来判断读写
界限。
对于YAFFS文件系统类的分区,其实原则也是一样的,对于常用的DBASE数据库分区,可以定义的大一些,因为操作久了,坏块可能会增加!
只是具体的保护由文件系统来执行,但最终的结果肯定是存储不下的!