现代嵌入式计算 - 第4章 - 嵌入式平台架构 (第3部分,非易失性存储器技术)

来源:互联网 发布:安卓短信软件 编辑:程序博客网 时间:2024/06/05 16:47

非易失性存储器

所有的嵌入式系统都需要某种形式的非易失性存储器。非易失性存储器在设备关电后也能保持数据。有一系列的存储技术,具有不同的性能,密度,可靠性和大小。目前,有两个主要的非易失性存储技术:最流行的是固态存储器,第二个是硬盘形式的磁性存储介质。


现代固态存储器通常被称为闪存。它可以被擦除和重新编程。闪存读取速度是比较快(比DRAM慢,但比硬盘快)。写时间通常比读出时间慢得多。有两种不同的闪存类型:NOR闪存和NAND闪存。这两种类型的设备在许多方面有所不同,但一个关键的不同是,NAND闪速密度比NOR设备高得多的。通常情况下,NOR闪存提供存储几兆字节,而NAND设备的存储高达千兆字节(512MBNAND设备很常见)。大多数固态存储设备,如USB卡和SD卡使用NAND存储器。


NOR闪存

NOR闪存设备分为多个区。每个区含有若干扇区。这些扇区可以单独擦除。设备初始化后,处在读模式下。事实上,当该装置在读模式下,设备可以以随机存取方式访问:可以通过简单地执行一个读周期读

设备的任何部分。为了在设备上执行写操作,你必须先擦除。您可以一个扇区一个扇区地擦除或整片擦除。在大多数情况下,您将执行扇区擦除。擦除扇区后,它所有的位被置为一。

下面的例子擦除闪存扇区和写入字,如下所示。


ww(sector_address +0x555), 0x00AA); // write unlock cycle 1

ww(sector_address +0x2AA), 0x0055); // write unlock cycle 2

ww(sector_address +0x555), 0x0080); // write setup command

ww(sector_address +0x555), 0x00AA); // write additional unlock cycle 1

ww(sector_address +0x2AA), 0x0055); // write additional unlock cycle 2

ww(sector_address,0x0030); // write sector erase command


// Word Program intoflash device at program_address

ww(sector_address +0x555), 0x00AA); // write unlock cycle 1

ww(sector_address +0x2AA), 0x0055); // write unlock cycle 2

ww(sector_address +0x555), 0x00A0); // write program setup command

ww(program_address,data); // w


写扇区时,可以以任何顺序进行编程。


并行NOR接口通常包括下列信号:

片选:选择设备的信号,由地址译码器设置。

输出使能:指示该设备有数据在总线上输出。

地址总线:A0.A20,寻址信号

数据总线:D0-D7

写使能:写设备时发出信号。

写保护:如果激活它,能阻止擦除或写入到闪存设备。通常接到线路板上或连接到GPIO,由软件控制。

为了发现一个闪存的大小,类型和性能,许多器件支持通用闪存接口。一种闪存行业规范[JEDEC

137-AJESD68.01],被设计为允许系统询问闪存。

被焊接到一个平台的闪存设备,初始程序通常是通过JTAG写入。JTAG(参见第17章,“平台调试”),直接访问闪存和能模拟主机处理器的行为读取和写入。

Intel平台上,最初的指令(BIOS或引导程序)通常被存储在NOR闪存设备。闪存器件有串行或并行接口。在多数情况下,Intel平台使用串行接口。NORNAND闪存设备之间在可靠性上有一些差异。NOR器件更可靠,其结果,NOR闪存通常被认为是最安全的内存类型,用于存储引导程序。

支持随机访问,所以NOR闪存支持本地执行,也就是说,程序可以直接从闪存运行,而不需要拷贝到内存。

删除设备每个扇区最多可擦除100,000次,之后就可能失效。如果闪存用于

一个文件系统的日志等经常更改的数据,软件驱动程序应确保所有的活动不是集中在少数

扇区。这种策略被称为损耗均衡,是所有闪存文件系统的基本原则。

Linux内核使用内存技术设备(MTD)接口。MTD为闪存器件提供通用

接口。这层管理底层的单个设备。文件系统建立在MTD之上,目前最常用的是日记闪存文件系统(JFFS2)。

除了可编程存储,许多设备(NORNAND)提供一次性可编程(OTP)存储器。这是用来存储永久的信息,例如序列号,安全引导代码,或者SIM卡锁。该OTP位在制造时设定

,并且可以不被更新。


NAND闪存

NOR闪存相反,NAND闪存不提供直接随机存取接口。该器件提供页/块模式。要读取设备,驱动程序必须首先请求一个页面,然后从页中访问数据。这和磁盘驱动器类似,因此在NAND器件上构建文件系统相对简单。每个块具有多个页面。页大小通常为2K字节。

NAND闪存可包含坏页。这些坏页必须管理起来。为了提高NAND器件的出产率,该器件可以带着坏页标记出厂。随着进一步的使用坏块会增加。制造过程中发现的坏块通常标记在每个块内。被标记为是坏的页面不能擦除或编程。为确保正确,许多附加的位被预留用于错误纠正(ECC)。

为了减少在系统中同时使用NANDNOR,一些NAND设备提供了专门的引导块。引导块被设计为与传统的NOR设备一样可靠(使用附加ECC或减小密度或实际的NOR分区)。这个引导页放置在页缓冲器,以使得处理器在系统启动时可随机访问这个页。


NAND接口

NAND设备首次被引入市场,没有标准的接口定义。成立于2006年的开放式NAND闪存接口(ONFI)工作组,带动闪存设备标准的建立。自2006年以来,ONFI工作组已制定了一些规范:


•ONFI1.0定义了一个标准的电气和协议接口,包括基础命令集。

•ONFI2.0定义了高达133兆传输率的高速双速率接口。

•ONFI2.1使总线速度提高到200/秒。

•ONFI2.2包括中断读/擦除,而允许更高优先级的读取任务。


有些SOC提供内部NAND接口。在许多情况下,SOCNAND器件通过一个ONFI标准接口的控制器连接。还有些情况下,接口采用底层软件来管理,最简单的形式(也可能是最低的性能),通过GPIO引脚驱动,和驱动程序实现接口管理。你可以在Linux内核驱动程序(Linux/drivers/ mtd / nand / gpio.c)看到。


NAND控制器

正如你所看到的,NAND接口设备很复杂,如果需要高性能,一个NAND控制器是必需。NAND控制器通常集成在SOC内。控制器通常支持一个DMA引擎,传入需要的块请求以及一个缓冲区指针。然后所述控制器使用ONFI定义的接口,执行NAND读取,把数据放在目标缓冲区内。驱动程序的例子在linux/drivers/ mtd / nand / denali.c



有些情况下,SOC不包括一个NAND控制器,不直接支持NAND设备。在这种情况下,通常使用MediaCardMMC)设备替代。MMC存储器以卡的形式,集成控制器和存储器。嵌入式常用的是嵌入式MMCeMMC),规范见(http://www.jedec.org/standards-documents/docs/jesd84-A441)。eMMC设备可以焊接在主板上。eMMC设备包括一个控制器和存储器。该控制器提供了更高级别的应用程序接口。MMC设备驱动程序可以在Linux/drivers/mmc中找到。SD存储卡是基于MMC的新闪存接口标准。标准的MMC/ SD控制器接口是由SD协会所定义。



硬盘驱动器和固态硬盘

硬盘已经存在多年,是传统的大容量存储低成本方式。硬

盘是数据存储在磁盘片涂层的设备。这种形式的存储是所有存储类型中成本最低的。因为机械和环境

因素,在嵌入式环境下使用较少。

由于NAND成本的回落,新的存储类型被称为固态驱动器(SSD)已经应用在嵌入式案件中。SSD是由NAND设备组和一个复杂的NAND控制器。NAND控制器提供了传统硬盘驱动器接口到主机。该控制器管理闪存底层任务,包括磨损均衡。

最新的硬盘接口是SATA接口。它是由串行ATA国际组织(www.serialata.org)定义。它是用于连接主机和海量存储设备。

0 0
原创粉丝点击