自己从第一次接触
Nandflash
到现在也有将近两年的时间了,从刚开始的无从下手到现在的略知一二。
回过头来看自己的学习历程,
积累了很多无论你如何
和泡坛子都学习不到的经验。
现在拿出来分享
给大伙,算是对集体智慧的一种回馈吧。
首先说一下
Nandflash
本身的一些缺陷和优势:
优势:
1
,速度快。这个貌似没啥可说的,对于现在动辄上
G
的芯片容量,速度是必要的基础。
2
,便宜。虽然赶不上硬盘,但是在嵌入式设备里面绝对是性价比杠杠的。
3
,没了。除了傻快傻便宜,真没嘛优势。
劣势:
1
,可靠性不高。这里所说的可靠性分为两个方面,第一是芯片出厂的时候就伴随着一定概率的缺陷。你们
懂得,我说的是坏块。这个缺陷会令很多初入此行的孩纸们丢掉工作,后面会详细说。第二个是芯片使用
过程中的不稳定,当然还是在说会产生坏块的问题。。。
2
,不能片上运行程序。由于无法直接寻址,所以就不可能做到片上运行程序。这是很多网络上文章经常提
到的一点,实际上对生活影响不大。因为现在内存便宜的很,一般的家用嵌入式设备对内存没有这么苛刻
的要求。
3
,芯片操作复杂。不同于
norflash
,
nandflash
没有这么容易操作。我说的操作主要是指不通过驱动程序
直接靠编程完成对于
flash
的存取。
但是我还是要说上面的话:
实际上对于生活影响不大。
因为目前大部分
的民用嵌入式设备都有操作系统,一般为
linux
。
linux
为
flash
设备提供了
mtd
驱动层,我们对于
flash
的
操作都被抽象成了统一的接口甚至是设备符号,无需关心底层实现。
下面来说说实际使用时候的一些心得体会:
一,什么样
nandflash
分区大小是合理的?
考虑到业务的需要,一般我们不会将整个芯片完全当作一个整体来使用。就如同你使用电脑的时候不会只
给硬盘分一个区一样。主要是为了防止对分区进行改动或者重新烧录的时候会丢失全部的数据。
而如何分区才是合理的呢?我归纳主要有以下几点需要注意:
1
,任意一个分区的大小不要超过操作系统所能操作内存的
2/3
。比如你有
128M
内存,
linux
可以支配其中
的
96M
,那请不要将
nandflash
的分区设计为大于
64M
。
这样的考虑主要是因为,如果未来你需要升级这个分区,尤其是通过网络升级这个分区。如果你的升级方
式不是增量式的,
那么你必须有一段与
flash
分区大小一致内存空间用来存放镜像。
这个时候假设你的
flash
分区为
96M
,那么你将不可能完成更新。因为你没有足够的内存空间。除非实时解压缩实时烧录,风险很
高。
2
,
分区一定要给坏块留出足够的空间。
我最早接触到
nandflash
的时候就犯了这个错误,
uboot
大小
200k
,
我给它划分的空间为
256k
,结果遭遇坏块,上下移动都没有空间,非常杯具。