地址重映射在S3C4510B系统中的实现
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过程的理解和设计,对于那些嵌入式系统的开发人员来说是非常重要的,它从一开始就决定了整个开发过程的最终成败。