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

下載本文檔

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

文檔簡介

ARM啟動代碼分析ARM啟動代碼分析-philips的LPC2xxx系列/***********************************************************************************File:startup.s*Author:Embestw.h.xie2005.02.21*Desc:lpc22xx\lpc212x\lpc211x\lpc210xstartupcode*History:*notemodify:cuijianjie2006-4-25*comment:**********************************************************************************/#處理器的七種工作方式的常量定義.EQUMode_USR,0x10#用戶模式.EQUMode_FIQ,0x11#FIQ模式.EQUMode_IRQ,0x12#IRQ模式.EQUMode_SVC,0x13#超級用戶模式.EQUMode_ABT,0x17#終止模式.EQUMode_UND,0x1B#未定義模式.EQUMode_SYS,0x1F#系統(tǒng)模式#中斷屏蔽位.EQUI_Bit,0x80//IRQ中斷控制位,當(dāng)被置位時,IRQ中斷被禁止.EQUF_Bit,0x40//FIQ中斷控制位,當(dāng)被置位時,F(xiàn)IQ中斷被禁止#狀態(tài)屏蔽位.EQUT_bit,0x20//T位,置位時在Thumb模式下運行,清零時在ARM下運行#定義程序入口點.globl_start.code32.TEXT_start:#中斷向量表Vectors:LDRPC,Reset_Addr//把Reset_Addr地址處的內(nèi)容放入PC中LDRPC,Undef_AddrLDRPC,SWI_AddrLDRPC,PAbt_AddrLDRPC,DAbt_Addr.long0xb9205f80@keepinterruptvectorssumis0LDRPC,[PC,#-0xff0]//當(dāng)前PC值減去0xFF0等于IRQ中斷入口地址LDRPC,FIQ_Addr#地址表:Reset_Addr:#該地址標(biāo)號存放Reset_Handler程序段的入口地址.longReset_HandlerUndef_Addr:#該地址標(biāo)號存放Undef_Handler程序段的入口地址.longUndef_HandlerSWI_Addr:#該地址標(biāo)號存放SWI_Handler程序段的入口地址.longSWI_HandlerPAbt_Addr:#該地址標(biāo)號存放PAbt_Handler程序段的入口地址.longPAbt_HandlerDAbt_Addr:.longDAbt_Handler.long0IRQ_Addr:#地址標(biāo)號處存放一個無效的數(shù)據(jù).long0FIQ_Addr:#該地址標(biāo)號存放FIQ_Handler程序段的入口地址.longFIQ_HandlerUndef_Handler:BUndef_HandlerPAbt_Handler:BPAbt_HandlerDAbt_Handler:BDAbt_Handler#軟中斷的中斷服務(wù)子程序入口地址SWI_Handler:STMFDsp!,{r0-r3,r12,lr}//入棧,現(xiàn)場數(shù)據(jù)保護MOVr1,sp//把堆棧指針SP存入R1中MRSr0,spsr//把SPSR值存入R0,SPSR值為產(chǎn)生軟中斷時的CPSRTSTr0,#T_bit//判斷R0(SPSR)的T位是否為0#SPSR的T位不為0,工作在Thumb模式下LDRNEHr0,[lr,#-2]//SPSR的T位不為0,則[lr-2]-〉r0BICNEr0,r0,#0xFF00//SPSR的T位不為0,清除r0的Bit8~Bit15位#SPSR的T位為0,工作在ARM模式下LDREQr0,[lr,#-4]//SPSR的T位為0,則[lr-4]-〉r0BICEQr0,r0,#0xFF000000//SPSR的T位為0,清除r0的Bit24~Bit131位#R0isinterruptnumber//R0是中斷號#R1isstackpoint//R1是堆棧指針BLSWI_Exception//進入軟中斷處理程序LDMFDsp!,{r0-r3,r12,pc}^//出棧,現(xiàn)場數(shù)據(jù)恢復(fù)#快速響應(yīng)中斷的中斷服務(wù)自程序的入口地址FIQ_Handler:STMFDSP!,{R0-R3,LR}//入棧的現(xiàn)場保護#BLFIQ_Exception//進入FIQ的中斷處理程序LDMFDSP!,{R0-R3,LR}//出棧,恢復(fù)現(xiàn)場SUBSPC,LR,#4//返回到主程序#復(fù)位后程序處理的入口地址Reset_Handler:BLRemapSRAM//進行存儲器映射的操作#下面幾行代碼用來判斷當(dāng)前的工作模式MRSR0,CPSR//讀CPSR到寄存器R0ANDR0,R0,#0x1F//R0=R0AND0x1FCMPR0,#Mode_USR//比較R0和#Mode_USR,二者相減//如果相等則說明當(dāng)前處在用戶模式下,需要通過產(chǎn)生11號軟中斷進入系統(tǒng)模式。因為下面的初始化堆棧//需要在不同的工作模式下切換,而在用戶模式下不能直接切換,只有系統(tǒng)模式可以,所以要通過產(chǎn)生11//號軟中斷切換到用戶模式。SWIEQ#11BLInitStack//進行堆棧初始化工作ARM啟動代碼分析-philips的LPC2xxx系列32006-7-2414:33:00#------------------------------------------------------------------------------#-初始化C變量#------------------------#-下表由連接器自動產(chǎn)生#-RO:只讀=代碼區(qū)。#-RW:可讀可寫=預(yù)先初始化的數(shù)據(jù)(初始化的全局變量)和預(yù)先被清零的數(shù)據(jù)(未初始化的全局變量)。.#-ZI:預(yù)先被清零的數(shù)據(jù)區(qū)(未初始化的全局變量)#-預(yù)先被初始化的數(shù)據(jù)區(qū)定位在代碼區(qū)之后。#-預(yù)先被清零的數(shù)據(jù)區(qū)定位在預(yù)先被初始化的數(shù)據(jù)區(qū)之后。#-注意數(shù)據(jù)區(qū)的位置:#-I如果用ARMSDT,當(dāng)鏈接器選擇no-rw-base時,數(shù)據(jù)區(qū)被映射在代碼區(qū)之后#-你可以把數(shù)據(jù)區(qū)房子內(nèi)部的SRAM(-rw-base=0x40or0x34)中#-或者放在外部的SRAM(-rw-base=0x2000000)中。#-注意:為了提高代碼的密度,預(yù)先被初始化的數(shù)據(jù)必須盡可能的少。#------------------------------------------------------------------------------#該部分程序功能:先判斷當(dāng)前是在RAM中運行還是在FLASH中運行,如果在FLASH中運行,先把FLASH#中的預(yù)先賦值的RW段數(shù)據(jù)和未賦值的ZI段數(shù)據(jù)都搬移到RAM區(qū)中,再把ZI段數(shù)據(jù)全部清零;如果程#序就是在RAM中運行,則直接把ZI段數(shù)據(jù)清零。.externImage_RO_Limit/*ROM區(qū)中數(shù)據(jù)段的起始地址*/.externImage_RW_Base/*RW段起始地址*/.externImage_ZI_Base/*ZI段的起始地址*/.externImage_ZI_Limit/*ZI段的結(jié)束地址加1*/ldrr0,=Image_RO_Limit/*取ROM區(qū)中數(shù)據(jù)段的首地址*/ldrr1,=Image_RW_Base/*取RAM區(qū)中RW段的目標(biāo)首地址*/ldrr3,=Image_ZI_Base/*取RAM區(qū)中ZI段的首地址*/cmpr0,r1/*比較ROM區(qū)中數(shù)據(jù)段首地址和RAM區(qū)中RW段目標(biāo)首地址*/beqNoRW/*相等代表當(dāng)前是在RAM中運行*/LoopRw:cmpr1,r3/*不相等則和RAM區(qū)中ZI段的目標(biāo)地址比較*/ldrccr2,[r0],#4/*如果r1<r3,則把r0地址上的數(shù)據(jù)讀出到r2中,然后r0=r0+4*/strccr2,[r1],#4/*如果r1<r3,則把r2內(nèi)數(shù)據(jù)寫入道r1地址中,然后r1=r1+4*/bccLoopRw/*如果r1<r3,則跳轉(zhuǎn)到LoopRw繼續(xù)執(zhí)行*/NoRW:ldrr1,=Image_ZI_Limit/*取ZI段的結(jié)束地址*/movr2,#0/*將r2賦0*/LoopZI:cmpr3,r1/*將ZI段清零*/strccr2,[r3],#4/*如果r3<r1,將r2內(nèi)容寫入到r3地址單元中,然后r3=r3+1*/bccLoopZI/*如果r3<r1(即C=0),則跳轉(zhuǎn)到LoopZI*/.externMain/*聲明外部變量*/BMain/*t跳轉(zhuǎn)到用戶的主程序入口*/#為每一種模式建立堆棧,ARM堆棧指針向下生長InitStack:MOVR1,LR//把該子程序返回地址保留在R1中LDRR0,=Top_Stack//取棧定地址到R0中#進入未定義模式,并禁止FIQ中斷和IRQ中斷MSRCPSR_c,#Mode_UND|I_Bit|F_Bit#設(shè)置未定義模式下堆棧的棧頂指針MOVSP,R0SUBR0,R0,#UND_Stack_Size#未定義模式下堆棧深度#進入終止模式,并禁止禁止FIQ中斷和IRQ中斷MSRCPSR_c,#Mode_ABT|I_Bit|F_Bit#緊接著未定義模式下的堆棧,設(shè)置終止模式下棧頂指針MOVSP,R0SUBR0,R0,#ABT_Stack_Size#終止模式下堆棧深度#進入FIQ模式,并禁止FIQ中斷和IRQ中斷MSRCPSR_c,#Mode_FIQ|I_Bit|F_Bit#緊接著終止模式下的堆棧,設(shè)置下FIQ模式下棧頂指針MOVSP,R0SUBR0,R0,#FIQ_Stack_Size#FIQ模式下的堆棧深度#進入IRQ模式,并禁止FIQ中斷和IRQ中斷MSRCPSR_c,#Mode_IRQ|I_Bit|F_Bit#緊接著FIQ模式下的堆棧,設(shè)置IRQ模式下的棧頂指針MOVSP,R0SUBR0,R0,#IRQ_Stack_Size#IRQ模式下的堆棧深度#進入超級用戶模式,并禁止FIQ中斷和IRQ中斷MSRCPSR_c,#Mode_SVC|I_Bit|F_Bit#緊接著IRQ模式下的堆棧,設(shè)置超級用戶下的棧頂指針MOVSP,R0SUBR0,R0,#SVC_Stack_Size#超級用戶下的堆棧深度#設(shè)置進入用戶模式MSRCPSR_c,#Mode_USR#緊接著超級用戶模式下的堆棧,設(shè)置用戶模式下的棧頂指針,剩余的空間都開辟為堆棧MOVSP,R0MOVPC,R1#堆棧初始化子程序返回#重映射SRAM區(qū)RemapSRAM:MOVR0,#0x40000000//RAM區(qū)首地址LDRR1,=Vectors//向量表首地址#下面一段程序是把從0x00000000開始的64個字節(jié)(FLASH中的中斷向量表和地址表)搬移到以#0x40000000為首地址的RAM區(qū)中LDMIAR1!,{R2-R9}//把以[R1]為首地址的32個字節(jié)數(shù)據(jù)裝載到R2-R9中STMIAR0!,{R2-R9}//把R2-R9中的數(shù)據(jù)存入以[R0]為首地址的單元中LDMIAR1!,{R2-R9}//把以[R1]為首地址的32個字節(jié)數(shù)據(jù)裝載到R2-R9中STMIAR0!,{R2-R9}////把R2-R9中的數(shù)據(jù)存入以[R0]為首地址的單元中#下面幾行代碼設(shè)置存儲器映射控制寄存器LDRR0,=MEMMAP//取MEMMAP地址到R0MOVR1,#0x02STRR1,[R0]//給MEMMAP賦值為0x02,設(shè)置中斷向量從RAM區(qū)從新映射movpc,lr//跳轉(zhuǎn)到主程序#下面一段程序代碼是進入軟中斷來切換系統(tǒng)的工作模式,當(dāng)希望從一種模式切換入另一種模式時,可以通#過調(diào)用下面對應(yīng)標(biāo)號的程序段進入軟中斷。在軟中斷處理程序中會根據(jù)所給定的中斷號處理,執(zhí)行SWI#num后軟中斷號被存入R0中。.globldisable_IRQ.globlrestore_IRQ.globlToSys.globlToUser#禁止IRQdisable_IRQ:STMFDSP!,{LR}//把LR值壓入堆棧swi#0//

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論