存储器映射(转载)

 

存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOTBLOCK等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自定义。

ARM7TDMI的存储器映射可以有0X00000000~0XFFFFFFFF的空间,即4G的映射空间,但所有器件加起来肯定是填不满的。一般来说,0X00000000依次开始存放FLASH——0X00000000,SRAM——0X40000000,BOOTBLOCK,外部存储器 0X80000000,VPB(低速外设地址,如GPIO,UART)——0XE0000000,AHB(高速外设:向量中断控制器,外部存储器控制器) ——从0XFFFFFFFF回头。他们都是从固定位置开始编址的,而占用空间又不大,如AHB只占2MB,所以从中间有很大部分是空白区域,用户若使用这些空白区域,或者定义野指针,就可能出现取指令中止或者取数据中止。

由于系统在上电复位时要从0X00000000 开始运行,而第一要运行的就是厂家固化在片子里的BOOTBLOCK,这是判断运行哪个存储器上的程序,检查用户代码是否有效,判断芯片是否加密,芯片是否IAP(在应用编程),芯片是否ISP(在系统编程),所以这个BOOTBLOCK要首先执行。而芯片中的BOOTBLOCK不能放在FLASH的头部,因为那要存放用户的异常向量表的,以便在运行、中断时跳到这来找入口,所以BOOTBLOCK只能放在FLSAH尾部才能好找到,呵呵。而ARM7的各芯片的FLASH大小又不一致,厂家为了BOOTBLOCK在芯片中的位置固定,就在编址的2G靠前编址的位置虚拟划分一个区域作为BOOTBLOCK 区域,这就是重映射,这样访问<2G即<0X80000000的位置时,就可以访问到在FLASH尾部的BOOTBLOCK区了。

BOOTBLOCK运行完就是要运行用户自己写的启动代码了,而启动代码中最重要的就是异常向量表,这个表是放在FLASH的头部首先执行的,而异常向量表中要处理多方面的事情,包括复位、未定义指令、软中断、预取指中止、数据中止、IRQ(中断) ,FIQ (快速中断),而这个异常向量表是总表,还包括许多分散的异常向量表,比如在外部存储器,BOOTBLOCK,SRAM中固化的,不可能都由用户直接定义,所以还是需要重映射把那些异常向量表的地址映到总表中。


1.存储器映射:

处理器产生的地址按其某种规则转移到具体的物理地址; 用户可见的,开机后固定不变的。
2.存储器重映射:
重新修改局部(64字节异常向量表);可 选操作,稳定运行时由用户需要进行改变(用户程序)。
今天在ZLG的EazyARM板子上,对照着自带的实验册做存储器重映射的实验,需要设置MEMMAP寄存器,此时不是很明白这个MEMMAP寄存器该怎么设置,看了几遍ARM书上的相关章节,终于明白了实验程序的具体原理,也明白了MEMMAP设置的作用:
MEMMAP=0:开机默认值,Boot装载模式----向量表(0x00000000- 0x0000003c)映射的是BootBlock中 的0x7FFFE000-0x7FFFF03c中 的值; 芯片复位时,启动boot装载程序,boot装载程序检查 P0.14口的状态和用户的异常向量 ,判断是进入ISP状态还是 启动用户程序,若启动用户程序,则自动设置MEMMAP=1 (片内 flash启动)或3(片外程序存储器启动)。
很奇怪的,我在实验中,当使用无片内flash的LPC2210时即使 设置P0.14为高低都没关 系,芯片会跳过继而执行片外flash中 的代码.
MEMMAP=1:中断向量表就在片内flash中,地址就是0x00000000- 0x0000003c,相当于没有映射;
MEMMAP=2:最为主要的设置,即是重映射的关键之所在,当设置MEMMAP=2 时,中断向量表(0x00000000-0x0000003c)映射的是片内SRAM中的0x40000000-0x4000003c中的值,而因为是SRAM,所以在程序运行的过程中是可以改变的,这样就可以达到重映射的目的(中断向量表可以随时修改)
MEMMAP=3:中断向量表就在片外flash中,中断向量表(0x00000000-0x0000003c)映射到是片外flash中的0x80000000-0x8000003c中的值;功能上与MEMMAP=1时的差不多,因为一旦程序固化到flash中,即为只读,只是数值映射而已

你可能感兴趣的:(存储器映射(转载))