版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025上海新金山投資控股集團限公司儲備人才招聘15人高頻重點提升(共500題)附帶答案詳解
- 2025上半年陜西省渭南市事業(yè)單位考試招聘高頻重點提升(共500題)附帶答案詳解
- 2025上半年江蘇省揚州儀征市事業(yè)單位招聘125人歷年高頻重點提升(共500題)附帶答案詳解
- 水上樂園文明使者管理辦法
- 2025上半年四川省古藺縣事業(yè)單位招聘435人歷年高頻重點提升(共500題)附帶答案詳解
- 軟件園內(nèi)商鋪租賃合同樣本
- 地下礦井工程設(shè)備租賃合同
- 農(nóng)業(yè)設(shè)施施工管理合同
- 2024年物業(yè)抵押貸款與社區(qū)安全防范合同3篇
- 旅行社雜工臨時用工協(xié)議
- 《跨境電子商務(wù)基礎(chǔ)》課件-阿里巴巴國際站概述
- 政治-湖南省名校教育聯(lián)盟2025屆高三12月大聯(lián)考試題和答案
- 現(xiàn)代農(nóng)業(yè)旅游觀光項目可行性研究報告
- 商丘工學(xué)院《物聯(lián)網(wǎng)工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年標(biāo)準(zhǔn)設(shè)備安裝分包合作合同版B版
- 幼兒藝術(shù)療愈課程設(shè)計
- 2024年化學(xué)檢驗員(中級工)技能鑒定考試題庫(附答案)
- 【MOOC】中學(xué)化學(xué)教學(xué)設(shè)計與實踐-北京師范大學(xué) 中國大學(xué)慕課MOOC答案
- GB 15930-2024建筑通風(fēng)和排煙系統(tǒng)用防火閥門
- 2023-2024學(xué)年廣東省深圳市寶安區(qū)五年級(上)期末英語試卷
- 2022-2023學(xué)年北京市通州區(qū)高二(上)期末地理試卷
評論
0/150
提交評論