ARM啟動代碼詳解_第1頁
ARM啟動代碼詳解_第2頁
ARM啟動代碼詳解_第3頁
ARM啟動代碼詳解_第4頁
ARM啟動代碼詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 PART1 系統(tǒng)初始化流程如下:禁止看門狗-在中斷控制器中屏蔽所有中斷-系統(tǒng)時鐘設(shè)置-初始化端口-DMA設(shè)置-cashe和總線設(shè)置-存儲器設(shè)置,初始化SDRAM-初始化堆棧-設(shè)置IRQ和FIQ的入口-地址重映射。必須由匯編來完成的任務(wù)有:異常中斷向量表的設(shè)置、IRQ向量表(向量模式或ISR初始化(非向量模式、二級ISR地址表的定義、Flash和SDRAM的設(shè)置(否則系統(tǒng)無法加載代碼、堆棧設(shè)置和模式切換、拷貝RW和ZI代碼、設(shè)置系統(tǒng)時鐘等。對于非向量模式,不使用IRQ中斷向量表,但二級ISR地址表的設(shè)置是相同的。 PART2 理解啟動代碼(ADS 所謂啟動代碼,就是處理器在啟動的時候執(zhí)行的一段

2、代碼,主要任務(wù)是初始化處理器模式,設(shè)置堆棧,初始化變量等等.由于以上的操作均與處理器體系結(jié)構(gòu)和系統(tǒng)配置密切相關(guān),所以一般由匯編來編寫. 具體到S64,啟動代碼分成兩部分,一是與ARM7TDMI內(nèi)核相關(guān)的部分,包括處理器各異常向量的配置,各處理器模式的堆棧設(shè)置,如有必要,復(fù)制向量到RAM,以便remap之后處理器正確處理異常,初始化數(shù)據(jù)(包括RW與ZI,最后跳轉(zhuǎn)到Main.二是與處理器外部設(shè)備相關(guān)的部 分,這和廠商的聯(lián)系比較大.雖然都采用了ARM7TDMI的內(nèi)核,但是不同的廠家整合了不同的片上外設(shè),需要不同的初始化,其中比較重要的是初始化WDT,初始化各子系統(tǒng)時鐘,有必要的話,進行remap.這

3、一部分與一般控制器的初始化類似,因此,本文不作重點描述. 在進行分析之前,請確認如下相關(guān)概念: S64片上FLASH起始于0 x100000,共64kB,片上RAM起始于0 x200000,共16kB. S64復(fù)位之后,程序會從0開始執(zhí)行,此時FLASH被映射到0地址,因此,S64可以取得指令并執(zhí)行.顯然,此時還是駐留在0 x100000地址.如果使用remap命令,將會把RAM映射到0地址,同樣的這時0地址的內(nèi)容也只是RAM的鏡像. S64的FLASH可以保證在最差情況時以30MHz進行單周期訪問,而RAM可以保證在最大速度時的單周期訪問. OK,以下開始分析啟動代碼. 一,處理器異常 S6

4、4將異常向量至于0地址開始的幾個直接,這些是必需要處理的.由于復(fù)位向量位于0,也需要一條跳轉(zhuǎn)指令.具體代碼如下: RESET B SYSINIT ; Reset B UDFHANDLER ; UNDEFINED B SWIHANDLER ; SWI B PABTHANDLER ; PREFETCH ABORT B DABTHANDLER ; DATA ABORT B . ; RESERVED B VECTORED_IRQ_HANDLER B . ; ADD FIQ CODE HERE UDFHANDLER B . SWIHANDLER B . PABTHANDLER B . DABTHANDL

5、ER B . 請注意,B指令經(jīng)匯編后會替換為當前PC值加上一個修正值(+/-,所以這條指令是代碼位置無關(guān)的,也就是不管這條指令是在0地址還是在0 x100000執(zhí)行,都能跳轉(zhuǎn)到指定的位置,而LDR PC,=?將向PC直接裝載一個標號的值,請注意,標號在編譯過后將被替換為一個與RO 相對應(yīng)的值,也就是說,這樣的指令無論在哪里執(zhí)行,都只會跳轉(zhuǎn)到一個指定的位置.下面舉一個具體的例子來說明兩者的區(qū)別: 假定有如下程序: RESET B INIT 或者LDR PC,=INIT INIT 其中RESET為起始時的代碼,也就是這條代碼的偏移為0,設(shè)INIT的偏移量為offset.如果將這段程序按照RO=0

6、x1000000編譯, 那么B INIT可理解為ADD PC, PC, #offset,而LDR PC,=INIT可被理解為MOV PC,#(RO+offset .顯然當系統(tǒng)復(fù)位時,程序從0開始運行,而0地址有FLASH的副本,執(zhí)行B INIT將把PC指向位于0地址處的鏡像代碼位置,也即INIT;如果執(zhí)行LDR PC,=INIT將會將PC 直接指向位于FLASH中的原始代碼.因此以上兩者都能正確運行.下面將RO設(shè)置為0 x200000,編譯后生成代碼,還是得燒寫到FLASH中,也就是還是0 x100000,系統(tǒng)復(fù)位后從0地址執(zhí)行,還是FLASH的副本,此時執(zhí)行B INIT,將跳到副本中的INI

7、T位置執(zhí)行,此處有對應(yīng)的代碼;但是如果執(zhí)行LDR PC,=INIT,將向PC加載0 x200000+offset,這將使得PC跳到RAM中,而此時由于代碼沒有復(fù)制,RAM中的指定位置并沒有代碼,程序無法運行. 二,處理器模式 ARM的處理器可工作于多種模式,不同模式有不同的堆棧,以下設(shè)置各模式及其堆棧. 預(yù)定義一些參數(shù): MODUSR EQU 0 x10 MODSYS EQU 0 x1F MODSVC EQU 0 x13 MODABT EQU 0 x17 MODUDF EQU 0 x1B MODIRQ EQU 0 x12 MODFIQ EQU 0 x11 IRQBIT EQU 0 x80 FI

8、QBIT EQU 0 x40 RAMEND EQU 0 x00204000 ; S64 : 16KB RAM VECTSIZE EQU 0 x100 ; UsrStkSz EQU 8 ; size of USR stack SysStkSz EQU 128 ; size of SYS stack SvcStkSz EQU 8 ; size of SVC stack UdfStkSz EQU 8 ; size of UDF stack AbtStkSz EQU 8 ; size of ABT stack IrqStkSz EQU 128 ; size of IRQ stack FiqStkSz

9、EQU 16 ; size of FIQ stack 修改這些值即可修改相應(yīng)模式堆棧的尺寸. 以下為各模式代碼: SYSINIT ; MRS R0,CPSR BIC R0,R0,#0 x1F MOV R2,#RAMEND ORR R1,R0,#(MODSVC :OR: IRQBIT :OR: FIQBIT MSR cpsr_cxsf,R1 ; ENTER SVC MODE MOV sp,R2 SUB R2,R2,#SvcStkSz ORR R1,R0,#(MODFIQ :OR: IRQBIT :OR: FIQBIT MSR CPSR_cxsf,R1 ; ENTER FIQ MODE MOV s

10、p,R2 SUB R2,R2,#FiqStkSz ORR R1,R0,#(MODIRQ :OR: IRQBIT :OR: FIQBIT MSR CPSR_cxsf,R1 ; ENTER IRQ MODE MOV sp,R2 SUB R2,R2,#IrqStkSz ORR R1,R0,#(MODUDF :OR: IRQBIT :OR: FIQBIT MSR CPSR_cxsf,R1 ; ENTER UDF MODE MOV sp,R2 SUB R2,R2,#UdfStkSz ORR R1,R0,#(MODABT :OR: IRQBIT :OR: FIQBIT MSR CPSR_cxsf,R1 ;

11、 ENTER ABT MODE MOV sp,R2 SUB R2,R2,#AbtStkSz ;ORR R1,R0,#(MODUSR :OR: IRQBIT :OR: FIQBIT ;MSR CPSR_cxsf,R1 ; ENTER USR MODE ;MOV sp,R2 ;SUB R2,R2,#UsrStkSz ORR R1,R0,#(MODSYS :OR: IRQBIT :OR: FIQBIT MSR CPSR_cxsf,R1 ; ENTER SYS MODE MOV sp,R2 ; 三,初始化變量 編譯完成之后,連接器會生成三個基本的段,分別是RO,RW,ZI,并會在image中順序擺放.

12、顯然,RW,ZI在運行開始時并不位于指定的 RW位置,因此必須初始化 LDR R0,=|Image$RO$Limit| LDR R1,=|Image$RW$Base| LDR R2,=|Image$ZI$Base| 1 CMP R1,R2 LDRLO R3,R0,#4 STRLO R3,R1,#4 BLO MOV R3,#0 LDR R1,=|Image$ZI$Limit| 2 CMP R2,R1 STRLO R3,R2,#4 BLO 2 四,復(fù)制異常向量 由于代碼于RAM運行時,有明顯的速度優(yōu)勢,而且變量可以動態(tài)配置,因此可以通過remap將RAM映射到0,使得出現(xiàn)異常時ARM從RAM中取得

13、向量. IMPORT |Image$RO$Base| IMPORT |Image$RO$Limit| IMPORT |Image$RW$Base| IMPORT |Image$RW$Limit| IMPORT |Image$ZI$Base| IMPORT |Image$ZI$Limit| COPY_VECT_TO_RAM LDR R0,=|Image$RO$Base| LDR R1,=SYSINIT LDR R2,=0 x200000 ; RAM START CMP R0,R1 LDRLO R3,R0,#4 STRLO R3,R2,#4 BLO 這段程序?qū)YSINIT之前的代碼,也就是異常處

14、理函數(shù),全部復(fù)制到RAM中, 這就意味著不能將RW設(shè)置為0 x200000,這樣會使得向量被沖掉. 四,在RAM中運行 如果有必要,且代碼足夠小,可以將代碼置于RAM中運行,由于RAM中本身沒有代碼,就需要將代碼復(fù)制到RAM中: COPY_BEGIN LDR R0,=0 x200000 LDR R1,=RESET ; =|Image$RO$Base| CMP R1,R0 ; BLO COPY_END ; ADR R0,RESET ADR R2,COPY_END SUB R0,R2,R0 ADD R1,R1,R0 LDR R3,=|Image$RO$Limit| 3 CMP R1,R3 LDRL

15、O R4,R2,#4 STRLO R4,R1,#4 BLO 3 LDR PC,=COPY_END COPY_END 程序首先取得RESET的連接地址,判斷程序是否時是在RAM中運行,方法是與RAM起始地址比較,如果小于,那么就跳過代碼復(fù)制. 在復(fù)制代碼的時候需要注意,在這段程序結(jié)束之前的代碼沒有必要復(fù)制,因為這些代碼都已經(jīng)執(zhí)行過了,所以,先取得COPY_END,作為復(fù)制起始地址,然后計算其相對RESET的偏移,然后以RO的值加上這個偏移,就是復(fù)制目的地的起始地址,然后開始復(fù)制. 五,開始主程序 以上步驟完成,就可以跳轉(zhuǎn)到main運行 IMPORT Main LDR PC,=Main B . 六

16、,器件初始化 主程序首先要進行器件的初始化,對S64而言,應(yīng)該先初始化WDT,因為默認情況下,WDT是打開的,然后是各設(shè)備的時鐘分配,最后應(yīng)該remap. 以上是必要的啟動步驟,實際應(yīng)用中可以根據(jù)具體情況添加一些代碼. PART3 ARM啟動程序分析 字體: 小中大 | 打印發(fā)布: 2007-7-17 11:05 作者: 網(wǎng)絡(luò)轉(zhuǎn)載來源: 網(wǎng)絡(luò)查看: 4次 ARM啟動程序分析 TIMER1用來觸發(fā)和IRQ中斷代碼在FLASH中運行 這個例子有一下幾個文件: 1. 中斷向量表(ivt.s 2. 匯編啟動代碼 (init.s 3. C主函數(shù)文件 中斷向量表 ;代碼必須鏈接在地址0X0。這里提供了AR

17、M內(nèi)核的中斷向量 ; ; 匯編指令 ; AREA IVT, CODE ; 新代碼段 CODE32 ; ARM指令 IMPORT start ; 在這段中沒有定義 Entry ; 定義程序進入點 ; LDR PC, =start LDR PC, Undefined_Addr LDR PC,_Addr LDR PC, Prefetch_Addr LDR PC, Abort_Addr ; 在地址0 x14用戶應(yīng)該插入一個標記(校驗和. ; 此標記讓引導(dǎo)程序決定是否在Flash中有有效的用戶代碼,目前大多數(shù)FLASH編程工具(debuggers and ISP utility ; 有這個內(nèi)置的功能,因

18、此用戶不用考慮這個問題.假如開發(fā)工具沒有提供這種功能,那么這個值必須自己計算,并把計算得到的值寫到地址0 x14. 計算校驗和的細節(jié)可以參考LPC2104/5/6用戶指南的FLASH編程章節(jié). DCD .?. LDR PC, PC, #0 xFF0 LDR PC, FIQ_Addr Undefined_Addr DCD Undefined_HandlerPrefetch_Addr DCD Prefetch_Handler Abort_Addr DCD Abort_Handler FIQ_Addr DCD FIQ_Handler ; ; 異常處理 ; Undefined_Handler B Un

19、defined_HandlerB_Handler Prefetch_Handler B Prefetch_Handler Abort_Handler B Abort_Handler FIQ_Handler B FIQ_Handler END 系統(tǒng)復(fù)位后,第一條要執(zhí)行的指令是: LDR PC,=start 這條指令將跳轉(zhuǎn)到匯編的起始代碼(startup,他將中斷使能,為IRQ 和管理模式設(shè)置堆棧 ;比較重要的中斷向量是IRQ中斷. LDR PC, PC, #0 xFF0 ;這條指令將從中斷向量控制控制器(VIC中的地址寄存器 (0 xFFFF F030 導(dǎo)入PC,并執(zhí)行. ;所有剩余的向量都有中

20、斷句柄 . 啟動程序匯編代碼 ; ; 匯編語言 ; AREA asm_code, CODE ; 新代碼段 CODE32 ; ARM指令 IMPORT _main ; main在這個程序段中沒有定義 EXPORT start ; 全局變量 ; 參考ivt.s文件 ; start ; 中斷使能 MSR cpsr_c,#0 x13 ; 在管理模式時設(shè)定堆棧指針SP LDR SP,=0 x4?. ; 設(shè)置IRQ模式.設(shè)置SP_irq,然后返回管理模式 MRS R0, CPSR BIC R1, R0,#0 x1F ORR R1, R1,#0 x12 MSR cpsr_c, R1 ;進入中斷模式 LDR

21、SP, =0 x4?. MSR cpsr_c, R0 ;返回管理模式 ; 跳轉(zhuǎn)到c程序 LDR lr, =_main MOV pc, lr END 這段代碼在與ivt.s鏈接. 假如設(shè)置堆棧指針失敗將導(dǎo)致數(shù)據(jù)中止異常,因此堆棧的初始化應(yīng)該在跳轉(zhuǎn)到c main(函數(shù)之前。 C 代碼 Timer1 的寄存器這么配置,當匹配的時候?qū)⒅袛鄡?nèi)核,并且復(fù)位。Timer1運行在 60 MHz. 這段代碼在一個評估板上運行,其外部始終使用10 MHz晶體,并且內(nèi)部PLL 設(shè)定好。時鐘操作的具體細節(jié)請參考LPC2106/5/4 中的相關(guān)章節(jié)。中斷服務(wù)程序為空,用戶可以根據(jù)需 要添加。在IRQHandler( 函

22、數(shù)中可以點亮一些LEDs 或觸發(fā)一些引腳. _irq 關(guān)鍵字編譯器用來定義 IRQHandler (函數(shù)作為IRQ 中斷服務(wù)程序。 C main函數(shù)在init.s 文件后執(zhí)行。 LDR lr, =_main MOV pc, lr C代碼如下: /* 函數(shù)定義 */ _irq void IRQHandler(void; void feed(void; void Initialize(void; /* 頭文件 */ #include“LPC210 x.h” /* MAIN */ int main( /* 系統(tǒng)初始化 */ Initialize(; /* 啟動時鐘 */ T1_TCR=0 x1; while(1 /* 初始化 */ void Initialize( /* * 初始化 PLL 10MHz6=60MHz */ /* 設(shè)置乘除數(shù)值*/ PLLCFG=0 x25; feed(; /* 使能 PLL */ PLLCON=0 x1; feed(; /* 等待PLL鎖定設(shè)定的頻率 */ while(!(PLLSTAT feed(; /* * 使能存儲器加速模塊MAM,設(shè)定訪問FLASH的時鐘*/ MAMCR=0 x2; MAMTIM=0 x4; /* * 設(shè)定外圍模塊工作時鐘(pclk與系

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論