地址重映射在ARM系统中的实现
;接着把ZI段搬移到RAM中,并其将初始化为0
mov r0,#0
Idr r2,EndOfBSS
Add r2,r2,r3
2
cmp r1,2
strcc r0,[r1],#4
bcc%B2
⑥地址的重新映射。S3C4510B中的Remap过程其实很简单,只需重新设置ROMCON0~ROMCON5和DRAMCON0~DRAMCON3。在本系统中只需重新设置ROMCON0和DRAMCON0。
源代码:
;/*内存控制寄存器重新设置-存储空间重新映射地址空间*/
EXPORT RemapMemory
RemapMemory
mov r12,r14
adr r0,RemapMem
ldmia r0,{r1-r11}
ldr r0,=ROMCON0 ;ROMCON0为Bank寄存器的起始地址
stmia r0,{r1-r11}
bl ExceptionTalbeInit ;中断向量表重新初始化
mov pc,r12
RemapMem
DCD 11040060 ;/*ROMCON0 0x1000000~0x1100000*/
…
DCD 10000398 ;/*DRACON0 0x0~0x1000000*/
…
⑦进入C代码空间,开始主程序的运行。此时代码应该运行于RAM中。
3 异常中断的处理
在Remap的启动代码中,需要特别注意的是异常中断的处理。在S3C4510B中,异常中断的入口地址是固定的,按表1次序排列。
表1
异常类型 | 工作模式 | 正常地址 |
复位 | 管理 | 0x00000000 |
未定义指令 | 未定义 | 0x00000004 |
软件中断(SWI) | 管理 | 0x00000008 |
预取中止 | 中止 | 0x0000000 |
数据中止 | 中止 | 0x00000010 |
预留 | - | 0x00000014 |
IRQ(中断) | IRQ | 0x00000018 |
FIQ(快速中断) | FIQ | 0x0000001 |
地址重新映射之后,入口地址被映射到RAM中,中断处理代码也被搬移到RAM地址空是。此时,中断响应和中断处理的速度都将大大加快,这将有利于提高整个系统的实时性。异常中断向量表的设计结构如图3所示。
下面是各部分的源代码(以IRQ异常中断为例)。
异常向量表的定义:(系统初始化时,将异常处理代码入口地址写入异常中的向量表)
_RAM_END_ADDR EQU 0x01000000 ;重映射后RAM的终止地址
MAP (_RAM_END_ADDR-0x100)
SYS_RST_VECTOR # 4
UDF_INS_VECTOR # 4
SWI_SVC_VECTOR # 4
INS_ABT_VECTOR # 4
DAT_ABT_VECTOR # 4
RESERVED_VECTOR # 4
IRQ_SVC_VECTOR # 4
FIQ_SVC_VECTOR # 4
异常初始化代码:
…
b IRQ_SVC_HANDLER ;0x18
…
IRQ_SVC_HANDLER
SUB sp,sp,#4 ;满递减堆栈
STMFD sp!,{r0}
LDR r0,=IRQ_SVC_VECTOR ;读取中断向量,
;IRQ_SVC_VECTOR=SystemrqHandle
LDR r0,[r0]
STR r0,[sp,#4]
LDMFD sp!,{r0,pc};跳转到异常中断处理代码入口
异常处理入口代码:
…
SystemIrqHandler
IMPORT ISR_IrqHandler
STMFD sp!,{r0-r12,lr}
BL ISR_IrqHandler ;跳转到C代码中异常中断处理程序ISR_IrqHandler
LDMFD sp!,{r0-r12,lr}
SUBS pc,lr,#4
…
在如上的结构中,不管系统是否进行了地址的重映射,异常中断向量都可以在运行时动态改变,大大提高了中断处理中的灵活性。中断向量可以在运行时指向不同的异常处理代码入口。
结语
面对实时性要求越来越高的各种应用,不管应用中有没有嵌入式操作系统,Remap都已经成为启动代码中必不可少的一部分。Remap的实现对于操作系统的移植也有重要的意义。Remap决定了系统启动的效率,并对整个系统的实时性和稳定性产生很大影响。因而,对Remap过程的理解和设计,对于那些嵌入式系统的开发人员来说是非常重要的,它从一开始就决定了整个开发过程的最终成败。
评论