<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 消費電子 > 設計應用 > ARM處理器啟動(dòng)代碼的分析與設計

ARM處理器啟動(dòng)代碼的分析與設計

作者:武漢理工大學(xué) 甘泉 楊健 陳永泰 時(shí)間:2005-03-14 來(lái)源: 收藏

2004年10月A版

本文引用地址:http://dyxdggzs.com/article/4609.htm

摘   要: 本文以ARM7TDMI作內核的網(wǎng)絡(luò )控制器S3C4510B為例,簡(jiǎn)要介紹了ARM體系結構及其特點(diǎn),重點(diǎn)闡述了ARM處理器啟動(dòng)程序底層的組成結構和各部分的具體內容。
關(guān)鍵詞: ARM內核;啟動(dòng)代碼;中斷向量;堆棧隨著(zhù)對高處理能力、網(wǎng)絡(luò )通信、實(shí)時(shí)多任務(wù),超低功耗這些需求的增長(cháng),傳統8位處理器已經(jīng)不能滿(mǎn)足新產(chǎn)品的要求了,高端嵌入式處理器已經(jīng)進(jìn)入了國內開(kāi)發(fā)人員的視野,并在國內得到了普遍的重視和應用。ARM是目前嵌入式領(lǐng)域應用最廣泛的RISC微處理器結構,以其低成本、低功耗、高性能等優(yōu)點(diǎn)占據了嵌入式系統應用領(lǐng)域的領(lǐng)先地位。本文應用ARM處理器S3C4510B開(kāi)發(fā)設計了四路E1收發(fā)器,參考一些文獻對ARM處理器的啟動(dòng)代碼進(jìn)行了編寫(xiě),結合在實(shí)際應用時(shí)編寫(xiě)調試的經(jīng)驗進(jìn)行了總結。

ARM體系結構
目前,ARM系列的通用32位RISC微處理器有ARM7、ARM9、ARM9E、ARM10等多個(gè)產(chǎn)品,這些處理器可以工作于7種模式下,如表1所示。
除User模式以外的其它模式都叫做特權模式,除User和System以外的其它5種模式叫做異常模式。大部分應用程序都在User模式下運行,當處理器處于User模式下時(shí),執行的程序無(wú)法訪(fǎng)問(wèn)一些被保護的系統資源,以利于操作系統控制系統資源的使用,也不能改變模式,否則就會(huì )導致一次異常。對于System模式,任何異常都不會(huì )導致進(jìn)入這一模式,而且它使用的寄存器和User模式下基本相同,主要是用于有訪(fǎng)問(wèn)系統資源請求而又避免使用額外的寄存器的操作系統任務(wù)。在特權模式下,它們可以完全訪(fǎng)問(wèn)系統資源,可以自由地改變模式。在處理特定的異常時(shí),系統進(jìn)入對應的異常模式下。這5種異常模式都有各自額外的寄存器,用于避免在發(fā)生異常的時(shí)候與用戶(hù)模式下的程序發(fā)生沖突。如表2所示:
在任意一種處理器模式中,都使用同一個(gè)寄存器來(lái)標識當前處理器的工作模式,這個(gè)寄存器叫做CPSR(當前程序狀態(tài)寄存器),它的0~4位用來(lái)表示CPU模式,(如表2所示)而且在每一種處理器異常模式下,都有一個(gè)對應的SPSR(緩存程序狀態(tài)寄存器),用來(lái)保存進(jìn)入異常模式前的CPSR的值。SPSR的作用就是當CPU從異常模式退出時(shí),通過(guò)一條簡(jiǎn)單的匯編指令就能夠恢復進(jìn)入異常模式前的CPSR,該值保存在當前異常模式的SPSR中。

圖1  啟動(dòng)代碼流程圖

啟動(dòng)代碼的設計
啟動(dòng)代碼類(lèi)似于電腦中的BIOS,它從系統上電開(kāi)始接管CPU,依次需要負責初始化 CPU在各種模式下的堆??臻g、設定CPU的內存映射、對系統的各種控制寄存器做初始化、對CPU的外部存儲器進(jìn)行初始化、設定各外圍設備的基地址、創(chuàng )建正確的中斷向量表、為C代碼執行創(chuàng )建ZI(零創(chuàng )建)區,然后進(jìn)入到C代碼。 在C代碼中繼續對時(shí)鐘、RS232端口進(jìn)行初始化,然后打開(kāi)系統中斷允許位。最后進(jìn)入到應用代碼中執行,執行期間響應各種不同的中斷信號并調用預先設置好的中斷服務(wù)程序處理這些中斷。
整個(gè)過(guò)程的流程圖如圖1所示。
堆棧初始化
堆棧的初始化要處理的事情是為處理器的7個(gè)處理器模式分配堆??臻g。以下以FIQ模式下的堆棧設置為例說(shuō)明:
ORR r1, r0, #LOCKOUT | FIQ_MODE;把模式放在r1中,LOCKOUT用來(lái)屏蔽中斷位;
MSR cpsr, r1  ;改變CPU的CPSR寄存器,進(jìn)入到指定的FIQ模式;
MSR spsr, r2   ;保存前一模式;
LDR sp, =FIQ_STACK   ;把FIQ模式下的堆棧起始值賦給當前的SP,FIQ_STACK是分配給FIQ模式堆??臻g(比如說(shuō)1K字節)的起始地址。
按這種方式設置其它模式下的堆棧。
DRAM的初始化根據系統配置信息來(lái)決定,因為系統不一定會(huì )用到DRAM,但是一定要做SDRAM的初始化。主要的處理內容是ROM和RAM基址的設定、數據總線(xiàn)的寬度、SDRAM的刷新時(shí)間等等,這些可以參照S3C4510B芯片的用戶(hù)手冊。
特殊寄存器的設置主要是針對I/O口,比方說(shuō)設定幾個(gè)I/O位用做系統狀態(tài)指示燈LED。寄存器的設定主要根據硬件的配置情況而定,值得注意的是由于這段啟動(dòng)代碼是燒錄到ROM中的,而中斷向量必須位于零地址,所以在存儲單元沒(méi)有重新映射之前ROM基址的設定應該為零地址。
拷貝(image)主要是為了提高運行速度,編譯生成的映像文件代碼從ROM內拷貝到RAM中去,而程序的執行也就在RAM中。當然,啟動(dòng)代碼對運行速度的要求不是很?chē)栏?,所以這個(gè)拷貝動(dòng)作可以不用做,讓代碼存放在ROM中,代碼的執行也在ROM中,而運行中所需要的數據在RAM中。
內存的初始化是為C代碼的運行開(kāi)辟內存區,代碼編譯后會(huì )分為三個(gè)區:只讀區、可讀可寫(xiě)區,零初始化區。內存的初始化處理的內容是:當只讀區截止地址等于可讀可寫(xiě)區基址時(shí),把零初始化區各字節清零;當只讀區截止地址不等于可讀可寫(xiě)區基址時(shí),如果可讀可寫(xiě)區基址小于零初始化基址,就從只讀區截止地址處開(kāi)始把數據拷貝到可讀可寫(xiě)區基址處,直到到達零初始化基址,然后把零初始化區各字節清零,否則也只用把零初始化區各字節清零。
中斷向量表是用于處理異常情況的,當發(fā)生異常時(shí),首先要保存當前程序的返回地址和CPSR寄存器的值,然后進(jìn)入到相應的異常向量地址,一般來(lái)說(shuō)在異常向量地址是一個(gè)跳轉指令,使程序進(jìn)入相應的異常處理過(guò)程。由于中斷向量表要位于系統的零地址,當把啟動(dòng)代碼燒錄到EEPROM中運行時(shí)就需要把ROM的地址定義到零地址,所以程序的入口處如下:
__main                
ENTRY
B       Reset_Handler   ;系統上電后進(jìn)入復位操作,通過(guò)這個(gè)跳轉指令進(jìn)入堆棧初始化操作
B       Undefined_Handler  ;處理未定義模式。
B       SWI_Handler
B       Prefetch_Handler
B       Abort_Handler
NOP      ; Reserved Vector
B       IRQ_Handler     ;處理器IRQ中斷。
B       FIQ_Handler     ;處理器FIQ中斷,快速響應用戶(hù)中斷,支持高速數據傳輸這些跳轉指令的地址是固定的,復位跳轉指令在0X0000,0000,未定義模式的跳轉是0X0000,0004,其它跳轉指令地址依次加4,而且這個(gè)順序是不能更改的。
系統重新映射當你為了提高運行速度而把ROM的Image拷貝到RAM后,中斷向量表就不是在零地址處,因此要重新映射存儲單元,把RAM的地址重新設定為零地址。映射就是把啟動(dòng)代碼從ROM(EEPROM或者Flash)拷貝到SDRAM運行,同時(shí)再拷貝完畢以后進(jìn)行內存的重新映射,把SDRAM映射到原來(lái)的ROM地址(0x0000)中,這樣就可以用SDRAM中的代碼寫(xiě)Flash,使得程序代碼得以更新。但是需要注意的是,如果程序進(jìn)行了映射,這樣就對在線(xiàn)調試帶來(lái)了困難,使得在線(xiàn)調試不可以在RAM中進(jìn)行(如果寫(xiě)入EEPROM的代碼是映射了的,則在調試器啟動(dòng)的時(shí)候必然也會(huì )對程序進(jìn)行映射,使得程序在調試器中不可以定位到原來(lái)的地方,使得調試失敗)。一個(gè)折中的方法是,不進(jìn)行映射,就是說(shuō)在調試的代碼中不可以使用下載,這樣就可以像普通的代碼一樣進(jìn)行調試了。

結語(yǔ)
做完這些初始化后,讓CPU切換到用戶(hù)模式下,并把堆棧指針SP指定到用戶(hù)堆棧區,就可以進(jìn)入到C代碼區運行。在C代碼中繼續對時(shí)鐘、RS232端口進(jìn)行初始化,然后打開(kāi)系統中斷允許位,進(jìn)入到應用代碼中執行。此程序加載到處理器S3C4510B中經(jīng)過(guò)調試,CPU可以正常啟動(dòng),能夠對中斷請求做出及時(shí)的響應,上層應用的主代碼可以加載到Flash中,移植實(shí)時(shí)操作系統RTXC后對多任務(wù)的調度控制正常。

參考文獻:
1.  Steve Furber, ‘ARM SoC體系結構’.北京航空航天大學(xué)出版社,2002.
2.  馬忠梅, ‘ARM嵌入式處理器結構與應用基礎’, 北京航空航天大學(xué)出版社,2003.
3. 李駒光, ‘ARM應用系統開(kāi)發(fā)詳解—基于S3C4510B的系統設計’, 清華大學(xué)出版社,2003.



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>