嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論03_第1頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論03_第2頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論03_第3頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論03_第4頁
嵌入式系統(tǒng)導(dǎo)論(第2版)-教學(xué)課件 嵌入式導(dǎo)論03_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式系統(tǒng)導(dǎo)論主講教師:第3章Thumb指令系統(tǒng)本章內(nèi)容提要3.1ARM指令集和Thumb指令集3.2統(tǒng)一匯編語言UAL3.3數(shù)據(jù)尋址3.4常用指令3.5STM32啟動代碼3.6開發(fā)工具MDK3.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)換需要進行狀態(tài)切換帶來執(zhí)行時間和代碼數(shù)量的額外開銷增加軟件編譯的復(fù)雜度沒有經(jīng)驗的開發(fā)人員很難進行軟件優(yōu)化32、16位指令是指令字長是32、16位Thumb-2技術(shù)Cortex-M系列處理器的指令系統(tǒng)被稱為Thumb包括16位Thumb指令和新的32位Thumb指令Cortex-M3/M4使用Thumb-2技術(shù)允許混合16和32位Thumb指令,無需狀態(tài)切換簡化軟件開發(fā),提高代碼密度、效率和性能不支持32位ARM指令導(dǎo)致Cortex-M3無法向后兼容傳統(tǒng)的ARM處理器不過Cortex-M3完全支持原來16位Thumb指令大多數(shù)程序使用C語言開發(fā),轉(zhuǎn)換比較簡單Thumb指令系統(tǒng)ARM指令集的發(fā)展動態(tài)編譯器支持VFPv3NEONThumb-2(可選)Thumb-2(標(biāo)配)TrustZoneSIMDVFPv2Jazelle僅Thumb-2ARMv5ARMv6ARMv7A&RARMv7M3.2統(tǒng)一匯編語言UALUAL(Unifiedassemblylanguage)ARM和Thumb指令的通用匯編語言語法過去的語法被稱為:pre-UAL最新的ARM軟件開發(fā)工具已經(jīng)支持UALPre-UAL目前仍被大多數(shù)開發(fā)工具接受KeilMDK-ARM中,指示符THUMB ;使用UAL語法的Thumb指令CODE16 ;使用pre-UAL語法的Thumb指令A(yù)RM匯編程序的語句格式symbolmnemonicoperand1,operand2,... ;Comments標(biāo)識符助記符操作數(shù)1,操作數(shù)2,... ;注釋標(biāo)識符symbol必須起始于第一列(頂格)所有指令不能頂格書寫標(biāo)號等標(biāo)識符大小寫敏感指令、寄存器可全大寫、全小寫,不要大小寫混用匯編語言的程序結(jié)構(gòu)代碼區(qū):定義指令代碼序列匯編后被保存在代碼(CODE)存儲器數(shù)據(jù)區(qū):聲明使用的數(shù)據(jù),還可以提供初始值或常量匯編后在數(shù)據(jù)(DATA)存儲器預(yù)留空間(初值)系統(tǒng)堆棧:在存儲器中保留空間、設(shè)置棧指針SP區(qū)域指示符AREA定義存儲區(qū)段(section):代碼區(qū)或數(shù)據(jù)區(qū)區(qū)段名可以使用兩個垂線字符括起類型:code(代碼)、data(數(shù)據(jù))屬性主要是一些選項:readonly:只讀(CODE區(qū)段的默認屬性)readwrite:可讀可寫(DATA區(qū)段的默認屬性)align=n:地址對齊2n分配,n=0~31noinit:說明DATA區(qū)段沒有初始值或初始值為0AREA區(qū)段名{,類型}{,屬性}... ;區(qū)段內(nèi)容,指令或數(shù)據(jù)定義過程指示符PROC/ENDP(FUNCTION/ENDFUNC)定義過程結(jié)構(gòu)(函數(shù)、子程序)可選{reglist1}是過程要保護的寄存器列表過程名 PROC[{reglist1}] ;開始

... ;過程體(指令序列)

ENDP ;結(jié)束AREAmysect,CODE,readonly,align=2MyFunctPROC ... ENDP起始執(zhí)行指示符 ENTRY ... ;第一條執(zhí)行的指令 ... END ;匯編語言程序結(jié)束匯編結(jié)束指示符地址對齊指示符 ALIGN{expr}不帶參數(shù)設(shè)置當(dāng)前位置是下一個字(4個字節(jié))邊界帶參數(shù)expr對齊expr字節(jié)邊界expr是2冪次方的值,例如2、4、8、……由于ARM處理器大多數(shù)情況下都要求對齊地址邊界操作,所以經(jīng)常需要使用ALIGN指令以保證數(shù)據(jù)和代碼對齊了適合的地址邊界預(yù)留存儲器空間指示符SPACE偽指令預(yù)留內(nèi)容是0的存儲空間SPACE可以使用“%”替代FILL偽指令預(yù)留內(nèi)容是value值的存儲空間label是可選的標(biāo)號expr是分配存儲器空間的大?。ㄗ止?jié)為單位)value在存儲空間預(yù)留的值,無表示是0valuesize是value的字節(jié)數(shù)(1、2或4), 無表示是1{label}SPACEexpr{label}FILLexpr{,value{,valuesize}}數(shù)據(jù)定義指示符DC(DefineConstant),在存儲單元定義固定初值數(shù)據(jù)區(qū)域分配的靜態(tài)數(shù)據(jù),類似共享變量DCB/DCW/DCD/DCQ依次以1/2/4/8字節(jié)分配空間賦初值expr(可以是多個數(shù)值)DCB的初值expr還可以是括起的字符串沒有U選項,則要求相應(yīng)地址對齊U選項不要求地址對齊,但有風(fēng)險、慎用{label}DCBexpr{,expr}{label}DCW{U}expr{,expr}{label}DCD{U}expr{,expr}{label}DCQ{U}expr{,expr}常量表達十六進制數(shù)像C語言一樣使用0x前綴字符用單引號,字符串用雙引號字符和字符串中都可以是C語言標(biāo)準的轉(zhuǎn)義符布爾常量 邏輯真→{TRUE},邏輯假→{FALSE}符號常量聲明使用等價EQU指示符

STACK_TOPEQU0x00000400指令中,常量要使用“#”作為前導(dǎo)字母

MOVR0,#0x12 ;R0=0x12立即數(shù)尋址

MOVR0,#0x12 ;R0=0x12在16位Thumb指令中,立即數(shù)只能是8位數(shù)據(jù)32位指令MOVW的立即數(shù)超過8位、不超過16位32位指令編碼無法直接表達32位立即數(shù):

MOVR5,#0X1FF400 ;=>AssemblyERRORUAL語法支持MOV32偽指令: MOV32{cond}Rd,expr ;一般格式 MOV32R5,#0X1FF400 ;示例MOV32偽指令實質(zhì)是使用MOV和MOVT指令組合32位數(shù)據(jù)的賦值:使用偽指令LDR

LDRRi,=val ;一般格式

LDRR5,=0X1FF400 ;示例實際上,這里沒有立即數(shù),而是類似:

LDRR5,[PC,#18] ;從[PC+18]獲得數(shù)據(jù)數(shù)據(jù)保存在被匯編程序事先創(chuàng)建的存儲區(qū)域(假設(shè)是當(dāng)前PC的偏移位置18處)該偽指令也用于獲得指針(變量地址) MOVRi,#val ;實際生成的MOV指令

LDRRi,[PC,#n] ;或者生成的LDR指令3.3數(shù)據(jù)尋址立即數(shù)尋址:從指令的機器代碼中獲得數(shù)據(jù)數(shù)據(jù)本身直接編碼在指令的機器代碼中,指令執(zhí)行時可以立即從機器代碼中獲得立即數(shù)多以常量形式表達,用井號“#”作為前導(dǎo)寄存器尋址:從處理器的寄存器中訪問數(shù)據(jù)存儲器尋址:從主存儲器中訪問數(shù)據(jù)寄存器尋址通用寄存器13個:R0~R12R13(SP)和R14(LR)多數(shù)情況下也可以使用但由于他們的特定含義和作用,要小心使用R15(PC),大多數(shù)指令不能使用它因為它將改變程序流程、非常危險改變流程,應(yīng)該使用跳轉(zhuǎn)指令(B、BL、BX等)寄存器移位尋址ARM和Thumb-2指令的特有尋址方法對第3個寄存器操作數(shù)實現(xiàn)移位操作移位(shift)操作有5種LSL(LogicalShiftLeft),邏輯左移LSR(LogicalShiftRight),邏輯右移ASR(ArithmeticShiftRight),算術(shù)右移ROR(RotateRight),循環(huán)右移RRX(RotateRighteXtended),循環(huán)右移擴展即帶進位標(biāo)志的右移 ANDR0,R1,R2,LSL#3 ;R0←R1&(R2<<3)寄存器移位尋址的MOV指令只有移位、沒有其他操作的MOV指令寄存器在UAL語法中,直接使用移位關(guān)鍵字為助記符寄存器移位尋址的MOV指令UAL語法MOVRd,Rn,LSLshiftMOVRd,Rn,LSRshiftMOVRd,Rn,ASRshiftMOVRd,Rn,RORshiftMOVRd,Rn,RRXLSLRd,Rn,shiftLSRRd,Rn,shiftASRRd,Rn,shiftRORRd,Rn,shiftRRXRd,Rn訪問(存取)存儲器操作數(shù)RISC處理器采用Load-Store結(jié)構(gòu)存儲器操作指令只有兩種讀取存儲器操作數(shù)LoadtoRegister

LDRRi,{expr}存儲存儲器操作數(shù)StorefromRegister

STRRi,{expr}操作數(shù)expr有多種形式(尋址方式)存儲器操作數(shù)的寄存器間接尋址

LDRRi,[Rj] ;Ri=[Rj]expr是“[Rj]”形式存儲器地址保存在某個通用寄存器中ARM不支持直接尋址Indirectaddressing存儲器操作數(shù)的寄存器偏移尋址LDRRi,[Rj,#offset] ;①Ri=[Rj+offset]LDRRi,[Rj,Rk] ;②Ri=[Rj+Rk]LDRRi,[Rj,Rkshift#n] ;③Ri=[Rj+(Rkshift#n)]存儲器地址由通用寄存器內(nèi)容加上一個位移量(Displacement)、也稱偏移量(Offset)組成位移量可以來自①立即數(shù)(通常在4KB范圍內(nèi))②寄存器③寄存器移位(LSL、LSR、ASR、ROR、RRX)Indirectaddressingwithdisplacement存儲器操作數(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)這種尋址方式的指令具有兩個功能:先用[Rj]間接尋址訪問存儲器內(nèi)容賦值Ri之后將Rj加上位移量更新Rj的地址Indirectaddressingwithpost-displacement存儲器操作數(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]這種尋址方式的指令具有兩個功能:先將Rj加上位移量更新Rj的地址然后用[Rj]間接尋址訪問存儲器內(nèi)容賦值RiIndirectaddressingwithpre-displacement3.4Cortex-M3的指令系統(tǒng)存儲器訪問指令,批量32位數(shù)據(jù)傳輸指令通用數(shù)據(jù)處理加減運算、邏輯運算以及硬件除法等指令乘法指令飽和運算指令位操作指令跳轉(zhuǎn)、條件分支和功能調(diào)用指令系統(tǒng)控制、操作系統(tǒng)支持等指令A(yù)RM處理器的指令格式花括號“{}”表示可選opcode指令操作碼:使用助記符表示Rd目的寄存器存儲器讀(除批量讀)指令,是讀入數(shù)據(jù)的寄存器存儲器寫(除批量存)指令,該寄存器內(nèi)容寫入存儲器Rn(第1個源操作數(shù))寄存器{,operand2}第2個源操作數(shù)非存儲器訪問指令支持寄存器移位尋址存儲器訪問指令支持間接、偏移和前偏移、后偏移尋址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異常號APSREPSRIPSRPSR或xPSR應(yīng)用程序狀態(tài)寄存器APSRN(Negative)負數(shù)標(biāo)志有符號整數(shù)的結(jié)果是負數(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)進位標(biāo)志對無符號相加,無符號溢出(進位)設(shè)置為1對無符號相減,結(jié)果沒有借位設(shè)置為1,借位為0V(Overflow)溢出標(biāo)志對有符號整數(shù)加減,當(dāng)有符號溢出時設(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,負數(shù)PLN=0Plus,正數(shù)VSV=1oVerflowSet,溢出VCV=0oVerflowClear,未溢出CSHSC=1CarrySet,進位HigherorSame,高于或等于CCLOC=0ClearCarry,無進位Lower,低于條件cond(續(xù))后綴標(biāo)志含義HIC=1ANDZ=0unsignedHigher,無符號高于LSC=0ORZ=1unsignedLowerorSame,無符號低于或等于GEN=VsignedGreaterthanorEqual,有符號大于或等于LTN≠VsignedLessThan,有符號小于GTZ=0ANDN=VsignedGreaterThan,有符號大于LEZ=1ORN≠VsignedLessthanorEqual,有符號小于或等于處理器內(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 ;專用寄存器寫入存儲器訪問指令存儲器讀寫

LDR{cond}Rd,Rn,Operand2 ;存儲器讀

STR{cond}Rd,Rn,Operand2 ;存儲器寫存儲器批量讀寫

LDM{cond}Rn{!},reglist ;存儲器批量讀

STM{cond}Rn{!},reglist ;存儲器批量寫堆棧操作指令

PUSH{cond}reglist

POP{cond}reglist生成相對PC的地址

ADR{cond}Rd,label ;Rd=label的地址label是標(biāo)號匯編程序也支持label加減一個數(shù)字或者[PC,#number]形式加減運算、邏輯運算指令A(yù)DD(加法)、ADC(帶進位加法)SUB(減法)、SBC(帶進位減法)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比較測試指令 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 ;有符號數(shù)除法:Rd=Rn÷Rm

UDIV{cond}{Rd,}Rn,Rm ;無符號數(shù)除法:Rd=Rn÷Rm長乘法指令 UMULL{cond}RdLo,RdHi,Rn,Rm;無符號數(shù)64位長乘法:(RdHi,RdLo)=Rn×Rm

SMULL{cond}RdLo,RdHi,Rn,Rm;有符號數(shù)64位長乘法:(RdHi,RdLo)=Rn×Rm

UMLAL{cond}RdLo,RdHi,Rn,Rm;無符號數(shù)64位長乘加:

(RdHi,RdLo)=(RdHi,RdLo)+Rn×Rm SMLAL{cond}RdLo,RdHi,Rn,Rm;有符號數(shù)64位長乘加:

(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說明IT塊中第1條指令執(zhí)行的條件

;x、y和z依次說明IT塊中第2、3和4條指令執(zhí)行的條件開關(guān)T或E:

;如果是T(Then)表示條件成立執(zhí)行

;否則是E(Else)表示條件不成立執(zhí)行。其他指令

NOP{cond} ;空操作指令

BKPT#imm ;斷點(Breakpoint)指令

;引起處理器進入調(diào)試狀態(tài)

SVC{cond}#imm ;引起管理員調(diào)用SVC ;(SupervisorCall)異常

WFI{cond} ;等待中斷WaitForInterrupt ;暫停執(zhí)行直到非屏蔽中斷產(chǎn)生并響應(yīng)、

;被PRIMASK屏蔽的中斷被掛起(pending)、

;或者有調(diào)試(DebugEntry)請求3.5STM32啟動代碼(StartupCode)用來初始化硬件電路為高級語言編寫的應(yīng)用程序做好運行前準備通常采用匯編語言編寫是處理器上電復(fù)位時的程序運行入口點啟動代碼與使用的處理器和硬件設(shè)備有關(guān)過程大致相同,主要是:堆和棧的定義及初始化異常(中斷)向量表的建立提供默認異常(中斷)處理程序調(diào)用函數(shù)配置時鐘系統(tǒng)最終轉(zhuǎn)向main函數(shù)開始執(zhí)行應(yīng)用程序Cortex-M3啟動方式通過boot引腳設(shè)置,有3種啟動方式方式1:SRAM區(qū)中斷向量表定位于SRAM區(qū)起始地址和PC指針是0x20000000方式2:Flash區(qū)中斷向量表定位于Flash區(qū)起始地址和PC指針是0x80000000方式3:Bootloader區(qū)中斷向量表定位于內(nèi)置Bootloader區(qū)起始地址必須存放棧頂指針第2個地址必須存放復(fù)位入口地址STM32啟動代碼文件在STM32庫V3.5.0中,啟動代碼的文件名是startup_stm32f10x_??.s“??”表示不同類型STM32微控制器例如,“xl”,指超高密度容量的微控制器芯片啟動代碼基本一樣,分成4個片段:(1)定義堆和棧的大?。?)定義中斷向量表(3)默認的中斷處理程序(4)用戶初始化堆和棧分析startup_stm32f10x_hd.sSTM32啟動代碼1:定義堆和棧的大小Stack_SizeEQU0x00000400 ;棧大小為0x400

AREASTACK,NOINIT,READWRITE,ALIGN=3 ;定義棧STACK,未初始化、可讀可寫、8字節(jié)對齊Stack_MemSPACEStack_Size ;為棧分配空間__initial_sp ;棧地址標(biāo)號Heap_SizeEQU0x00000200 ;堆大小為0x200

AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_base ;堆基地址標(biāo)號Heap_MemSPACEHeap_Size ;為堆分配空間__heap_limit ;堆容量地址標(biāo)號

PRESERVE8 ;指定當(dāng)前堆棧8字節(jié)對齊

THUMB ;使用32位Thumb指令、支持UAL匯編語言STM32啟動代碼2:定義中斷向量表

AREARESET,DATA,READONLY ;定義復(fù)位(RESET)區(qū)、數(shù)據(jù)段,只讀

EXPORT__Vectors

;中斷向量地址(程序地址)

EXPORT__Vectors_End

EXPORT__Vectors_Size

;EXPORT定義全局標(biāo)號,表示可在其他文件中使用__Vectors DCD__initial_sp ;地址0x00保存堆棧指針

DCDReset_Handler ;地址0x04保存復(fù)位地址

DCDNMI_Handler ;地址0x08保存非屏蔽地址

…… ;略(所有中斷向量地址)STM32啟動代碼3:默認中斷處理程序

AREA|.text|,CODE,READONLY

;代碼段、只讀Reset_HandlerPROC ;復(fù)位處理程序

EXPORTReset_Handler[WEAK] ;[WEAK]選項:若其他文件也定義該標(biāo)號(函數(shù)) ;連接時使用其他文件的地址;否則以此處地址連接

IMPORT__main IMPORTSystemInit ;IMPORT表示標(biāo)號在其他文件中定義

STM32啟動代碼3:默認中斷處理程序(續(xù)1) LDRR0,=SystemInit ;把SystemInit的地址給RO

BLXR0 ;調(diào)用SystemInit,初始化STM32的時鐘系統(tǒng)

LDRR0,=__main ;把__main的地址給RO

BXR0 ;跳轉(zhuǎn)到__main標(biāo)號

ENDP注1:SystemInit定義在system_stm32f10x.c中注2:__main指向C/C++初始化子程序(初始化堆和棧等),最后跳轉(zhuǎn)到C語言程序的main函數(shù)STM32啟動代碼3:默認中斷處理程序(續(xù)2) ;默認異常(中斷)處理程序(無限循環(huán)、可被修改)NMI_HandlerPROC ;NMI處理程序

EXPORTNMI_Handler[WEAK] B. ;“.”代表當(dāng)前指令地址 ;“B

.”類似C語言的while(1)語句,無限循環(huán)

ENDP …… ;略

ALIGN ;按照要求進行對齊注3:V3.5.0前啟動代碼沒有調(diào)用SystemInit,需要用戶在應(yīng)用程序主函數(shù)main中首先調(diào)用STM32啟動代碼4:用戶初始化堆和棧

IF:DEF:__MICROLIB ;如果定義了__MICROLIB則為真,否則為假

EXPORT__initial_sp ;為真,讓外部文件使用定義的堆和棧地址

EXPORT__heap_base EXPORT__heap_limitMicroLib是為基于ARM嵌入式應(yīng)用編寫的一個高度優(yōu)化的C語言庫,提供了更緊湊的代碼大小、可應(yīng)用于無操作系統(tǒng)支持的情況,不支持文件I/O和寬字符、有些函數(shù)速度略慢MicroLib的選擇(目標(biāo)選項)STM32啟動代碼4:用戶初始化堆和棧(續(xù))

ELSE

;為假,使用默認的C語言運行庫

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ā)工具MDK-ARM流行的Cortex-M處理器商業(yè)開發(fā)平臺包括各種組件:μVision集成開發(fā)環(huán)境(IDE)ARM編譯工具(C/C++編譯器、匯編器、連接器等)調(diào)試器和模擬器RTX實時操作系統(tǒng)核心超過1000個微控制器的參考啟動代碼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是動態(tài)鏈接庫DLLHlp保存各種幫助文件Pack驅(qū)動程序包(庫)的目錄軟件包程序目錄Pack目錄(驅(qū)動程序文件)ARM是ARM公司的基本驅(qū)動程序Keil保存有ST公司的驅(qū)動程序 含啟動代碼文件、外設(shè)驅(qū)動程序的頭文件和源程序文件等……創(chuàng)建應(yīng)用程序1.新建項目:Project–NewμVisionProject選擇或新建一個目錄,輸入項目文件名選擇目標(biāo)微控制器(ST公司的STM32F103ZE)根據(jù)項目需求,選擇相應(yīng)的驅(qū)動程序修改目標(biāo)名、組名,或增加新組創(chuàng)建應(yīng)用程序2.新建源程序文件:File–New編輯源程序代碼、保存文件加入項目(AddExistingFilestoGroup)intmain(){}創(chuàng)建應(yīng)用程序3.構(gòu)建應(yīng)用程序:Project–BuildTarget編譯、匯編和連接4.調(diào)試應(yīng)用程序:

Debug–Start/StopDebugSession目標(biāo)選項的調(diào)試配置:OptionforTarget使用模擬器UseSimulator啟動時載入應(yīng)用程序

LoadAplicationatStartup運

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論