版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式系統(tǒng)導(dǎo)論主講教師:第3章Thumb指令系統(tǒng)本章內(nèi)容提要3.1ARM指令集和Thumb指令集3.2統(tǒng)一匯編語(yǔ)言UAL3.3數(shù)據(jù)尋址3.4常用指令3.5STM32啟動(dòng)代碼3.6開發(fā)工具M(jìn)DK3.132位ARM指令和16位Thumb指令傳統(tǒng)的ARM處理器具有兩種指令執(zhí)行狀態(tài)32位ARM狀態(tài):所有32位指令,以獲得高性能16位Thumb狀態(tài):僅16位指令,以提高代碼密度很多應(yīng)用程序混合使用ARM和Thumb代碼ARM和Thumb指令的轉(zhuǎn)換需要進(jìn)行狀態(tài)切換帶來(lái)執(zhí)行時(shí)間和代碼數(shù)量的額外開銷增加軟件編譯的復(fù)雜度沒有經(jīng)驗(yàn)的開發(fā)人員很難進(jìn)行軟件優(yōu)化32、16位指令是指令字長(zhǎng)是32、16位Thumb-2技術(shù)Cortex-M系列處理器的指令系統(tǒng)被稱為Thumb包括16位Thumb指令和新的32位Thumb指令Cortex-M3/M4使用Thumb-2技術(shù)允許混合16和32位Thumb指令,無(wú)需狀態(tài)切換簡(jiǎn)化軟件開發(fā),提高代碼密度、效率和性能不支持32位ARM指令導(dǎo)致Cortex-M3無(wú)法向后兼容傳統(tǒng)的ARM處理器不過(guò)Cortex-M3完全支持原來(lái)16位Thumb指令大多數(shù)程序使用C語(yǔ)言開發(fā),轉(zhuǎn)換比較簡(jiǎn)單Thumb指令系統(tǒng)ARM指令集的發(fā)展動(dòng)態(tài)編譯器支持VFPv3NEONThumb-2(可選)Thumb-2(標(biāo)配)TrustZoneSIMDVFPv2Jazelle僅Thumb-2ARMv5ARMv6ARMv7A&RARMv7M3.2統(tǒng)一匯編語(yǔ)言UALUAL(Unifiedassemblylanguage)ARM和Thumb指令的通用匯編語(yǔ)言語(yǔ)法過(guò)去的語(yǔ)法被稱為:pre-UAL最新的ARM軟件開發(fā)工具已經(jīng)支持UALPre-UAL目前仍被大多數(shù)開發(fā)工具接受KeilMDK-ARM中,指示符THUMB ;使用UAL語(yǔ)法的Thumb指令CODE16 ;使用pre-UAL語(yǔ)法的Thumb指令A(yù)RM匯編程序的語(yǔ)句格式symbolmnemonicoperand1,operand2,... ;Comments標(biāo)識(shí)符助記符操作數(shù)1,操作數(shù)2,... ;注釋標(biāo)識(shí)符symbol必須起始于第一列(頂格)所有指令不能頂格書寫標(biāo)號(hào)等標(biāo)識(shí)符大小寫敏感指令、寄存器可全大寫、全小寫,不要大小寫混用匯編語(yǔ)言的程序結(jié)構(gòu)代碼區(qū):定義指令代碼序列匯編后被保存在代碼(CODE)存儲(chǔ)器數(shù)據(jù)區(qū):聲明使用的數(shù)據(jù),還可以提供初始值或常量匯編后在數(shù)據(jù)(DATA)存儲(chǔ)器預(yù)留空間(初值)系統(tǒng)堆棧:在存儲(chǔ)器中保留空間、設(shè)置棧指針SP區(qū)域指示符AREA定義存儲(chǔ)區(qū)段(section):代碼區(qū)或數(shù)據(jù)區(qū)區(qū)段名可以使用兩個(gè)垂線字符括起類型:code(代碼)、data(數(shù)據(jù))屬性主要是一些選項(xiàng):readonly:只讀(CODE區(qū)段的默認(rèn)屬性)readwrite:可讀可寫(DATA區(qū)段的默認(rèn)屬性)align=n:地址對(duì)齊2n分配,n=0~31noinit:說(shuō)明DATA區(qū)段沒有初始值或初始值為0AREA區(qū)段名{,類型}{,屬性}... ;區(qū)段內(nèi)容,指令或數(shù)據(jù)定義過(guò)程指示符PROC/ENDP(FUNCTION/ENDFUNC)定義過(guò)程結(jié)構(gòu)(函數(shù)、子程序)可選{reglist1}是過(guò)程要保護(hù)的寄存器列表過(guò)程名 PROC[{reglist1}] ;開始
... ;過(guò)程體(指令序列)
ENDP ;結(jié)束AREAmysect,CODE,readonly,align=2MyFunctPROC ... ENDP起始執(zhí)行指示符 ENTRY ... ;第一條執(zhí)行的指令 ... END ;匯編語(yǔ)言程序結(jié)束匯編結(jié)束指示符地址對(duì)齊指示符 ALIGN{expr}不帶參數(shù)設(shè)置當(dāng)前位置是下一個(gè)字(4個(gè)字節(jié))邊界帶參數(shù)expr對(duì)齊expr字節(jié)邊界expr是2冪次方的值,例如2、4、8、……由于ARM處理器大多數(shù)情況下都要求對(duì)齊地址邊界操作,所以經(jīng)常需要使用ALIGN指令以保證數(shù)據(jù)和代碼對(duì)齊了適合的地址邊界預(yù)留存儲(chǔ)器空間指示符SPACE偽指令預(yù)留內(nèi)容是0的存儲(chǔ)空間SPACE可以使用“%”替代FILL偽指令預(yù)留內(nèi)容是value值的存儲(chǔ)空間label是可選的標(biāo)號(hào)expr是分配存儲(chǔ)器空間的大小(字節(jié)為單位)value在存儲(chǔ)空間預(yù)留的值,無(wú)表示是0valuesize是value的字節(jié)數(shù)(1、2或4), 無(wú)表示是1{label}SPACEexpr{label}FILLexpr{,value{,valuesize}}數(shù)據(jù)定義指示符DC(DefineConstant),在存儲(chǔ)單元定義固定初值數(shù)據(jù)區(qū)域分配的靜態(tài)數(shù)據(jù),類似共享變量DCB/DCW/DCD/DCQ依次以1/2/4/8字節(jié)分配空間賦初值expr(可以是多個(gè)數(shù)值)DCB的初值expr還可以是括起的字符串沒有U選項(xiàng),則要求相應(yīng)地址對(duì)齊U選項(xiàng)不要求地址對(duì)齊,但有風(fēng)險(xiǎn)、慎用{label}DCBexpr{,expr}{label}DCW{U}expr{,expr}{label}DCD{U}expr{,expr}{label}DCQ{U}expr{,expr}常量表達(dá)十六進(jìn)制數(shù)像C語(yǔ)言一樣使用0x前綴字符用單引號(hào),字符串用雙引號(hào)字符和字符串中都可以是C語(yǔ)言標(biāo)準(zhǔn)的轉(zhuǎn)義符布爾常量 邏輯真→{TRUE},邏輯假→{FALSE}符號(hào)常量聲明使用等價(jià)EQU指示符
STACK_TOPEQU0x00000400指令中,常量要使用“#”作為前導(dǎo)字母
MOVR0,#0x12 ;R0=0x12立即數(shù)尋址
MOVR0,#0x12 ;R0=0x12在16位Thumb指令中,立即數(shù)只能是8位數(shù)據(jù)32位指令MOVW的立即數(shù)超過(guò)8位、不超過(guò)16位32位指令編碼無(wú)法直接表達(dá)32位立即數(shù):
MOVR5,#0X1FF400 ;=>AssemblyERRORUAL語(yǔ)法支持MOV32偽指令: MOV32{cond}Rd,expr ;一般格式 MOV32R5,#0X1FF400 ;示例MOV32偽指令實(shí)質(zhì)是使用MOV和MOVT指令組合32位數(shù)據(jù)的賦值:使用偽指令LDR
LDRRi,=val ;一般格式
LDRR5,=0X1FF400 ;示例實(shí)際上,這里沒有立即數(shù),而是類似:
LDRR5,[PC,#18] ;從[PC+18]獲得數(shù)據(jù)數(shù)據(jù)保存在被匯編程序事先創(chuàng)建的存儲(chǔ)區(qū)域(假設(shè)是當(dāng)前PC的偏移位置18處)該偽指令也用于獲得指針(變量地址) MOVRi,#val ;實(shí)際生成的MOV指令
LDRRi,[PC,#n] ;或者生成的LDR指令3.3數(shù)據(jù)尋址立即數(shù)尋址:從指令的機(jī)器代碼中獲得數(shù)據(jù)數(shù)據(jù)本身直接編碼在指令的機(jī)器代碼中,指令執(zhí)行時(shí)可以立即從機(jī)器代碼中獲得立即數(shù)多以常量形式表達(dá),用井號(hào)“#”作為前導(dǎo)寄存器尋址:從處理器的寄存器中訪問(wèn)數(shù)據(jù)存儲(chǔ)器尋址:從主存儲(chǔ)器中訪問(wèn)數(shù)據(jù)寄存器尋址通用寄存器13個(gè):R0~R12R13(SP)和R14(LR)多數(shù)情況下也可以使用但由于他們的特定含義和作用,要小心使用R15(PC),大多數(shù)指令不能使用它因?yàn)樗鼘⒏淖兂绦蛄鞒獭⒎浅NkU(xiǎn)改變流程,應(yīng)該使用跳轉(zhuǎn)指令(B、BL、BX等)寄存器移位尋址ARM和Thumb-2指令的特有尋址方法對(duì)第3個(gè)寄存器操作數(shù)實(shí)現(xiàn)移位操作移位(shift)操作有5種LSL(LogicalShiftLeft),邏輯左移LSR(LogicalShiftRight),邏輯右移ASR(ArithmeticShiftRight),算術(shù)右移ROR(RotateRight),循環(huán)右移RRX(RotateRighteXtended),循環(huán)右移擴(kuò)展即帶進(jìn)位標(biāo)志的右移 ANDR0,R1,R2,LSL#3 ;R0←R1&(R2<<3)寄存器移位尋址的MOV指令只有移位、沒有其他操作的MOV指令寄存器在UAL語(yǔ)法中,直接使用移位關(guān)鍵字為助記符寄存器移位尋址的MOV指令UAL語(yǔ)法MOVRd,Rn,LSLshiftMOVRd,Rn,LSRshiftMOVRd,Rn,ASRshiftMOVRd,Rn,RORshiftMOVRd,Rn,RRXLSLRd,Rn,shiftLSRRd,Rn,shiftASRRd,Rn,shiftRORRd,Rn,shiftRRXRd,Rn訪問(wèn)(存?。┐鎯?chǔ)器操作數(shù)RISC處理器采用Load-Store結(jié)構(gòu)存儲(chǔ)器操作指令只有兩種讀取存儲(chǔ)器操作數(shù)LoadtoRegister
LDRRi,{expr}存儲(chǔ)存儲(chǔ)器操作數(shù)StorefromRegister
STRRi,{expr}操作數(shù)expr有多種形式(尋址方式)存儲(chǔ)器操作數(shù)的寄存器間接尋址
LDRRi,[Rj] ;Ri=[Rj]expr是“[Rj]”形式存儲(chǔ)器地址保存在某個(gè)通用寄存器中ARM不支持直接尋址Indirectaddressing存儲(chǔ)器操作數(shù)的寄存器偏移尋址LDRRi,[Rj,#offset] ;①Ri=[Rj+offset]LDRRi,[Rj,Rk] ;②Ri=[Rj+Rk]LDRRi,[Rj,Rkshift#n] ;③Ri=[Rj+(Rkshift#n)]存儲(chǔ)器地址由通用寄存器內(nèi)容加上一個(gè)位移量(Displacement)、也稱偏移量(Offset)組成位移量可以來(lái)自①立即數(shù)(通常在4KB范圍內(nèi))②寄存器③寄存器移位(LSL、LSR、ASR、ROR、RRX)Indirectaddressingwithdisplacement存儲(chǔ)器操作數(shù)的寄存器后偏移尋址
LDRRi,[Rj],#offset ;Ri=[Rj],Rj=Rj+offset
LDRRi,[Rj],Rk ;Ri=[Rj],Rj=Rj+Rk
LDRRi,[Rj],Rkshift#n ;Ri=[Rj],Rj=Rj+(Rkshift#n)這種尋址方式的指令具有兩個(gè)功能:先用[Rj]間接尋址訪問(wèn)存儲(chǔ)器內(nèi)容賦值Ri之后將Rj加上位移量更新Rj的地址Indirectaddressingwithpost-displacement存儲(chǔ)器操作數(shù)的寄存器前偏移尋址
LDRRi,[Rj,#offset]! ;Rj=Rj+offset,Ri=[Rj]
LDRRi,[Rj,Rk]! ;Rj=Rj+Rk,Ri=[Rj]
LDRRi,[Rj,Rkshift#n]! ;Rj=Rj+(Rkshift#n),Ri=[Rj]這種尋址方式的指令具有兩個(gè)功能:先將Rj加上位移量更新Rj的地址然后用[Rj]間接尋址訪問(wèn)存儲(chǔ)器內(nèi)容賦值RiIndirectaddressingwithpre-displacement3.4Cortex-M3的指令系統(tǒng)存儲(chǔ)器訪問(wèn)指令,批量32位數(shù)據(jù)傳輸指令通用數(shù)據(jù)處理加減運(yùn)算、邏輯運(yùn)算以及硬件除法等指令乘法指令飽和運(yùn)算指令位操作指令跳轉(zhuǎn)、條件分支和功能調(diào)用指令系統(tǒng)控制、操作系統(tǒng)支持等指令A(yù)RM處理器的指令格式花括號(hào)“{}”表示可選opcode指令操作碼:使用助記符表示Rd目的寄存器存儲(chǔ)器讀(除批量讀)指令,是讀入數(shù)據(jù)的寄存器存儲(chǔ)器寫(除批量存)指令,該寄存器內(nèi)容寫入存儲(chǔ)器Rn(第1個(gè)源操作數(shù))寄存器{,operand2}第2個(gè)源操作數(shù)非存儲(chǔ)器訪問(wèn)指令支持寄存器移位尋址存儲(chǔ)器訪問(wèn)指令支持間接、偏移和前偏移、后偏移尋址opcode{S}{cond}Rd,Rn{,operand2}S后綴:更新APSR沒有S后綴:不影響APSR中的標(biāo)志有S后綴:更新APSR內(nèi)容opcode{S}{cond}Rd,Rn{,operand2}313029282726:252415:108:0NZCVQICI/ITTICI/IT異常號(hào)APSREPSRIPSRPSR或xPSR應(yīng)用程序狀態(tài)寄存器APSRN(Negative)負(fù)數(shù)標(biāo)志有符號(hào)整數(shù)的結(jié)果是負(fù)數(shù)設(shè)置N標(biāo)志為1結(jié)果是正數(shù)或0設(shè)置N標(biāo)志為0Z(Zero)零標(biāo)志執(zhí)行結(jié)果是0(兩數(shù)比較相等)設(shè)置為1,否則為0C(Carry)進(jìn)位標(biāo)志對(duì)無(wú)符號(hào)相加,無(wú)符號(hào)溢出(進(jìn)位)設(shè)置為1對(duì)無(wú)符號(hào)相減,結(jié)果沒有借位設(shè)置為1,借位為0V(Overflow)溢出標(biāo)志對(duì)有符號(hào)整數(shù)加減,當(dāng)有符號(hào)溢出時(shí)設(shè)置為1ApplicationProgramStatusRegister{cond}后綴:條件執(zhí)行沒有cond后綴:總是執(zhí)行有cond后綴:條件成立,執(zhí)行條件不成立,不執(zhí)行opcode{S}{cond}Rd,Rn{,operand2}這樣,大多數(shù)指令都成了條件執(zhí)行指令條件cond后綴標(biāo)志含義EQZ=1Equal,相等NEZ=0NotEqual,不相等MIN=1Minus,負(fù)數(shù)PLN=0Plus,正數(shù)VSV=1oVerflowSet,溢出VCV=0oVerflowClear,未溢出CSHSC=1CarrySet,進(jìn)位HigherorSame,高于或等于CCLOC=0ClearCarry,無(wú)進(jìn)位Lower,低于條件cond(續(xù))后綴標(biāo)志含義HIC=1ANDZ=0unsignedHigher,無(wú)符號(hào)高于LSC=0ORZ=1unsignedLowerorSame,無(wú)符號(hào)低于或等于GEN=VsignedGreaterthanorEqual,有符號(hào)大于或等于LTN≠VsignedLessThan,有符號(hào)小于GTZ=0ANDN=VsignedGreaterThan,有符號(hào)大于LEZ=1ORN≠VsignedLessthanorEqual,有符號(hào)小于或等于處理器內(nèi)的傳送指令寄存器之間傳送、傳送立即數(shù)到寄存器
MOV{S}{cond}Rd,Operand2 ;寄存器傳送
MOV{cond}Rd,#imm16 ;立即數(shù)傳送
MVN{S}{cond}Rd,Operand2 ;源操作數(shù)取反后傳送給目的寄存器(取反)專用寄存器與通用寄存器之間傳送
MRS{cond}Rd,spec_reg ;專用寄存器讀取
MSR{cond}spec_reg,Rn ;專用寄存器寫入存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器讀寫
LDR{cond}Rd,Rn,Operand2 ;存儲(chǔ)器讀
STR{cond}Rd,Rn,Operand2 ;存儲(chǔ)器寫存儲(chǔ)器批量讀寫
LDM{cond}Rn{!},reglist ;存儲(chǔ)器批量讀
STM{cond}Rn{!},reglist ;存儲(chǔ)器批量寫堆棧操作指令
PUSH{cond}reglist
POP{cond}reglist生成相對(duì)PC的地址
ADR{cond}Rd,label ;Rd=label的地址label是標(biāo)號(hào)匯編程序也支持label加減一個(gè)數(shù)字或者[PC,#number]形式加減運(yùn)算、邏輯運(yùn)算指令A(yù)DD(加法)、ADC(帶進(jìn)位加法)SUB(減法)、SBC(帶進(jìn)位減法)RSB(反轉(zhuǎn)減法,ReverseSubtract)
oprand2–Rn→RdAND(邏輯與)、ORR(邏輯或)、EOR(邏輯異或)BIC(邏輯與非,operand2求反后與Rn相邏輯與)ORN(邏輯或非,operand2求反后與Rn相邏輯或)op{S}{cond}{Rd,}Rn,Operand2
;Rnopoprand2→Rdop{cond}{Rd,}Rn,#imm12;僅ADD和SUB比較測(cè)試指令 CMP{cond}Rn,Operand2 ;Rn-oprand2,類似SUBS、但不保存結(jié)果
CMN{cond}Rn,Operand2;Rn+oprand2,類似ADDS、但不保存結(jié)果
TST{cond}Rn,Operand2;Rn與oprand2,類似ANDS、但不保存結(jié)果
TEQ{cond}Rn,Operand2 ;Rn異或oprand2,類似EORS、但不保存結(jié)果移位指令 op{S}{cond}Rd,Rm,Rs op{S}{cond}Rd,Rm,#n RRX{S}{cond}Rd,Rm操作碼op指邏輯左移LSL、邏輯右移LSR算術(shù)右移ASR、循環(huán)右移RORRs指保存移位位數(shù)的寄存器,只用最低字節(jié)n是移位位數(shù)乘除法指令
MUL{S}{cond}{Rd,}Rn,Rm ;乘法:Rd=(Rn×Rm)低32位
MLA{cond}Rd,Rn,Rm,Ra ;乘加:Rd=(Rn×Rm)低32位+Ra
MLS{cond}Rd,Rn,Rm,Ra ;乘減:Rd=Ra–(Rn×Rm)低32位
SDIV{cond}{Rd,}Rn,Rm ;有符號(hào)數(shù)除法:Rd=Rn÷Rm
UDIV{cond}{Rd,}Rn,Rm ;無(wú)符號(hào)數(shù)除法:Rd=Rn÷Rm長(zhǎng)乘法指令 UMULL{cond}RdLo,RdHi,Rn,Rm;無(wú)符號(hào)數(shù)64位長(zhǎng)乘法:(RdHi,RdLo)=Rn×Rm
SMULL{cond}RdLo,RdHi,Rn,Rm;有符號(hào)數(shù)64位長(zhǎng)乘法:(RdHi,RdLo)=Rn×Rm
UMLAL{cond}RdLo,RdHi,Rn,Rm;無(wú)符號(hào)數(shù)64位長(zhǎng)乘加:
(RdHi,RdLo)=(RdHi,RdLo)+Rn×Rm SMLAL{cond}RdLo,RdHi,Rn,Rm;有符號(hào)數(shù)64位長(zhǎng)乘加:
(RdHi,RdLo)=(RdHi,RdLo)+Rn×Rm跳轉(zhuǎn)調(diào)用指令
B{cond}label ;跳轉(zhuǎn)到label
BL{cond}label ;跳轉(zhuǎn)并連接到label ;調(diào)用label子程序(下條指令地址存入R14)
BX{cond}Rm ;跳轉(zhuǎn)到Rm指定的地址
;子程序返回一般用“BXLR“指令
BLX{cond}Rm ;調(diào)用Rm指定地址的子程序 (下條指令地址存入R14)分支指令
CBZRn,label ;Rn等于0跳轉(zhuǎn)到Label
CBNZRn,label ;Rn不等于0跳轉(zhuǎn)到Label
IT{x{y{z}}}cond ;分支(If-Then)條件指令
;cond說(shuō)明IT塊中第1條指令執(zhí)行的條件
;x、y和z依次說(shuō)明IT塊中第2、3和4條指令執(zhí)行的條件開關(guān)T或E:
;如果是T(Then)表示條件成立執(zhí)行
;否則是E(Else)表示條件不成立執(zhí)行。其他指令
NOP{cond} ;空操作指令
BKPT#imm ;斷點(diǎn)(Breakpoint)指令
;引起處理器進(jìn)入調(diào)試狀態(tài)
SVC{cond}#imm ;引起管理員調(diào)用SVC ;(SupervisorCall)異常
WFI{cond} ;等待中斷WaitForInterrupt ;暫停執(zhí)行直到非屏蔽中斷產(chǎn)生并響應(yīng)、
;被PRIMASK屏蔽的中斷被掛起(pending)、
;或者有調(diào)試(DebugEntry)請(qǐng)求3.5STM32啟動(dòng)代碼(StartupCode)用來(lái)初始化硬件電路為高級(jí)語(yǔ)言編寫的應(yīng)用程序做好運(yùn)行前準(zhǔn)備通常采用匯編語(yǔ)言編寫是處理器上電復(fù)位時(shí)的程序運(yùn)行入口點(diǎn)啟動(dòng)代碼與使用的處理器和硬件設(shè)備有關(guān)過(guò)程大致相同,主要是:堆和棧的定義及初始化異常(中斷)向量表的建立提供默認(rèn)異常(中斷)處理程序調(diào)用函數(shù)配置時(shí)鐘系統(tǒng)最終轉(zhuǎn)向main函數(shù)開始執(zhí)行應(yīng)用程序Cortex-M3啟動(dòng)方式通過(guò)boot引腳設(shè)置,有3種啟動(dòng)方式方式1:SRAM區(qū)中斷向量表定位于SRAM區(qū)起始地址和PC指針是0x20000000方式2:Flash區(qū)中斷向量表定位于Flash區(qū)起始地址和PC指針是0x80000000方式3:Bootloader區(qū)中斷向量表定位于內(nèi)置Bootloader區(qū)起始地址必須存放棧頂指針第2個(gè)地址必須存放復(fù)位入口地址STM32啟動(dòng)代碼文件在STM32庫(kù)V3.5.0中,啟動(dòng)代碼的文件名是startup_stm32f10x_??.s“??”表示不同類型STM32微控制器例如,“xl”,指超高密度容量的微控制器芯片啟動(dòng)代碼基本一樣,分成4個(gè)片段:(1)定義堆和棧的大?。?)定義中斷向量表(3)默認(rèn)的中斷處理程序(4)用戶初始化堆和棧分析startup_stm32f10x_hd.sSTM32啟動(dòng)代碼1:定義堆和棧的大小Stack_SizeEQU0x00000400 ;棧大小為0x400
AREASTACK,NOINIT,READWRITE,ALIGN=3 ;定義棧STACK,未初始化、可讀可寫、8字節(jié)對(duì)齊Stack_MemSPACEStack_Size ;為棧分配空間__initial_sp ;棧地址標(biāo)號(hào)Heap_SizeEQU0x00000200 ;堆大小為0x200
AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_base ;堆基地址標(biāo)號(hào)Heap_MemSPACEHeap_Size ;為堆分配空間__heap_limit ;堆容量地址標(biāo)號(hào)
PRESERVE8 ;指定當(dāng)前堆棧8字節(jié)對(duì)齊
THUMB ;使用32位Thumb指令、支持UAL匯編語(yǔ)言STM32啟動(dòng)代碼2:定義中斷向量表
AREARESET,DATA,READONLY ;定義復(fù)位(RESET)區(qū)、數(shù)據(jù)段,只讀
EXPORT__Vectors
;中斷向量地址(程序地址)
EXPORT__Vectors_End
EXPORT__Vectors_Size
;EXPORT定義全局標(biāo)號(hào),表示可在其他文件中使用__Vectors DCD__initial_sp ;地址0x00保存堆棧指針
DCDReset_Handler ;地址0x04保存復(fù)位地址
DCDNMI_Handler ;地址0x08保存非屏蔽地址
…… ;略(所有中斷向量地址)STM32啟動(dòng)代碼3:默認(rèn)中斷處理程序
AREA|.text|,CODE,READONLY
;代碼段、只讀Reset_HandlerPROC ;復(fù)位處理程序
EXPORTReset_Handler[WEAK] ;[WEAK]選項(xiàng):若其他文件也定義該標(biāo)號(hào)(函數(shù)) ;連接時(shí)使用其他文件的地址;否則以此處地址連接
IMPORT__main IMPORTSystemInit ;IMPORT表示標(biāo)號(hào)在其他文件中定義
STM32啟動(dòng)代碼3:默認(rèn)中斷處理程序(續(xù)1) LDRR0,=SystemInit ;把SystemInit的地址給RO
BLXR0 ;調(diào)用SystemInit,初始化STM32的時(shí)鐘系統(tǒng)
LDRR0,=__main ;把__main的地址給RO
BXR0 ;跳轉(zhuǎn)到__main標(biāo)號(hào)
ENDP注1:SystemInit定義在system_stm32f10x.c中注2:__main指向C/C++初始化子程序(初始化堆和棧等),最后跳轉(zhuǎn)到C語(yǔ)言程序的main函數(shù)STM32啟動(dòng)代碼3:默認(rèn)中斷處理程序(續(xù)2) ;默認(rèn)異常(中斷)處理程序(無(wú)限循環(huán)、可被修改)NMI_HandlerPROC ;NMI處理程序
EXPORTNMI_Handler[WEAK] B. ;“.”代表當(dāng)前指令地址 ;“B
.”類似C語(yǔ)言的while(1)語(yǔ)句,無(wú)限循環(huán)
ENDP …… ;略
ALIGN ;按照要求進(jìn)行對(duì)齊注3:V3.5.0前啟動(dòng)代碼沒有調(diào)用SystemInit,需要用戶在應(yīng)用程序主函數(shù)main中首先調(diào)用STM32啟動(dòng)代碼4:用戶初始化堆和棧
IF:DEF:__MICROLIB ;如果定義了__MICROLIB則為真,否則為假
EXPORT__initial_sp ;為真,讓外部文件使用定義的堆和棧地址
EXPORT__heap_base EXPORT__heap_limitMicroLib是為基于ARM嵌入式應(yīng)用編寫的一個(gè)高度優(yōu)化的C語(yǔ)言庫(kù),提供了更緊湊的代碼大小、可應(yīng)用于無(wú)操作系統(tǒng)支持的情況,不支持文件I/O和寬字符、有些函數(shù)速度略慢MicroLib的選擇(目標(biāo)選項(xiàng))STM32啟動(dòng)代碼4:用戶初始化堆和棧(續(xù))
ELSE
;為假,使用默認(rèn)的C語(yǔ)言運(yùn)行庫(kù)
IMPORT__use_two_region_memory EXPORT__user_initial_stackheap__user_initial_stackheap LDRR0,=Heap_Mem ;堆起始地址
LDRR1,=(Stack_Mem+Stack_Size) ;棧大小
LDRR2,=(Heap_Mem+Heap_Size) ;堆大小
LDRR3,=Stack_Mem ;棧頂指針
BXLR ALIGN ENDIF END3.6開發(fā)工具M(jìn)DK-ARM流行的Cortex-M處理器商業(yè)開發(fā)平臺(tái)包括各種組件:μVision集成開發(fā)環(huán)境(IDE)ARM編譯工具(C/C++編譯器、匯編器、連接器等)調(diào)試器和模擬器RTX實(shí)時(shí)操作系統(tǒng)核心超過(guò)1000個(gè)微控制器的參考啟動(dòng)代碼Flash編程算法程序示例KeilMicrocontrollerDevelopmentKitforARM基于MDK的一般開發(fā)流程μVision集成界面MDK安裝目錄MDK-ARM5安裝的Keil目錄UV4子目錄(μVision5的文件)ARM子目錄(主要文件)ARMCC\bin是主要的程序文件armcc.exe:C/C++編譯程序armasm.exe:匯編程序armlink.exe:連接程序fromelf.exe:下載生成程序BIN是動(dòng)態(tài)鏈接庫(kù)DLLHlp保存各種幫助文件Pack驅(qū)動(dòng)程序包(庫(kù))的目錄軟件包程序目錄Pack目錄(驅(qū)動(dòng)程序文件)ARM是ARM公司的基本驅(qū)動(dòng)程序Keil保存有ST公司的驅(qū)動(dòng)程序 含啟動(dòng)代碼文件、外設(shè)驅(qū)動(dòng)程序的頭文件和源程序文件等……創(chuàng)建應(yīng)用程序1.新建項(xiàng)目:Project–NewμVisionProject選擇或新建一個(gè)目錄,輸入項(xiàng)目文件名選擇目標(biāo)微控制器(ST公司的STM32F103ZE)根據(jù)項(xiàng)目需求,選擇相應(yīng)的驅(qū)動(dòng)程序修改目標(biāo)名、組名,或增加新組創(chuàng)建應(yīng)用程序2.新建源程序文件:File–New編輯源程序代碼、保存文件加入項(xiàng)目(AddExistingFilestoGroup)intmain(){}創(chuàng)建應(yīng)用程序3.構(gòu)建應(yīng)用程序:Project–BuildTarget編譯、匯編和連接4.調(diào)試應(yīng)用程序:
Debug–Start/StopDebugSession目標(biāo)選項(xiàng)的調(diào)試配置:OptionforTarget使用模擬器UseSimulator啟動(dòng)時(shí)載入應(yīng)用程序
LoadAplicationatStartup運(yùn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考地理一輪復(fù)習(xí)第三章地球上的大氣及其運(yùn)動(dòng)第三節(jié)常見天氣系統(tǒng)課件
- 新課改課件模板
- 2023年國(guó)家公務(wù)員錄用考試《行測(cè)》真題(地市級(jí))及答案解析
- 2024年湖南省中考英語(yǔ)真題卷及答案解析
- 動(dòng)畫設(shè)置 課件
- 幼兒園小班歌曲《大西瓜》課件
- 西京學(xué)院《景觀小品設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《機(jī)械制造技術(shù)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《工程創(chuàng)新設(shè)計(jì)電氣控制》2021-2022學(xué)年期末試卷
- 西京學(xué)院《電力工程基礎(chǔ)》2022-2023學(xué)年期末試卷
- 《肺功能檢測(cè)》課件
- 安全文明施工措施費(fèi)用檢查表
- 鋼渣熱悶工藝規(guī)程及人員崗位職責(zé)
- 2022小說(shuō)精讀批注海明威小說(shuō)《一天的等待》附閱讀試題答案解析
- 四肢骨折及相關(guān)護(hù)理課件
- 二、邏輯門 課件(17張幻燈片)
- 一年級(jí)家訪記錄表(常用)
- 新媒體背景下的輿情引導(dǎo)和危機(jī)應(yīng)對(duì)專題培訓(xùn)課件
- 反邪教知識(shí)競(jìng)賽試題題庫(kù)
- TCVN-2622-越南建筑防火規(guī)范(中文版)
- DIN30213德標(biāo)法蘭翻譯
評(píng)論
0/150
提交評(píng)論