第三章 ARM程序設計基礎 新 2_第1頁
第三章 ARM程序設計基礎 新 2_第2頁
第三章 ARM程序設計基礎 新 2_第3頁
第三章 ARM程序設計基礎 新 2_第4頁
第三章 ARM程序設計基礎 新 2_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第三章

ARM程序設計基礎(2)內容3.1ARM程序設計簡介3.2ARM程序設計簡單實例3.3ARM初始化程序實例3.4ARM與C語言混合編程3.5BootLoader3.3ARM初始化程序實例基于操作系統(tǒng)的初始化由BootLoader實現(xiàn)不基于操作系統(tǒng)的程序初始化定義常量(地址,數(shù)值等等)定義本地異常向量表中斷模式的現(xiàn)場保護初始化各模式的堆棧指針復制全局異常向量表修改處理器模式或狀態(tài)定義常量EQU:名稱EQU 表達式[,類型]

說明:EQU用于將程序中的數(shù)字常量、標號、基于寄存器的值賦予一個等效的名稱,這一點類似于C語言中的#define,可用“*”代替EQU。XEQU22X*33USERMODEEQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODEEQU 0x17UNDEFMODEEQU 0x1bMODEMASKEQU 0x1fNOINT EQU 0xc0I_Bit * 0x80F_Bit * 0x40M4:M0模式0b10000用戶0b10001快中斷0b10010中斷0b10011管理0b10111中止0b11011未定義0b11111系統(tǒng)定義異常向量表AREA Init,CODE,READONLYIMPORT__use_no_semihosting_swi;不使用半主機C庫函數(shù)IMPORT Enter_UNDEF;外部C函數(shù)IMPORT Enter_SWIIMPORT Enter_PABORTIMPORT Enter_DABORTIMPORT Enter_FIQENTRYb ColdResetb Enter_UNDEF ;UndefinedInstructionb Enter_SWI ;syscall_handlerorSWIb Enter_PABORT ;PrefetchAbortb Enter_DABORT ;DataAbortb . ;ReservedHandlerb IRQ_Handler ;IRQHandler;中斷現(xiàn)場處理b Enter_FIQ ;FIQHandler定義異常向量表IMPORT:IMPORT標號[,WEAK]

說明:IMPORT告訴編譯器這個標號要在當前源文件中使用,但標號是在其他的源文件中定義的。

[,WEAK]選項表示如果所有的源文件都沒有找到這個標號的定義,編譯器也不會提示錯誤信息。定義異常向量表IMPORT__use_no_semihosting_swiIMPORT Enter_UNDEFIMPORT Enter_SWIIMPORT Enter_PABORTIMPORT Enter_DABORTIMPORT Enter_FIQUHAL.c文件中定義定義異常向量表b ColdReset ;b Enter_UNDEF ;UndefinedInstructionb Enter_SWI ;syscall_handlerorSWIb Enter_PABORT ;PrefetchAbortb Enter_DABORT ;DataAbortb . ;ReservedHandlerb IRQ_Handler ;IRQHandlerb Enter_FIQ ;FIQHandler中斷模式的現(xiàn)場保護IRQ_Handler IMPORT ISR_IrqHandler;C函數(shù)

STMFD sp!,{r0-r12,lr};入棧

BL ISR_IrqHandler LDMFD sp!,{r0-r12,lr};出棧

SUBS pc,lr, #4;返回初始化異常模式的堆棧指針

EXPORTColdResetColdReset

ldr r0,=WTCON ;watchdogdisable

ldr r1,=0x0

str r1,[r0]

ldr r0,=INTMSK

ldr r1,=0xffffffff ;allinterruptdisable

str r1,[r0]

ldr r0,=INTSUBMSK

ldr r1,=0x7ff ;allsubinterruptdisable

str r1,[r0]

bl

InitStacks ;Stack SetupforeachMODEEXPORTEXPORT標號[,WEAK]

說明:EXPORT在程序中聲明一個全局標號,其他的文件中的代碼可以該標號可被引用。用戶也可以用GLOBAL代替EXPORT。[,WEAK]可選項聲明其他文件有同名的標號,則該同名標號優(yōu)先于該標號被引用。LDR、STR存儲器訪問指令LDR{cond}{T}{S}{B/H}Rd,<地址>將指定地址的數(shù)據加載到目的寄存器STR{cond}{T}{B/H}Rd,<地址>將指定寄存器的數(shù)據保存到指定的地址空間T在特權模式下訪問用戶模式的寄存器,在用戶模式下無效,不能與前索引偏移一起使用。B訪問字節(jié)數(shù)據H訪問半字數(shù)據S訪問有符號數(shù)據,僅用于數(shù)據加載LDR、STR存儲器訪問指令尋址方式寄存器尋址及寄存器間接尋址LDRB R0,[R1,#+0XFFF] /*把R1+0XFFF地址的字節(jié)讀入R0*/LDR R0,[R1,+R2]!/*把R1+R2地址的32比特數(shù)讀入R0,然后R1=R1+R2*/STR R0,[R1,+R2,LSL#31]/*把R0(32BIT)寫到地址R1+(R2<<31)*/LDR R0,[R1],#+0XFFF /*把R1地址的數(shù)讀入R0,然后R1=R1+0XFFF*/LDR R0,[R1],+R2 /*把R1地址的數(shù)讀入R0,然后R1=R1+R2*/LDR R0,[R1],+R2,LSL#31/*把R1地址的數(shù)讀入R0,然后R1=R1+(R2<<31)*/大范圍地址加載指令LDRLDR{cond}Rd,=表達式/標號/立即數(shù)直接將數(shù)據加載到目的寄存器初始化異常模式的堆棧指針

EXPORTColdResetColdReset

ldr r0,=WTCON ;watchdogdisable

ldr r1,=0x0

str r1,[r0]

ldr r0,=INTMSK

ldr r1,=0xffffffff ;allinterruptdisable

str r1,[r0]

ldr r0,=INTSUBMSK

ldr r1,=0x7ff ;allsubinterruptdisable

str r1,[r0]

bl

InitStacks ;Stack SetupforeachMODEInitStacks

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;UndefMode

ldr sp,=UndefStack

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack

orr r1,r0,#SVCMODE|NOINT

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USERmodeisnotinitialized.

mov

pc,lr;TheLRregistermaybenotvalidfor themodechanges.初始化異常模式的堆棧指針位清除指令BICBIC{cond}{S}Rd,Rn,operand2將Rn的值與operand2的反碼按位進行邏輯與操作,結果寫入RdBIC r0,r0,#MODEMASK;#0x1F程序狀態(tài)訪問指令MRSMSR當需要修改CPSR/SPSR的內容時,首先要讀取它的值到一個通用寄存器,然后修改某些位,最后將數(shù)據寫回到狀態(tài)寄存器。CPSR/SPSR不是通用寄存器,不能使用MOV指令來讀寫。在ARM處理器中,只有MRS指令可以讀取CPSR/SPSR;只有MSR可以寫CPSR/SPSR。MRS語法MRS{<COND>}<RD>,CPSR|SPSR舉例MRS R0,CPSR /*讀取CPSR到R0*/MRS R3,SPSR /*讀取SPSR到R3*/說明USER和SYSTEM模式沒有SPSR,因此這些模式下不能讀取SPSR。MSRMSR{<cond>}<psr>_<fields>,#<immed>MSR{<cond>}<psr>_<fields>,<Rm><immed>表示合法的立即數(shù)<psr>代表cpsr或spsr<fields>指定傳送的區(qū)域,可進一步細分(只能小寫)c 控制域字節(jié)(psr[7:0])x 擴展域字節(jié)(psr[15:8]) s 狀態(tài)域字節(jié)(psr[23:16])f 標志域字節(jié)(psr[31:24])MSR舉例MSR cpsr_c,#0xd3 /*切換到SVC模式*/MSR cpsr_cxsf,r3 /*cpsr=r3*/說明USER和SYSTEM模式沒有SPSR,因此這些模式下不能對SPSR操作。由于權限問題,在USER模式下對CPSR[23:0]修改無效。如果使用立即數(shù),要使用合法的立即數(shù)。程序不能同過“MSR修改CPSR的T位”來完成ARM/THUMB態(tài)的切換。必須使用BX指令,因為BX屬于分支指令,它會打斷流水線,實現(xiàn)處理器狀態(tài)切換。如果要修改讀出的值,僅修改必要的位,其它位保持不變,這樣保持了最大兼容性。InitStacks

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;UndefMode

ldr sp,=UndefStack

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack

;bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE|NOINT

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USERmodeisnotinitialized.

mov

pc,lr;TheLRregistermaybenotvalidfor themodechanges.初始化存儲器使用Scattered方式

LOAD0x30008000 ;loadregion{ RAM_EXEC+0 ;PC {

startup.o(init,+FIRST) *(+RO) } L0PAGETABLE0x30200000UNINIT ;about2MByteoffsetSDRAM {

pagetable.o(+ZI) } STACKS+0x100000UNINIT ;64KByteunderL0pagetable {

stack.o(+ZI) } RAM+0 { *(+RW,+ZI) } HEAP+0UNINIT {

heap.o(+ZI) } EXCEPTION_EXEC0OVERLAY ;exceptionregion {

exception.o(+RO) }}3.4ARM與C語言混合編程C中內嵌匯編基于ADS__asm{指令[;/*注釋*/]…..[指令]}3.4ARM與C語言混合編程C調用匯編C代碼…externvoidscopy(char*d,char*s);Intmain(){…Scopy(dststr,srcstr)…}匯編代碼AREAexample,CODE,READONLYEXPORTscopyscopyLDRBR2,[R0],#1STRBR2,[R1],#1CMPR2,#0BNEscopyMOVpc,lrEND3.4ARM與C語言混合編程匯編調用C匯編代碼EXPORTcallsum5AREAexample,CODE,READONLYIMPORTsum5callsum5STMFDSP!,{LR} ;LR入棧

ADDR1,R0,R0 ;R0=a,R1=b,R2=cADDR2,R1,R0ADDR3,R1,R2STRR3,[SP,#-4]! ;einstackADDR3,R1,R1 ;R3=dBLsum5 ;callR5,R0=resultADDSP,SP,#4LDMFDSP!,{PC}ENDC代碼Intsum5(inta,intb,intc,intd,inte){return(a+b+c+d+e);}3.4ARM與C語言混合編程C/ASM相互調用基于ATPCS(ARM/ThumbProcdureCallStandard)3.4ARM與C語言混合編程交互規(guī)則:寄存器規(guī)則:R4-R11用來保存局部變量堆棧規(guī)則:FD類型(滿遞減)堆棧參數(shù)傳遞規(guī)則:如果參數(shù)個數(shù)小于等于4,用R0-R3保存參數(shù);參數(shù)個數(shù)多于4的情況下,剩余的參數(shù)傳入堆棧子程序結果返回規(guī)則:結果為一個32位整數(shù),通過R0返回;結果為一個64位整數(shù),通過R0、R1返回;對于位數(shù)更多的結果,通過內存?zhèn)鬟f。參數(shù)傳遞參數(shù)個數(shù)多于4的情況下,剩余的參數(shù)傳入堆棧

3.5BootLoader3.5.1BootLoader的概念3.5.2BootLoader的操作模式3.5.3主要任務與典型結構框架3.5.4Linux的Bootloader(vivi)3.5.1Bootloader的概念BootLoader就是在操作系統(tǒng)內核運行之前運行的一段小程序。通過它,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調用操作系統(tǒng)內核準備好正確的環(huán)境。3.5.1Bootloader的概念系統(tǒng)加電或復位后,所有的處理器通常都從某個預先安排的地址上取指令。比如,ARM在復位時從地址0x0取指。BootLoader是最先被系統(tǒng)執(zhí)行的程序3.5.1Bootloader的概念3.5.2BootLoader的操作模式大多數(shù)BootLoader都包含兩種不同的操作模式:啟動加載模式下載模式3.5.2BootLoader的操作模式啟動加載模式BootLoader從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產品發(fā)布的時侯,BootLoader顯然必須工作在這種模式下。3.5.2BootLoader的操作模式下載模式在下載模式下,目標機上的BootLoader將通過串口連接或網絡連接等通信手段從主機下載文件,如:下載內核映像和根文件系統(tǒng)映像等這種模式通常在第一次安裝內核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。3.5.2BootLoader的操作模式主機和目標機之間一般通過串口建立連接,BootLoader軟件在執(zhí)行時通常會通

溫馨提示

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

評論

0/150

提交評論