嵌入式开发之NorFlash 和NandFlash
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的更多相关文章
- 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102
1.1 xilinx zynqMp 架构 1.1.1 16nm 级别工艺 Zynq UltraScale+ MPSoC架构 Xilinx新一代Zynq针对控制.图像和网络应用推出了差异化的产品系,这 ...
- Jetty 开发指南: 嵌入式开发之HelloWorld
Jetty 嵌入式之 HelloWorld 本节提供一个教程,演示如何快速开发针对Jetty API的嵌入式代码. 1. 下载 Jar 包 Jetty被分解为许多jar和依赖项,通过选择最小的jar集 ...
- 嵌入式开发之hi3519---GPIO 驱动
在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK xxx/osdrv/tools/board_tools/ ...
- 嵌入式开发之zynq——赛灵思的一款两a9加一fpga芯片的开发板
没办法,回家入职新公司,做通信的,用到这款zynq加ad9163射频架构的开发版,要我做驱动,这可是初次接触zynq,带fpga的集成芯片,心里还是有点惊喜和忧愁,忧愁怎么最快啃下这个硬骨头,好吧上网 ...
- 嵌入式开发之uart---rs232 和rs485 和rj45和usb简介
(1) profilebus和can(control控制器局域网)和hub(集线器) (uart)通用异步传输 rs232: ibm 提出的,两根线,按位bit传输,是端到端的单信号电平模式,理论上有 ...
- 嵌入式开发之makefile---交叉编译静态库和动态库的生成和调用
c和cpp 混合的动态库生成: $(LIBSO): $(COBJS) $(CPPOBJS) $(CPP) -shared -o $@ $^ $(LIBS) ////////////////////// ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的High-DefinitionVideo Processing Subsystem (HDVPSS)
High-DefinitionVideo Processing Subsystem (HDVPSS) 这一章介绍了高清视频处理子系统(HDVPSS). 2.1导论 2.1.1 简介 HDVPSS 使用 ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的xdc 简介
XDC是TI公司为嵌入式实时系统可重用软件组件(在XDC里被成为packages,以下成为包)制定的一套标准.它包括一些有用的工具,标准的API函数,静态配置文件和打包(packaging)操作.XD ...
- 嵌入式开发之cgic库---cgi库的使用
很幸运!用C语言写CGI程序还可以有比较简单的方式,那就是我们可以借助使用第三方库CGIC(CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作 ...
随机推荐
- Html.ActionLink 几种重载方式说明及例子
本文整理了该方法的几种重载形式:一 Html.ActionLink("linkText","actionName")该重载的第一个参数是该链接要显示的文字,第二 ...
- MAC系统介绍
MACOS: UNIX系统图形界面的显示 开发环境: 一种是终端(terminal) 一种是Xcode(ide) MAC快捷键: command(window) + c : 复制 command + ...
- 【转载】绝对干货!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载九)如何通过源代码安装软件
除了使用Linux的包管理机制进行软件的安装.更新和卸载,从源代码进行软件的安装也是非常常见的,开源软件提供了源代码包,开发者可以方便的通过源代码进行安装.从源码安装软件一般经过软件配置.编译软件.执 ...
- 【转载】Linux小白福利:《超容易的Linux系统管理入门书》(三)在虚拟机上安装Linux
本篇是Linux小白最佳实践第3篇,目的就是让白菜们自己动手安装个Linux玩玩.如果你是Linux小白,请务必亲自动手来安装.不想安装多个操作系统的,虚拟机是最佳选择,一台电脑上可以用虚拟机安装7. ...
- xml的生成与解析_老师笔记
使用序列化器生成一个xml文件 //1,初始化一个xml文件的序列化器 XmlSerializer serializer = Xml.newSerializer(); //2.初始化序列器参数 Fil ...
- MFC中快速应用OpenCV(转)
转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...
- PHP基础在线视频教程高清版
这个是我给大家介绍的PHP基础在线视频教程高清版,目前PHP慢慢垄断WEB的语言编写市场了,PHP 是一种服务器内置式的script 语言,它的出现使得在unix上快速地开发动态web成为现实.PHP ...
- initial,常用于消除css格式
刚在群里有人问在不改变原有css的情况下怎么清除一个css属性.有人提出了 initial,再此记录下. initial 关键字用于设置 CSS 属性为它的默认值. initial 关键字可用于任何 ...
- Android Handler 原理
在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...
- Nagios脚本编写事例
目标:编写一个简单的nagios脚本,实现监控client上的nginx进程是否启动,假如没启动的话发出报警. 首先在master上对nagios的配置文件进行设置,修改services.cfg文件, ...