地址重映射在ARM系統(tǒng)中的實現(xiàn)
;接著把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。在本系統(tǒng)中只需重新設置ROMCON0和DRAMCON0。
源代碼:
;/*內(nèi)存控制寄存器重新設置-存儲空間重新映射地址空間*/
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 |
數(shù)據(jù)中止 | 中止 | 0x00000010 |
預留 | - | 0x00000014 |
IRQ(中斷) | IRQ | 0x00000018 |
FIQ(快速中斷) | FIQ | 0x0000001 |
地址重新映射之后,入口地址被映射到RAM中,中斷處理代碼也被搬移到RAM地址空是。此時,中斷響應和中斷處理的速度都將大大加快,這將有利于提高整個系統(tǒng)的實時性。異常中斷向量表的設計結構如圖3所示。
下面是各部分的源代碼(以IRQ異常中斷為例)。
異常向量表的定義:(系統(tǒng)初始化時,將異常處理代碼入口地址寫入異常中的向量表)
_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};跳轉(zhuǎn)到異常中斷處理代碼入口
異常處理入口代碼:
…
SystemIrqHandler
IMPORT ISR_IrqHandler
STMFD sp!,{r0-r12,lr}
BL ISR_IrqHandler ;跳轉(zhuǎn)到C代碼中異常中斷處理程序ISR_IrqHandler
LDMFD sp!,{r0-r12,lr}
SUBS pc,lr,#4
…
在如上的結構中,不管系統(tǒng)是否進行了地址的重映射,異常中斷向量都可以在運行時動態(tài)改變,大大提高了中斷處理中的靈活性。中斷向量可以在運行時指向不同的異常處理代碼入口。
結語
面對實時性要求越來越高的各種應用,不管應用中有沒有嵌入式操作系統(tǒng),Remap都已經(jīng)成為啟動代碼中必不可少的一部分。Remap的實現(xiàn)對于操作系統(tǒng)的移植也有重要的意義。Remap決定了系統(tǒng)啟動的效率,并對整個系統(tǒng)的實時性和穩(wěn)定性產(chǎn)生很大影響。因而,對Remap過程的理解和設計,對于那些嵌入式系統(tǒng)的開發(fā)人員來說是非常重要的,它從一開始就決定了整個開發(fā)過程的最終成敗。
評論