地址重映射在S3C4510B系統中的實(shí)現

發(fā)布時(shí)間:2010-11-16 15:57    發(fā)布者:eetech
關(guān)鍵詞: S3C4510B , 地址 , 映射
介紹基于S3C4510B系統的啟動(dòng)流程;詳細介紹Remap(重映射)的實(shí)現過(guò)程及部分關(guān)鍵代碼,給出啟動(dòng)代碼中異常中斷向量的處理。

近年來(lái),隨著(zhù)32位芯片制造技術(shù)的不斷完善,制造成本不斷降低,國內的32位MCU市場(chǎng)也開(kāi)始火爆起來(lái)。越來(lái)越多的工程師開(kāi)始將開(kāi)發(fā)目光從8位轉移到32位微處理器上,基于32位MCU的產(chǎn)品如雨后春筍般層出不窮,應用領(lǐng)域涵蓋了掌上設備、家用電器、網(wǎng)絡(luò )設備、無(wú)線(xiàn)通信、工業(yè)控制等。在32位微控制芯片領(lǐng)域,ARM架構的芯片占了近70%的市場(chǎng)。本文中所用到的處理器正是Samsung公司生產(chǎn)的基于A(yíng)RM架構的S3C4510B。  

1 S3C4510B簡(jiǎn)介  

S3C4510B是一款基于以太網(wǎng)系統的高性?xún)r(jià)比、高性能的16/32位RISC微處理器。芯片部集成了8KB的Cache/SRAM和Ethernet控制器,減少了整個(gè)系統的成本。片外可擴展ROM、Flash、SDRAM等存儲芯片,可以移植μClinux等復雜的操作系統。利用操作系統完善的TCP/IP協(xié)議棧充分發(fā)揮芯片的網(wǎng)絡(luò )功能。S3C4510B芯片內部沒(méi)有程序存儲器,所有程序都被存儲在片外擴展的ROM和Flash中。開(kāi)始啟動(dòng)時(shí),存有啟動(dòng)代碼的ROM或Flash將被映射為0x00地址,系統從此開(kāi)始運行。但在實(shí)際應用中,為提高系統的實(shí)時(shí)性,加快代碼的執行速度,系統啟動(dòng)后程序往往要被搬移到RAM中,因為RAM的存取速度要比ROM快得多,這樣大大提升系統的性能。由于S3C4510B芯片中的異常中斷入口地址被固定在0x00開(kāi)始的8個(gè)字中,系統只能將地址空間重新分配,把RAM映射到0x00地址處,這正是Remap的原因所在。



  
S3C4510B內部有幾個(gè)特殊寄存器,用于實(shí)現地址空間和芯片內外存儲介質(zhì)的映射。這幾個(gè)寄存器的簡(jiǎn)介如下:  
SYSCFG:設置特殊寄存器的起始地址和片內SRAM的起始地址。  
EXTDBWTH:設置各Bank寄存器所映射芯片的數據線(xiàn)寬度。  
ROMCON0~ROMCON5:設置系統內片擴展ROM和Flash的起始和終止地址。  
DRAMCON0~DRAMCON3:設置系統內片外擴展RAM的起始和終止地址。  
S3C4510B芯片內特殊寄存器段的物理地址為0x3ff0000,各特殊寄存器的偏移地址詳見(jiàn)S3C4510B的技術(shù)手冊。  

2 S3C4510B系統中Remap的實(shí)現  

地址空間的重新分配,與處理器的硬件結構緊密相關(guān)?傮w來(lái)說(shuō),32位系統中的地址重映射機制可以分為兩種情況:一類(lèi)是處理器內部專(zhuān)門(mén)的寄存器可以完成Remap,這樣只需將Remap寄存器的相應位置1,由硬件邏輯來(lái)完成地址的重新映射,如Atmel AT91xx系列;另一類(lèi)沒(méi)有專(zhuān)門(mén)的Remap控制寄存器,需要重新改寫(xiě)處理器內部用于控制Memory起止地址的Bank寄存器,來(lái)實(shí)現Remap過(guò)程。S3C4510B屬于第二種情況。  

2.1 硬件系統結構及地址分配  

為例于對地址重映射的過(guò)程進(jìn)行分析,圖1給出了本人用于測試的基本S3C4510B的系統硬件結構。文中給出的所有流程及代碼都經(jīng)過(guò)了測試。  

此系統是以Samsung公司給出的測試板為參考建立的,其中ROM的容量為512KB,8位數據總線(xiàn),Remap前的地址范圍為0x0000000~0x0100000,Remap后的地址范圍為0x1000000~0x1100000;RAM的容量為16MB,32位數據總線(xiàn),Remap前的地址范圍為0x0100000~0x100000,Remap后的地址范圍為0x0000000~0x1000000;Flash的容量為2MB,16位數據總線(xiàn),Remap前后地址不變,均為0x1100000~0x1300000。Remap前后的地址映射關(guān)系如圖2所示。  

2.2 系統啟動(dòng)過(guò)程及Remap實(shí)現  

系統的地址重映射應該在系統的啟動(dòng)中完成,以下是S3C4510B的Remap啟動(dòng)過(guò)程。  

①系統特殊寄存器的設置。主要是配置如上所述的用于實(shí)現地址空間和芯片內外存儲介質(zhì)映射的寄存器,在本系統中配置如下:  

SYSCFG=0x87ffff90  
EXTDBWTH=0x3001  
ROMCON0=0x01000060  
ROMCON1=0x13044060  
DRAMCON0=0x11004060  

②初始化系統堆棧。在A(yíng)RM7的體系結構中共有七種工作模式,不同的模式有不販堆棧指針,互不干擾。各模式對應于不販異常中斷,至于哪些模式的堆棧需要初始化取決于用戶(hù)使用了哪些中斷,以及系統需要處理些異常類(lèi)型。一般來(lái)說(shuō),管理者(SVC)堆棧必須設置,如果使用了IRQ中斷,則IRQ堆棧也必須設置。有一點(diǎn)需要注意的是,為保證Remap后程序運行正常,所有堆棧應設置在RAM的高端地址中。  

③初始化I/O口、UART、定時(shí)器、中斷控制器以及系統中所用到的其它資源。在初始化異常向量表或修改異常向量表中的入口地址前,要關(guān)掉所有中斷。





④異常向量表的初始化。將民常中煌怛處理程序的入口地址寫(xiě)入RAM中相應的異常向量。必須保證的是,異常向量表絕對不會(huì )被從ROM搬移到RAM中的代碼和數據所覆蓋,為此,異常向量表一般被定義在RAM中的高端地址中。  

⑤程序代碼及數據的搬移。Remap后,RAM被映射到0x0000的地址空間,ROM則被移到高端地址上。為保證Remap后程序能夠瞠運行,ROM中的代碼和數據必須地址不變地被移到RAM中。這是Remap成功的關(guān)鍵。兩種途徑可以實(shí)現搬移。  

一種是不管實(shí)際的代碼空間有多大,直接將ROM地址空間整個(gè)搬移到RAM中。當然,這種方法并不適合在真正的啟動(dòng)代碼中使用,但在做初步的Remap測試時(shí),可以用來(lái)檢驗堆棧及異常中斷的設置是否合理。  

另一種方法較復雜,它使用了SDT鏈接器ARMLink產(chǎn)生的定位信息,僅把RO風(fēng)吹草動(dòng)的有效代碼和數據段到RAM中。ARMLink將編譯后的程序鏈接成ELF文件。映像文件內部共有三種輸出段:RO段、RW段和ZI段。這三種輸出段分別包含了只讀代碼及包含在代碼段中的少量數據、可讀寫(xiě)的數據、初始化為0的數據,ARMLink同時(shí)還產(chǎn)生了這三種輸出段的起始和終止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$$Limit、Image$$Linit和Image$$ZI$$Limit?梢栽诔绦蛑惺褂眠@些定位信息。將ROM中的代碼和數據搬移到RAM中,其實(shí)現代碼如下:  

數據定義:  
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,#(RamBaseAddr<<16) ;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段的開(kāi)始  
ldr r1,BaseOfBSS  
Idr r2,BaseOfZero  
Add r1,r1,3  
Add r2,r2,r3  
1 ;基于局部標號的相對跳轉,PC+偏移地址,產(chǎn)生與位置無(wú)關(guān)的代碼  
cmp r1,r2  
ldrcc r4,[r0],#4  
strcc r4,[r1],#4  
bcc %B1  
;接著(zhù)把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過(guò)程其實(shí)很簡(jiǎn)單,只需重新設置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 %26;amp;11040060 ;/*ROMCON0 0x1000000~0x1100000*/  
…  
DCD %26;amp;10000398 ;/*DRACON0 0x0~0x1000000*/  
…  
⑦進(jìn)入C代碼空間,開(kāi)始主程序的運行。此時(shí)代碼應該運行于RAM中。





上面的步驟可以根據實(shí)際需要進(jìn)行適當的添加或刪節。值得注意的是:匯編生成的代碼應該是與位置無(wú)關(guān)的代碼,即代碼在運行期間可以被映射到不同的地址空間,其中的跳轉指令都是基于PC寄存器的相對跳轉指令;赑C的標號是位于目標指令前或者程序中數據定義偽操作前的標號,這種符號在匯編時(shí)將被處理成PC值加上或減去一個(gè)數字常量。  

3 異常中斷的處理  

在Remap的啟動(dòng)代碼中,需要特別注意的是異常中斷的處理。在S3C4510B中,異常中斷的入口地址是固定的,按表1次序排列。

表1   

異常類(lèi)型
工作模式
正常地址

復位
管理
0x00000000

未定義指令
未定義
0x00000004

軟件中斷(SWI)
管理
0x00000008

預取中止
中止
0x0000000

數據中止
中止
0x00000010

預留
-
0x00000014

IRQ(中斷)
IRQ
0x00000018

FIQ(快速中斷)
FIQ
0x0000001

地址重新映射之后,入口地址被映射到RAM中,中斷處理代碼也被搬移到RAM地址空是。此時(shí),中斷響應和中斷處理的速度都將大大加快,這將有利于提高整個(gè)系統的實(shí)時(shí)性。異常中斷向量表的設計結構如圖3所示。  

下面是各部分的源代碼(以IRQ異常中斷為例)。  

異常向量表的定義:(系統初始化時(shí),將異常處理代碼入口地址寫(xiě)入異常中的向量表)  
_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 ;滿(mǎn)遞減堆棧  
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  
…  
在如上的結構中,不管系統是否進(jìn)行了地址的重映射,異常中斷向量都可以在運行時(shí)動(dòng)態(tài)改變,大大提高了中斷處理中的靈活性。中斷向量可以在運行時(shí)指向不同的異常處理代碼入口。  

結語(yǔ)  

面對實(shí)時(shí)性要求越來(lái)越高的各種應用,不管應用中有沒(méi)有嵌入式操作系統,Remap都已經(jīng)成為啟動(dòng)代碼中必不可少的一部分。Remap的實(shí)現對于操作系統的移植也有重要的意義。Remap決定了系統啟動(dòng)的效率,并對整個(gè)系統的實(shí)時(shí)性和穩定性產(chǎn)生很大影響。因而,對Remap過(guò)程的理解和設計,對于那些嵌入式系統的開(kāi)發(fā)人員來(lái)說(shuō)是非常重要的,它從一開(kāi)始就決定了整個(gè)開(kāi)發(fā)過(guò)程的最終成敗。
本文地址:http://selenalain.com/thread-39794-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页