ARM的存储器映射与存储器重映射

  • 格式:pdf
  • 大小:122.94 KB
  • 文档页数:5

ARM的存储器映射与存储器重映射当系统上电后,程序将自动从0x00000000地址处开始

执行,因此在系统的初始状态,要求0x00000000地址处

的存储器是非易性的ROM或Flash等。但是ROM或Flash的访问速度相对较慢,每次中断发生后,都要读取ROM

或Flash上的向量表开始,影响了中断响应速度。因此,LPC2200提供一种灵活的地址重映射方法,该方法可以将内

部RAM的地址重新映射到0x00000000的位置。在系统

执行重映射命令之前,需要将Flash中的中断向量代码拷贝

到内部RAM中。这样在重映射命令执行之后相当于从内部RAM中0x00000000的位置找到中断向量,而实际上是将

RAM的起始地址0x40000000映射为0x00000000了。

这样,中断执行时相当于在RAM中找到对应中断向量,实

现异常处理调试。

存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BO

OTBLOCK等进行统一编址。即用地址来表示对象。这个地址绝大

多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外

部RAM或FLASH的情况下可进行自定义。ARM7TDMI的存储器映

射可以有0X00000000~0XFFFFFFFF的空间,即4G的映射空间,

但所有器件加起来肯定是填不满的。一般来说,0X00000000

依Edited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.次开始存放FLASH——0X00000000,SRAM——0X40000000,BOOT

BLOCK,外部存储器0X80000000,VPB(低速外设地址,如GPIO,

UART)——0XE0000000,AHB(高速外设:向量中断控制器,外

部存储器控制器)——从0XFFFFFFFF回头。他们都是从固定位

置开始编址的,而占用空间又不大,如AHB只占2MB,所以从中

间有很大部分是空白区域,用户若使用这些空白区域,或者定义

野指针,就可能出现取指令中止或者取数据中止。由于系统在上

电复位时要从0X00000000开始运行,而第一要运行的就是厂家

固化在片子里的BOOTBLOCK,这是判断运行哪个存储器上的程序,

检查用户代码是否有效,判断芯片是否加密,芯片是否IAP(在

应用编程),芯片是否ISP(在系统编程),所以这个BOOTBLO

CK要首先执行。而芯片中的BOOTBLOCK不能放在FLASH的头部,

因为那要存放用户的异常向量表的,以便在运行、中断时跳到这

来找入口,所以BOOTBLOCK只能放在FLSAH尾部才能好找到,呵

呵。而ARM7的各芯片的FLASH大小又不一致,厂家为了BOOTBL

OCK在芯片中的位置固定,就在编址的2G靠前编址的位置虚拟

划分一个区域作为BOOTBLOCK区域,这就是重映射,这样访问<

2G即<0X80000000的位置时,就可以访问到在FLASH尾部的BOO

TBLOCK区了。BOOTBLOCK运行完就是要运行用户自己写的启动

代码了,而启动代码中最重要的就是异常向量表,这个表是放在

FLASH的头部首先执行的,而异常向量表中要处理多方面的事情,

包括复位、未定义指令、软中断、预取指中止、数据中止、IRQEdited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.(中断) ,FIQ (快速中断),而这个异常向量表是总表,还包括

许多分散的异常向量表,比如在外部存储器,BOOTBLOCK,SRAM

中固化的,不可能都由用户直接定义,所以还是需要重映射把那

些异常向量表的地址映到总表中。为存储器分配地址的过程称为

存储器映射,那么什么叫存储器重映射呢?为了增加系统的灵活

性,系统中有部分地址可以同时出现在不同的地址上,这就叫做

存储器重映射。重映射主要包括引导块“Boot Block”重映射和

异常向量表的重映射。1.引导块“Boot Block”及其重映射B

oot Block是芯片设计厂商在LPC2000系列ARM内部固化的一段

代码,用户无法对其进行修改或者删除。这段代码在复位时被首

先运行,主要用来判断运行哪个存储器上面的程序,检查用户代

码是否有效,判断芯片是否被加密,系统的在应用编程(IAP)

以及在系统编程功能(ISP)等。Boot Block存在于内部Flas

h,LPC2200系列大小为8kb,它占用了用户的Flash空间,但也

有其他的LPC系列不占用FLash空间的,而部分没有内部Flash

空间的ARM处理器仍然存在Boot Block。重映射的原因:Boo

t Block中有些程序可被用户调用,如擦写片内Flash的IAP代

码。为了增加用户代码的可移植性,所以最好把Boot Block的

代码固定的某个地址上。但由于各芯片的片内Flash大小不尽相

同,如果把Boot Block的地址安排在内部Flash结束的位置上,

那就无法固定Boot Block的地址。为了解决上面的问题,于是

芯片厂家将Boot Block的地址重映射到片内存储器空间的最高Edited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.端,即接近2Gb的地方,这样无论片内存储器的大小如何,都不

会影响Boot Block的地址。因此当Boot Block中包含可被用户

调用的IAP操作的代码时,不用修改IAP的操作地址就可以在不

同的LPC系列的ARM上运行了。2.异常向量表及其重映射ARM

内核在发生异常后,会使程序跳转到位于0x0000~0x001C的异常

向量表处,再经过向量跳转到异常服务程序。但ARM单条指令的

寻址范围有限,无法用一条指令实现4G范围的跳转,所以应在

其后面的0x0020~0x003F地址上放置跳转目标,这样就可以实现

4G范围内的任意跳转,因此一个异常向量表实际上占用了16个

字的存储单元。以下为一张中断向量表:LDR PC, ResetAddr

LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, Prefetch

Addr LDR PC, DataAbortAddr DCD 0xb9205f80 LDR PC, [PC,

#-0xff0] LDR PC, FIQ_Addr ResetAddr DCD ResetInit Undef

inedAddr DCD Undefined SWI_Addr DCD SoftwareInterruptP

refetchAddr DCD PrefetchAbort DataAbortAdd DCD DataAbor

t Nouse DCD 0 IRQ_Addr DCD 0 FIQ_Addr DCD FIQ_Handler

重映射的原因:由于ARM处理器的存储器结构比较复杂,可能同

时存在片内存储器和片外存储器等,他们在存储器映射上的起始

地址都不一样,因此ARM内核要访问的中断向量表可能不在0x0

000~0x003F地址上,因此采用了存储器重映射来实现将存在与

不同地方的中断向量表都映射到0x0000~0x003F地址上。注意:

Boot Block也存在中断向量表,而

且复位后这段代码首先映射Edited by Foxit ReaderCopyright(C) by Foxit Software Company,2005-2008For Evaluation Only.到0x0000~0x003F地址上,也就是说复位后首先运行的是Boot

Block程序。各个存储区域的中断向量表也不尽相同。