http://blog.csdn.net/tigerjibo/article/details/9322035

[摘要]:作为一个嵌入式工程师,要对NorFlash 和NandFlash要有最起码的认知。本文通过从启动方式、读写方式、容量成本、可靠性、寿命以及是使用型上进行了全面的分析和对比。任何事物都两面 性,因此其本身没有好坏之分,重要的是我们如何使用使其达到性能上的最佳,最后叙述了如何在NorFlash 和NandFlash上进行抉择。

前言:

目 前,各类DDR,SDRAM或者RDRAM都属于 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持。Flash是一种非易失性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。

1. NorFlash和NandFlash启动方式

(1)NorFlash 有自己的数据和地址总线,因此可采用类似RAM的随机访问。NorFlash的特点是芯片内执行(XIP: eXecute In Place),这样应用程序应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。如果uboot中的ro段就可以直接在 NorFlash上运行,只需要把rw段和zi段拷贝到RAM中运行即可。

(2)Nand Flash器件使用复杂的I/O口来串行的存取数据,8个引脚用来传送控制,地址和数据信息。由于时序较为复杂,所以一般CPU最好集成NAND控制器。 另外由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能。如s3c2410具有 一个stepping stone。

Note:

1>S3C2410 之所以可以将loader代码烧在NAND上从而boot,是由于s3c2410有一个内置的SRAM,叫做stepping stone.当加电后,可以自动将NAND的起始4K的内容拷贝到SRAM里,然后在RAM里执行,将NAND里的代码拷贝至SDRAM。也就是我们就可 以讲一个小于4K的loader烧至NAND Flash上就可以了。

2> NorFlash   随机存储介质,适合做代码存储并EIP,读取速度快。

NandFlash   连续型存储介质,适合用来做大量数据存储的。

2. NorFlash与NandFlash型读写的基本单位不同

NandFlash和NorFlash的共性首先表现在向芯片中写数据必须先将芯片中对应的内容清空,然后再写入,也就是通常说的“先檫后写”。只不过NorFlash只用檫写一个字,而NandFlash需要擦写整个块

(1)应用程序对NorFlash操作以“字”为基本单位。为了方便对大容量NOR闪存的管理,通常将NOR闪存分成大小为128KB或者64KB的逻辑块,有时候块内还分成扇区。读写时需要同时逻辑块号和块内偏移。

(2)应用程序对NandFlash操作是以“块”为基本单位。NandFlash的块比较小,一般是8KB,然后每块又分成页,页的大小一般是512字节。要修改NandFlash中一个字节,必须重写整个数据块。

So:

1>NorFlash 可以对字进行操作,在处理小数据量的I/O操作的时候速度要比NandFlash快。

2>NandFlash只能对一个固定大小的区域进行清零操作。

3>NAND 器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为1。擦除NOR器件时是以64~128KB的块进行的,执行一个 擦除/写入操作的时间约为5s。擦除NAND器件是以8~32KB的块进行的,执行一个擦除/写入操作最多只需要4ms(此处是大数据情况下)。

3.NorFlash和NandFlash容量与成本对比

(1)NorFlash的容量相对要小,且成本较高。

(2)NandFlash的容量比较大,目前最大容量已经达到8G字节。为了方便管理,NandFlash的存储空间使用了块和页两级存储体。由于对NandFlash的操作都是以块和页为单位的,所以在向NandFlash进行大量数据读写时,NandFlash的速度要快于NorFlash闪存。并且NandFlash成本较低。

4.NorFlash和NandFlash可靠性对比

(1)NorFlash的可靠性要高于NandFlash,这主要是因为)NorFlash的接口简单,数据操作少,因此可靠性高,极少出现块区块,因而一般用在对可靠性要求高的地方。

(2)NandFlash接口和操作均相对复杂,位交换操作也很多,关键性数据更是需要错误探测/错误更正算法来确保数据的完整性,因此出现问题的几率要大的多,坏区块也是不可避免的,而且由于坏区块是随机分布的,连纠错也无法做到。

因此:建议在使用NandFlash时,要采用EDC/ECC等校验算法

5. NorFlash和NandFlash寿命对比

Flash檫写的次数都是有限的,当Flash的使用接近使用寿命的时候,经常会出现些操作失败;到达使用寿命时,Flash内部存放的数据虽然可以读,但是不能再进行写操作,所以为了防止上面问题的发生,不能对某个特定的区域反复进行写操作。

通常NandFlash的可檫写次数高于NorFlash,但是由于NandFlash通常是整块檫写,块内的页面中如果有一位失效整个快就会失效,而且由于檫写过程复杂,失败的概率相对较高,所以从整体上来说NorFlash的寿命较长。

Note:

在NandFlash中每个块的最大擦写次数是一百万次,而NorFlash的擦写次数是十万次。Flash的使用寿命同时和文件系统的机制也有关,要求文件系统具有损耗平衡功能。

6.使用上差异

在使用性上体现出的差异也是与NOR和NAND自身的架构设计分不开的。

(1)接口方面:NOR的设计有明显的传统闪存的特征,因此实际应用起来相对于NAND全新的复杂I/O设计要容易的多。而且,在使用NAND闪存时,必须先写入驱动程序,才能继续执行其他操作

(2)NAND在使用中还存在者坏块管理的问题,在NAND闪存中,由于坏块是随机分布的,因此需要进行扫描并将坏块打上标记。坏块的存在使得向NAND闪存写入信息需要相当的技巧,因为绝不能向坏块写入,这意味着在NAND闪存上自始自终都必须进行虚拟映射。

(3)在NOR闪存上运行代码不需要任何的软件支持,在NAND闪存上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD), NAND和NOR闪存在进行写入和檫除操作时都需要MTD。

(4)使用NOR闪存时所需要的MTD要相对少一些,许多厂商都提供用于NOR闪存的更高及软件,这其中包括M-System的TrueFFS驱动。

7.如何抉择:

(1)一般的原则是:在大容量的多媒体应用用选用NandFlash,而在数据/程序存储应用中选用NorFlash。

(2)我们一般用NorFlash存储程序,用NandFlash存储数据,使两种闪存的优势互补。

举例:

采 用支持XIP技术的NOR闪存能够直接运行OS,速度很快,既简化了设计,又降低了成本,所以许多手机都采用NOR+RAM的设计。NOR闪存的不足之处 是存储密度较低,所以也有采用NAND+RAM的设计。对于这两种方案,很难说哪一种更好,因为我们不能离开具体的产品而从某一个方面单纯地去评价。追求 小巧优雅的手机将需要NOR闪存支持;追求大存储容量的手机则将更多地选择NAND闪存;而同时追求功能和速度的手机则会采用NOR+NAND+RAM的 设计,这种取长补短的设计能够发挥NOR和NAND各自的优势。

(4) 除了速度、存储密度的因素,在选择闪存芯片时,还需要考虑接口设计、即插即用设计和驱动程序等诸多问题,因为两种类型的闪存在上述几个方面也有很多的不 同。比如在驱动程序方面,NorFlash运行代码不需要任何的软件支持,而在NandFlash上进行同样操作时就需要存储技术驱动程序(MTD)的支 持。虽然NAND和NOR器件在进行写入和擦除操作时都需要MTD, 但对于NAND来说驱动程序的开发难度更大,因为NAND闪存的纠错和坏块处理功能都需要通过驱动程序来实现

8补充知识点 SPI Flash

SPI Flash即serial peripheral interface串行外围设备接口是一种常见的时钟同步串行通信接口,是NorFlash的一种。

NorFlash根据数据传输的位数可以分为并行(Parallel)NorFlash和串行(SPI)NorFlash(即SPI Flash)。

SPI NorFlash每次传输一个bit位的数据,parallel NorFlash每次传输多个bit位的数据(有x8和x16bit两种);SPI Flash便宜,接口简单点,但速度慢。

嵌入式开发之NorFlash 和NandFlash的更多相关文章

  1. 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102

    1.1 xilinx zynqMp 架构 1.1.1 16nm 级别工艺 Zynq UltraScale+  MPSoC架构 Xilinx新一代Zynq针对控制.图像和网络应用推出了差异化的产品系,这 ...

  2. Jetty 开发指南: 嵌入式开发之HelloWorld

    Jetty 嵌入式之 HelloWorld 本节提供一个教程,演示如何快速开发针对Jetty API的嵌入式代码. 1. 下载 Jar 包 Jetty被分解为许多jar和依赖项,通过选择最小的jar集 ...

  3. 嵌入式开发之hi3519---GPIO 驱动

    在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK  xxx/osdrv/tools/board_tools/ ...

  4. 嵌入式开发之zynq——赛灵思的一款两a9加一fpga芯片的开发板

    没办法,回家入职新公司,做通信的,用到这款zynq加ad9163射频架构的开发版,要我做驱动,这可是初次接触zynq,带fpga的集成芯片,心里还是有点惊喜和忧愁,忧愁怎么最快啃下这个硬骨头,好吧上网 ...

  5. 嵌入式开发之uart---rs232 和rs485 和rj45和usb简介

    (1) profilebus和can(control控制器局域网)和hub(集线器) (uart)通用异步传输 rs232: ibm 提出的,两根线,按位bit传输,是端到端的单信号电平模式,理论上有 ...

  6. 嵌入式开发之makefile---交叉编译静态库和动态库的生成和调用

    c和cpp 混合的动态库生成: $(LIBSO): $(COBJS) $(CPPOBJS) $(CPP) -shared -o $@ $^ $(LIBS) ////////////////////// ...

  7. 嵌入式开发之davinci--- 8148/8168/8127 中的High-DefinitionVideo Processing Subsystem (HDVPSS)

    High-DefinitionVideo Processing Subsystem (HDVPSS) 这一章介绍了高清视频处理子系统(HDVPSS). 2.1导论 2.1.1 简介 HDVPSS 使用 ...

  8. 嵌入式开发之davinci--- 8148/8168/8127 中的xdc 简介

    XDC是TI公司为嵌入式实时系统可重用软件组件(在XDC里被成为packages,以下成为包)制定的一套标准.它包括一些有用的工具,标准的API函数,静态配置文件和打包(packaging)操作.XD ...

  9. 嵌入式开发之cgic库---cgi库的使用

    很幸运!用C语言写CGI程序还可以有比较简单的方式,那就是我们可以借助使用第三方库CGIC(CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作 ...

随机推荐

  1. header函数

    header函数 主要用于对http协议头设置相关信息 设置浏览器显示编码(解决乱码) header("Content-type:text/html;charset=utf-8") ...

  2. Oracle常见的问题

    1.oracle 中文问号乱码解决方法: 在系统变量里面添加变量名:NLS_LANG 变量值:  SIMPLIFIED CHINESE_CHINA.ZHS16GBK 2.查询oracle 里的主键 S ...

  3. jQuery实现图片轮播

    之前有碰到过jQuery实现列表自动滚动,这次的图片轮播在原理上与之相同,只有一些细微的差别,就是需要在图片的右下角显示当前图片的序号,效果如下: 先看一看html代码,以及对应的css代码: < ...

  4. int组成时间值

    int startYear = int.Parse(DateTime.Now.Year.ToString()); int startMouth = int.Parse(DateTime.Now.Mon ...

  5. map容器按value值排序

    1 vector<pair<key,value> >类型的容器中存放所有元素,sort(pair默认按照value比较大小?) 2 map<value,key>

  6. encodeURIComponent=>Uri.EscapeDataString

    javascript: encodeURIComponent=> C#: Uri.EscapeDataString http://stackoverflow.com/questions/5754 ...

  7. DTCMS展示一级栏目并展示各自栏目下的二级栏目

    c#代码中 <!--C#代码--> <%csharp%> string parent_id=DTRequest.GetQueryString("parent_id&q ...

  8. Div 内部所有元素 全部垂直对齐

    http://stackoverflow.com/questions/7273338/how-to-vertically-align-an-image-inside-div How it works: ...

  9. PHP中使用Luhn算法校验信用卡及借记卡卡号

    Luhn算法会通过校验码对一串数字进行验证,校验码通常会被加到这串数字的末尾处,从而得到一个完整的身份识别码. 我们以数字“7992739871”为例,计算其校验位: 从校验位开始,从右往左,偶数位乘 ...

  10. angularjs--$watch、$watchGroup、$watchCollection含义

    angularjs的$watch.$watchGroup.$watchCollection使用方式   如果想在controller里面随时监听一个值的变化那就用$watch <p>    ...