地址重映射在S3C4510B系統(tǒng)中的實現(xiàn)
近年來,隨著32位芯片制造技術的不斷完善,制造成本不斷降低,國內的32位MCU市場也開始火爆起來。越來越多的工程師開始將開發(fā)目光從8位轉移到32位微處理器上,基于32位MCU的產品如雨后春筍般層出不窮,應用領域涵蓋了掌上設備、家用電器、網絡設備、無線通信、工業(yè)控制等。在32位微控制芯片領域,ARM架構的芯片占了近70%的市場。本文中所用到的處理器正是Samsung公司生產的基于ARM架構的S3C4510B。
1 S3C4510B簡介
S3C4510B是一款基于以太網系統(tǒng)的高性價比、高性能的16/32位RISC微處理器。芯片部集成了8KB的Cache/SRAM和Ethernet控制器,減少了整個系統(tǒng)的成本。片外可擴展ROM、Flash、SDRAM等存儲芯片,可以移植μClinux等復雜的操作系統(tǒng)。利用操作系統(tǒng)完善的TCP/IP協(xié)議棧充分發(fā)揮芯片的網絡功能
。S3C4510B芯片內部沒有程序存儲器,所有程序都被存儲在片外擴展的ROM和Flash中。開始啟動時,存有啟動代碼的ROM或Flash將被映射為0x00地址,系統(tǒng)從此開始運行。但在實際應用中,為提高系統(tǒng)的實時性,加快代碼的執(zhí)行速度,系統(tǒng)啟動后程序往往要被搬移到RAM中,因為RAM的存取速度要比ROM快得多,這樣大大提升系統(tǒng)的性能。由于S3C4510B芯片中的異常中斷入口地址被固定在0x00開始的8個字中,系統(tǒng)只能將地址空間重新分配,把RAM映射到0x00地址處,這正是Remap的原因所在。
S3C4510B內部有幾個特殊寄存器,用于實現(xiàn)地址空間和芯片內外存儲介質的映射。這幾個寄存器的簡介如下:
SYSCFG:設置特殊寄存器的起始地址和片內SRAM的起始地址。
EXTDBWTH:設置各Bank寄存器所映射芯片的數(shù)據(jù)線寬度。
ROMCON0~ROMCON5:設置系統(tǒng)內片擴展ROM和Flash的起始和終止地址。
DRAMCON0~DRAMCON3:設置系統(tǒng)內片外擴展RAM的起始和終止地址。
S3C4510B芯片內特殊寄存器段的物理地址為0x3ff0000,各特殊寄存器的偏移地址詳見S3C4510B的技術手冊。
2 S3C4510B系統(tǒng)中Remap的實現(xiàn)
地址空間的重新分配,與處理器的硬件結構緊密相關??傮w來說,32位系統(tǒng)中的地址重映射機制可以分為兩種情況:一類是處理器內部專門的寄存器可以完成Remap,這樣只需將Remap寄存器的相應位置1,由硬件邏輯來完成地址的重新映射,如Atmel AT91xx系列;另一類沒有專門的Remap控制寄存器,需要重新改寫處理器內部用于控制Memory起止地址的Bank寄存器,來實現(xiàn)Remap過程。S3C4510B屬于第二種情況。
2.1 硬件系統(tǒng)結構及地址分配
為例于對地址重映射的過程進行分析,圖1給出了本人用于測試的基本S3C4510B的系統(tǒng)硬件結構。文中給出的所有流程及代碼都經過了測試。
此系統(tǒng)是以Samsung公司給出的測試板為參考建立的,其中ROM的容量為512KB,8位數(shù)據(jù)總線,Remap前的地址范圍為0x0000000~0x0100000,Remap后的地址范圍為0x1000000~0x1100000;RAM的容量為16MB,32位數(shù)據(jù)總線,Remap前的地址范圍為0x0100000~0x100000,Remap后的地址范圍為0x0000000~0x1000000;Flash的容量為2MB,16位數(shù)據(jù)總線,Remap前后地址不變,均為0x1100000~0x1300000。Remap前后的地址映射關系如圖2所示。
2.2 系統(tǒng)啟動過程及Remap實現(xiàn)
系統(tǒng)的地址重映射應該在系統(tǒng)的啟動中完成,以下是S3C4510B的Remap啟動過程。
①系統(tǒng)特殊寄存器的設置。主要是配置如上所述的用于實現(xiàn)地址空間和芯片內外存儲介質映射的寄存器,在本系統(tǒng)中配置如下:
SYSCFG=0x87ffff90
EXTDBWTH=0x3001
ROMCON0=0x01000060
ROMCON1=0x13044060
DRAMCON0=0x11004060
②初始化系統(tǒng)堆棧。在ARM7的體系結構中共有七種工作模式,不同的模式有不販堆棧指針,互不干擾。各模式對應于不販異常中斷,至于哪些模式的堆棧需要初始化取決于用戶使用了哪些中斷,以及系統(tǒng)需要處理些異常類型。一般來說,管理者(SVC)堆棧必須設置,如果使用了IRQ中斷,則IRQ堆棧也必須設置。有一點需要注意的是,為保證Remap后程序運行正常,所有堆棧應設置在RAM的高端地址中。
③初始化I/O口、UART、定時器、中斷控制器以及系統(tǒng)中所用到的其它資源。在初始化異常向量表或修改異常向量表中的入口地址前,要關掉所有中斷。
④異常向量表的初始化。將民常中煌怛處理程序的入口地址寫入RAM中相應的異常向量。必須保證的是,異常向量表絕對不會被從ROM搬移到RAM中的代碼和數(shù)據(jù)所覆蓋,為此,異常向量表一般被定義在RAM中的高端地址中。
⑤程序代碼及數(shù)據(jù)的搬移。Remap后,RAM被映射到0x0000的地址空間,ROM則被移到高端地址上。為保證Remap后程序能夠瞠運行,ROM中的代碼和數(shù)據(jù)必須地址不變地被移到RAM中。這是Remap成功的關鍵。兩種途徑可以實現(xiàn)搬移。
一種是不管實際的代碼空間有多大,直接將ROM地址空間整個搬移到RAM中。當然,這種方法并不適合在真正的啟動代碼中使用,但在做初步的Remap測試時,可以用來檢驗堆棧及異常中斷的設置是否合理。
另一種方法較復雜,它使用了SDT鏈接器ARMLink產生的定位信息,僅把RO風吹草動的有效代碼和數(shù)據(jù)段到RAM中。ARMLink將編譯后的程序鏈接成ELF文件。映像文件內部共有三種輸出段:RO段、RW段和ZI段。這三種輸出段分別包含了只讀代碼及包含在代碼段中的少量數(shù)據(jù)、可讀寫的數(shù)據(jù)、初始化為0的數(shù)據(jù),ARMLink同時還產生了這三種輸出段的起始和終止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$$Limit、Image$$Linit和Image$$ZI$$Limit??梢栽诔绦蛑惺褂眠@些定位信息。將ROM中的代碼和數(shù)據(jù)搬移到RAM中,其實現(xiàn)代碼如下:
數(shù)據(jù)定義:
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
源程序:
;將ROM中的程序搬移到RAM中,重映射后的地址不變
adr r0,ResetEntry ;ROM中程序起始地址
mov r3,#(RamBaseAddr16) ;RamBaseAddr=0x100
Idr r1,BaseOfROM
Idr r2,TopOfROM
Add r1,r1,r3
Add r2,r2,r3
0
Idmia r0!,{r4-r11}
Stmia r1!,{r4-r11}
Cmp r1,r2
Bcc%B0
;將RW段中預初始化的變量搬移到RAM中
sub r1,r1,r2
sub r0,r0,r1 ;將r0指向RO段的結束,即RW段的開始
ldr r1,BaseOfBSS
Idr r2,BaseOfZero
Add r1,r1,3
Add r2,r2,r3
1 ;基于局部標號的相對跳轉,PC+偏移地址,產生與位置無關的代碼
cmp r1,r2
ldrcc r4,[r0],#4
strcc r4,[r1],#4
bcc %B1
;接著把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。
源代碼:
;/*內存控制寄存器重新設置-存儲空間重新映射地址空間*/
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};跳轉到異常中斷處理代碼入口
異常處理入口代碼:
…
SystemIrqHandler
IMPORT ISR_IrqHandler
STMFD sp!,{r0-r12,lr}
BL ISR_IrqHandler ;跳轉到C代碼中異常中斷處理程序ISR_IrqHandler
LDMFD sp!,{r0-r12,lr}
SUBS pc,lr,#4
…
在如上的結構中,不管系統(tǒng)是否進行了地址的重映射,異常中斷向量都可以在運行時動態(tài)改變,大大提高了中斷處理中的靈活性。中斷向量可以在運行時指向不同的異常處理代碼入口。
結語
面對實時性要求越來越高的各種應用,不管應用中有沒有嵌入式操作系統(tǒng),Remap都已經成為啟動代碼中必不可少的一部分。Remap的實現(xiàn)對于操作系統(tǒng)的移植也有重要的意義。Remap決定了系統(tǒng)啟動的效率,并對整個系統(tǒng)的實時性和穩(wěn)定性產生很大影響。因而,對Remap過程的理解和設計,對于那些嵌入式系統(tǒng)的開發(fā)人員來說是非常重要的,它從一開始就決定了整個開發(fā)過程的最終成敗。
評論