存储器地址重映射是当前很多先进控制器所具有的功能。在上一节中已经提
到了0 地址处存储器重映射的例子,简而言之,地址重映射就是可以通过软件配
置来改变一块存储器物理地址的一种机制或方法。
当一段程序对运行自己的存储器进行重映射的时候,需要特别注意保证程序
执行流程在重映射前后的承接关系。下面是一种典型的存储器地址重映射情况:
系统上电后的缺省状态是0 地址上放有ROM,这块ROM 有两个地址:从0
起始和从0x10000 起始,里面存储了初始化代码。当进行地址remap 以后,从0
起始的地址被定向到了RAM 上,ROM 则只保留有唯一的从0x10000 起始的地
址了。
如果存储在ROM 里的Reset_Handler 一直在0 – 0x4000 的地址上运行,则
当执行完remap 以后,下面的指令将从RAM 里预取,必然会导致程序执行流程
的中断。根据系统特点,可以用下面的办法来解决这个问题:
(1) 上电后系统从0 地址开始自动执行,设计跳转指令在remap 发生前使PC指针指向0x10000 开始的ROM 地址中去,因为不同地址指向的是同一块ROM,所以程序能够顺利执行。
(2) 这时候0 - 0x4000 的地址空间空闲,不被程序引用,执行remap 后把RAM
引进。因为程序一直在0x10000 起始的ROM 空间里运行,remap 对运行流程没有任何影响。
(3) 通过在ROM 里运行的程序,对RAM 进行相应的代码和数据拷贝,完成应用程序运行的初始化。
下面是一段实现上述步骤的例程:
--------------------------------------------------------------------------------
ENTRY
;启动时,从0 开始,设法跳转到“真”的ROM 地址(0x10000 开始的空间里)
LDR pc, =start
;insert vector table here
…
Start ;Begin of Reset_Handler
; 进行remap 设置
LDR r1, =Ctrl_reg ;假定控制remap 的寄存器
LDR r0, [r1]
ORR r0, r0, #Remap_bit ;假定对控制寄存器进行remap 设置
STR r0, [r1]
;接下去可以进行从ROM 到RAM 的代码和数据拷贝
--------------------------------------------------------------------------------
除此之外,还有另外一种常见的remap 方式,如下图:
原来RAM 和ROM 各有自己的地址,进行重映射以后RAM 和ROM 的地址
都发生了变化,这种情况下,可以采用以下的方案:
(1) 上电后,从0 地址的ROM 开始往下执行。
(2) 根据映射前的地址,对RAM 进行必要的代码和数据拷贝。
(3) 拷贝完成后,进行remap 操作。
(4) 因为RAM 在remap 前准备好了内容,使得PC 指针能继续在RAM 里取
到正确的指令。
不同的系统可能会有多种灵活的remap 方案,根据上面提到的两个例子,可以总结出最根本的考虑是:要使程序指针在remap 以后能继续往下得到正确的指令。
阅读(2201) | 评论(0) | 转发(0) |