CORTEX-M4知識點總結(jié)_第1頁
CORTEX-M4知識點總結(jié)_第2頁
CORTEX-M4知識點總結(jié)_第3頁
CORTEX-M4知識點總結(jié)_第4頁
CORTEX-M4知識點總結(jié)_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Cortex-M4內(nèi)核知識點總結(jié)目錄Cortex-M4內(nèi)核知識點總結(jié) 錯誤!未定義書簽1 ARM處理器簡介 錯誤!未定義書簽2架構(gòu) 錯誤!未定義書簽架構(gòu)簡介 錯誤!未定義書簽編程模型 錯誤!未定義書簽存儲器系統(tǒng) 錯誤!未定義書簽復(fù)位和復(fù)位流程 錯誤!未定義書簽3指令集 錯誤!未定義書簽CM4指令集特點 錯誤!未定義書簽Cortex-M處理器間的指令集比較 錯誤!未定義書簽匯編指令簡要介紹 錯誤!未定義書簽處理器內(nèi)傳送數(shù)據(jù) 錯誤!未定義書簽存儲器訪問指令 錯誤!未定義書簽算數(shù)運算 錯誤!未定義書簽邏輯運算 錯誤!未定義書簽移位 錯誤!未定義書簽異常相關(guān)指令 錯誤!未定義書簽4存儲器系統(tǒng) 錯誤!未

2、定義書簽存儲器外設(shè) 錯誤!未定義書簽Bootloader 錯誤!未定義書簽位段操作 錯誤!未定義書簽存儲器大小端 錯誤!未定義書簽5異常和中斷 錯誤!未定義書簽中斷簡介 錯誤!未定義書簽異常類型 錯誤!未定義書簽中斷管理 錯誤!未定義書簽異常或中斷屏蔽寄存器 錯誤!未定義書簽PRIMASK 錯誤!未定義書簽FAULMASK (M0中無) 錯誤!未定義書簽BASEPRI ( M0中無) 錯誤!未定義書簽中斷狀態(tài)及中斷行為 錯誤!未定義書簽中斷狀態(tài) 錯誤!未定義書簽中斷行為 錯誤!未定義書簽各Cortex-M處理器NVIC差異 錯誤!未定義書簽6異常處理 錯誤!未定義書簽C實現(xiàn)的異常處理 錯誤!未

3、定義書簽棧幀 錯誤!未定義書簽EXC_RETURN 錯誤!未定義書簽異常流程 錯誤!未定義書簽異常進(jìn)入和壓棧 錯誤!未定義書簽異常返回和出棧 錯誤!未定義書簽7低功耗和系統(tǒng)控制特性 錯誤!未定義書簽低功耗模式 錯誤!未定義書簽SysTick定時器 錯誤!未定義書簽8 OS支持特性 錯誤!未定義書簽OS支持特性簡介 錯誤!未定義書簽SVC和PendSV 錯誤!未定義書簽實際的上下文切換 錯誤!未定義書簽1 ARM處理器簡介ARMt理器的種類很多,從手機上的高端處理器芯片到面向微控制器的芯片,都有ARM勺身影。2011年基于ARMt理器的芯片的出貨量已經(jīng)到達(dá) 79億。 這一章首先對ARMt理器有個

4、簡單的了解。在早期的時候,ARMt理器使用后綴表明特性。例如 ARM7TDMIT表示支持 Thumb旨令,D表示JTAG M表示快速乘法器,I則表示嵌入式ICE模塊。近幾年,ARM:變處理器的命名方式,統(tǒng)一使用了 Cortex處理器的名稱。Cortex處理器下分為三類: Cortex-A系列:需要處理高端嵌入式系統(tǒng)等復(fù)雜應(yīng)用的應(yīng)用處理器- Cortex-R系列:實時、高性能的處理器,面向較高端的實時市場 Cortex-M系列:面向微控制器和混合信號設(shè)計等小型應(yīng)用, 注重低成本、 低功耗。不同系列的處理器使用不同版本的架構(gòu)Cortex-A 系列ARMv7-咪構(gòu)Cortex-R 系歹!JARMv7

5、-Rg構(gòu)Cortex-M 系歹!JARMv7-M ARMv6-M在Cortex-M系列中,進(jìn)一步都處理器進(jìn)行了劃分處理器功能架構(gòu)Cortex-M0、Cortex-M0+低功耗ARMv6-MCortex-M1FPGAARMv6-MCortex-M3微控制器ARMv7-MCortex-M4增力口 DSPARMv7E-M2架構(gòu)架構(gòu)簡介Cortex-M3和Cortex-M4處理器都是基于 ARMv7-俅構(gòu)。最初 ARMv-7M 架構(gòu)是隨著Cortex-M3處理器一同引進(jìn)的,而在 Cortex-M4發(fā)布時,架構(gòu)中 又額外增加了新的指令和特性,改進(jìn)后的架構(gòu)有時也被稱為ARMv7E-M編程模型操作模式和狀態(tài)

6、Cortex-M4處理器包括兩種操作狀態(tài)和模式,還有兩種訪問等級。1 .操作狀態(tài)調(diào)試狀態(tài):處理器被暫停后,就會進(jìn)入調(diào)試狀態(tài),比如利用調(diào)試器觸 發(fā)斷點,單步執(zhí)行等。- Thumb犬態(tài):處理器執(zhí)行程序代碼,它就是處在 Thumb犬態(tài),因為 Cortex-M4用的是Thumb旨令,所以稱為Thumb犬態(tài),并且在Cortex-M 處理器中已經(jīng)不支持 ARM旨令,也就不存在ARM犬態(tài)。2 .操作模式處理模式:執(zhí)行中斷服務(wù)程序等異常處理。 在處理模式下,處理器總 是具有特權(quán)訪問等級。線程模式:執(zhí)行普通的程序代碼。3 .訪問等級特權(quán)訪問等級:可以訪問處理器中的所有資源非特權(quán)訪問等級:有些存儲器區(qū)域無法訪問,

7、有些操作也無法使用訪問等級有特殊寄存器CONTROL制。軟件可將處理器從特權(quán)訪問等級轉(zhuǎn)換 至非特權(quán)訪問等級,但反之無法直接轉(zhuǎn)換,需要借助異常機制。處理器的操作模式和狀態(tài)可由圖來表示, 在上電后,默認(rèn)處于特權(quán)線程模式 下的Thumb!犬態(tài)。寄存器對于AR俅構(gòu)來講,處理存儲器中的數(shù)據(jù)時,需將其從存儲器加載到寄存器 中,處理完畢后,若有必要,還可以再寫回存儲器。這種方式被稱作“加載 -存 儲架構(gòu)"(LOAD-STORE)Cortex-M4處理器的寄存器組中有16個寄存器,其中包括13個通用寄存器 和3個有特殊用途的寄存器。1通用寄存器 R0-R12R0-R7被稱作低寄存器,許多16位指令只

8、能訪問低寄存器。R8-R12稱作高 寄存器,可用32位指令和幾個16位指令訪問。R0-R12初始值未定義。2棧指針R13R13為棧指針,可通過PUS的POFS作實現(xiàn)棧存儲的訪問。棧指針包括兩個: 主棧指針MSPffi進(jìn)程棧指針PSP MS斯默認(rèn)指針,復(fù)位后或處理模式時只能是 MSP而PSP只能在線程模式使用。棧指針的選擇有 CONTROL存器控制。MSP® PSP的最低兩位必須是0,也就是棧指針的地址操作必須4字節(jié)對齊。3鏈接寄存器(LR) R14用于函數(shù)或子程序調(diào)用時返回地址的保存,在異常中則用來保存進(jìn)異常前狀 態(tài)信息,包括系統(tǒng)模式、棧指針模式等。異常返回時參考LR中的信息返回到相

9、應(yīng)狀態(tài)。4程序計數(shù)器(PC R15R15為程序計數(shù)器,讀操作返回當(dāng)前地址加 4,寫操作引起跳轉(zhuǎn)。特殊寄存器特殊寄存器有三類:程序狀態(tài)寄存器、中斷/異常屏蔽寄存器、處理器控制 寄存器。1程序狀態(tài)寄存器:應(yīng)用PSR(APSR、執(zhí)行PSR(EPSR、中斷PSR(IPSR) 三個寄存器可以單獨訪問,也可以組合到一個寄存器中訪問。31262320161080N Z C V Q| ICI/IT TGE0-3ICI/ITISR NUM在APS中包含N (負(fù)標(biāo)志)、Z (零標(biāo)志)、C (進(jìn)位標(biāo)志)、V (溢出標(biāo)志)、 Q (飽和標(biāo)志)和GE (大于或等于標(biāo)志,只在 M4中有)。IPSR中是中斷號,只讀。EPS

10、Rfr, T為表示Thum瞅態(tài),由于M4支持Thumb犬態(tài),不支持ARM犬態(tài), T位始終為1。ICI是中斷繼續(xù)指令位,保存的是中斷被打斷時的信息。 IT指令 時IF-THEN指令,用于條件執(zhí)行。2 PRIMASK FAULTMASq口 BASEPRlf存器:這三個寄存器只能在特權(quán)模 式下使用。PRIMASKT屏蔽除NMI和HardFault之外的所有異常。FAULTMASK 可屏蔽HardFault。 BASEPR可以根據(jù)設(shè)置屏蔽低優(yōu)先級的中斷,可控制 8個或 16個中斷,相應(yīng)的改寄存器的寬度為 3位或4位。3 CONTROL 存器CONTROL存器主要有以下幾項作用: 線程模式下的訪問等級

11、指針的選擇 當(dāng)前代碼是否使用了浮點單元分別對應(yīng)了寄存器的低三位位功能nPRIV (第 0 位)0對應(yīng)特權(quán)等級,1為非特權(quán)等級SPSEL(第 1 位)0對應(yīng)主棧指針,1為進(jìn)程棧指針,處理模式下始終為 0。FPCA(第2位) 0未使用浮點,1使用了浮點浮點寄存器1 S0-S31 和 D0-D15S0-S31都為32位寄存器,也可以D0-D15的方式成對訪問,但 M4不支持雙 精度浮點運算,只是可以傳輸雙精度數(shù)據(jù)。2浮點狀態(tài)和控制寄存器(FPSCRFPSC陋個功能 提供浮點運算結(jié)果的狀態(tài)信息,如負(fù)標(biāo)志、進(jìn)位標(biāo)志等。 定義一些浮點運算動作,如何舍入等3經(jīng)過存儲器映射的浮點單元控制寄存器(CPACR該寄

12、存器經(jīng)過了映射,也就是說需要通過通用寄存器加載進(jìn)行設(shè)置,寄存器 的功能是可以設(shè)置浮點單元的訪問權(quán)限,拒絕訪問、特權(quán)訪問,全訪問。存儲器系統(tǒng)存儲器系統(tǒng)特性 4GB性地址空間 架構(gòu)定義的存儲器映射。4GB的存儲器空間被劃分為多個區(qū)域,用于 預(yù)定義的存儲器和外設(shè)。 支持大端和小端的存儲器系統(tǒng)。 位段訪問。 寫緩沖 存儲器保護(hù)單元MPU 非對齊傳輸支持存儲器映射CORTEX-M理器的4GBm址空間被分為了多個存儲器區(qū)域,如圖所示。區(qū) 域根據(jù)各自典型用法進(jìn)行劃分,他們主要用于: 程序代碼訪問(如COD位域)數(shù)據(jù)訪問(如SRAM:域)外設(shè)(如外設(shè)區(qū)域)某款芯片的存儲器映射分配系統(tǒng)0.5GB外部設(shè)備1GB外

13、部RAM 1GB外設(shè)0.5GBSRAM 0.5GBCODE 0.5GB/PWM register0x50F0_00000x50D0_00000x50C0_00000x50B0_00000x5090_00000x5073_00000x5072_00000x5071_00000x5070_00000x5062_00000x5061_00000x5060_00000x5050_00000x5040_00000x5030_00000x5023_00000x5022_00000x5021_00000x5020_00000x5011_00000x5010_00000x5000_0000GPIO regis

14、terAnalog control (ADC/TP/AnalogReg/1k sram)IO control0xFFFF_FFFF0xF000_0000Reserved<-7816 registerSPI3 registerSPI2 register0xE000_0000Private Peripheral BusSPI1 register0x5000_00000x4010_0000ReservedSPI0 registerTimer_2 registerTimer_1 registerTimer_0 registerAPBBRG deviceWDT registerRTC regist

15、erCRC registerUART3 registerFLASH CTRL32KByUART2 register0x4000_0000_DMA0x3000_0000ReservedUART1 registerUART0 registerI2C_1 register0x2000_0000_SRAM8KBytes0x60 0000_ReservedI2C_0 registerSCU (clock ResetPmu calendar)0x0000_0000FLASH MEMORY 128K+4K FLASH一般Code放在Flash當(dāng)中,數(shù)據(jù)放在RAW。數(shù)據(jù)在RAMfr放有一定的順 序,可以分為數(shù)

16、據(jù)段,BSS®、堆和棧區(qū)域。數(shù)據(jù)段,存儲在內(nèi)存的底部,包含初始化的全局變量和靜態(tài)變量。 BSSK,未初始化的數(shù)據(jù)。 堆,C函數(shù)自動分配存儲器區(qū)域,例如 alloc ()和malloc () 棧,用于臨時數(shù)據(jù)存儲,局部變量,函數(shù)調(diào)用存儲器棧(向下增長)BS以數(shù)據(jù)段0x20000000棧存儲同幾乎所有的處理器架構(gòu)一樣,Cortex-M處理器在運行時需要棧存儲和棧 指針R13 ARMa理器將系統(tǒng)主存儲器用于??臻g操作, 使用PUSH旨令往棧中存 儲數(shù)據(jù)以及POP旨令從棧中提取數(shù)據(jù)。處理器使用的是滿遞減的模型,棧指針是向下增長的。處理器啟動后,SP被設(shè)置為棧存儲空間的最后的位置,也就是最低位

17、置,PUSH寸,SP指針首先減小,然后將數(shù)據(jù)壓入棧中。POP勺時候相反,先將當(dāng)前SP所指的數(shù)據(jù)出棧,然 后再修改SP, SP此時增大??捎孟旅鎯煞鶊D加以理解,??臻gPUSHM乍寄存器0x12345678poPM乍寄存器0x12345678棧中主要用于: 存儲局部變量 異常產(chǎn)生時保存處理器狀態(tài)(LR xPSR和寄存器數(shù)值 函數(shù)調(diào)用時復(fù)位和復(fù)位流程對于典型的Cortex-M處理器,復(fù)位類型有三種: 上電復(fù)位。復(fù)位微控制器中所有部分。 系統(tǒng)復(fù)位。只會復(fù)位處理器和外設(shè),不包括處理的調(diào)試支持部件 處理器復(fù)位。只復(fù)位處理器。在復(fù)位后以及處理器開始執(zhí)行程序前,處理器會從存儲器中讀出頭兩個字 節(jié)。第一個字表示

18、主棧指針的初始值。第二個字代表復(fù)位處理起始地址的復(fù)位向 量。處理器讀出這兩個自己后,就會將這些數(shù)值賦給MSPffi PG讀地址 讀地址讀取復(fù)位向量0x00000000 0x00000004表示的地址取MSP®始值取復(fù)位向皇 里取第一條指令時間之前在棧存儲時講到過,Cortex-M處理器的棧操作時基于滿遞減的,所以 S P的初始值應(yīng)該設(shè)置在棧頂?shù)奈恢谩@?,若存儲器區(qū)域為 0x20007c0000x200 07FFF (1KB),初始的棧指針就應(yīng)該為0x。另外,對于Cortex-M處理器,向量表中向量地址的最低位應(yīng)該為1,以代表他們?yōu)門humb犬態(tài)。對于下圖中的例子,復(fù)位向量為 0x1

19、01,而啟動代碼是從0x100開始的。在取出復(fù)位向量后。Cortex-M處理器就可以從復(fù)位向量地址處執(zhí) 行程序,并開始正常操作。其他存儲器SPM始值第一個壓棧頂?shù)诙€壓棧頂SRA則始地址啟動代碼T復(fù)其他異常向量位 向量0X000001010X200080000X200080000X20007FFC0X20007FF80X200000000X000001000X000000040X000000003指令集CORTEX-M4用的是Thumb-2指令集,不支持 ARM旨令集,Thumb旨令集是ARM旨令集的子集,但是Thumb-2技術(shù)已經(jīng)不再支持ARM犬態(tài)。CORTEX-M理器間的一個區(qū)別就是指令集

20、特性。為了將回路面積降到最低, CORTEXMCORTEXM0CORTEXM1理器只支持多數(shù)16位指令和部分32位指令, CORTEX-M3持的32位指令更多。CORTEX理器支持剩下的SIMD (單指令多數(shù) 據(jù))等DSPI開指令集可選的浮點指令。CM4指令集特點CM4t理器使用ARMv7-M構(gòu),指令集為Thumb旨令集中的Thumb-2技術(shù), 具有如下特點 16位與32位混合指令 加載/存儲指令集,不能直接操作存儲器。 指令長度可變,使用16/32位由功能決定,優(yōu)先使用16位。 DSP旨令,CM時為單精度,CM種可以雙精度Cortex-M處理器間的指令集比較Cortex-M 處理器的架構(gòu)有三

21、類, ARMv6-M ARMv7-IM ARMv7E-M內(nèi)核性能ARMv6-MM0/M0+/M1一般數(shù)據(jù)處理,IO控制人物ARMv7-MM3高級數(shù)據(jù)處理、硬件除法ARMv7E-MM4SIMD快速MAC®和運算匯編指令簡要介紹處理器內(nèi)傳送數(shù)據(jù)MOV <Rrl的寄存器> < Rm源寄存器>源寄存器處可以是立即數(shù),立即數(shù)為 8位以下,9-16位用MOVW,32的需 要使用LDR偽指令。使用浮點單元時可以使用VMO柏令存儲器訪問指令訪問可分為讀和寫指令,另外根據(jù)讀寫的大小還有其他的延伸數(shù)據(jù)類型加載(讀)存儲(寫)8位無符號LDRBSTRB8位有符號LDRSBSTRB1

22、6位無符號LDRHSTRH16位有符號LDRSHSTRH32位LDRSTR多個32位LDMSTM64位LDRDSTRD棧操作PUSHPOP介紹幾個較為重要的1 LDR/STRLDR Rd,Rn,#offset從存儲器Rn+offset處讀取字,讀取到 Rd中STR Rd,Rn,#offset 向存儲器Rn+offset處存儲字,數(shù)據(jù)來自 R& LDR R0 R1, #0X08從存儲器R1+0X08處讀取字,放到 R0中 支持寫回功能,力口!即可,上面可以寫成LDR R0 R1, #0X08!這樣表示存儲器位置的 R1被更新為R1+0X082 LDM/STM® /寫多個字上述命

23、令是為了從存儲器中讀寫多個字。一般會加后綴配合使用LDMIA Rn,<reg list>Rn是存儲器位置,reg list是寄存器列表,從Rn所指的存儲器位置讀取數(shù) 據(jù),放入寄存器中,每次讀取完成后,地址就會自動加 4。作用相當(dāng)于POP另 外要注意的是,先讀取的數(shù)據(jù)放置在低寄存器中,后讀取的數(shù)據(jù)放置到高寄存器。LDMIA操作STMIA Rn,<reg list>Rn是存儲器位置,reg list是寄存器列表,向Rn所指的存儲器位置存儲數(shù) 據(jù),每次存儲前,地址自動減4。相當(dāng)于PUSHft作。另要注意的是,先存儲高 寄存器的數(shù)據(jù),后存儲低寄存器的數(shù)據(jù)。STMD啾作同樣,這兩

24、個指令都可以通過!表示寫回操作,更新寄存器所指的存儲器位 置3壓棧與出棧PUSH/POPPUSHffi POP®上面的LDMIAffi STMD是相同的。算數(shù)運算加:ADC減:SUBMUL除:DIV對此不做詳細(xì)介紹邏輯運算與:AND或:ORR位清除:BIC按位異或:EOR按位或非:ORN移位算數(shù)右移:ASR邏輯左移:LSL邏輯右移:LSR循環(huán)右移:ROR異常相關(guān)指令之前說過,M4可以有特權(quán)模式和非特權(quán)模式,并且非特權(quán)模式不能直接轉(zhuǎn) 換到特權(quán)模式,只能在異常中修改CONTROL存器。這里就可以通過SVC旨令來 進(jìn)入異常。SVC #<immed>這樣就可以進(jìn)入SVC中斷中,然

25、后修改CONTROL存器。要注意的是,調(diào)用 SVC旨令后,需盡快進(jìn)入中斷中,如果有其他高優(yōu)先級的中斷打斷了 SVC就會 弓I起 HardFault。CPS旨令使用時需要帶上后綴:IE (中斷使能),ID (中斷禁止),還需指定 要設(shè)置的中斷屏蔽寄存器,如之前講到的 PRIMASKK FAULTMASK指令操作CPSIE I使能中斷(清除PRIMASKCPSID I禁止中斷(設(shè)置 PRIMASK ,除NMI和HardFaultCPSIE F使能中斷(清除FAULTMASKCPSID F禁止中斷(設(shè)置FAULTMASK,除NMI4存儲器系統(tǒng)存儲器外設(shè)哈佛結(jié)構(gòu),程序存儲器和數(shù)據(jù)存儲器分開,也就是指令

26、和數(shù)據(jù)可以同時訪問。1、在第一章中的存儲器映射圖中,為代碼段,主要用于程序代碼,改區(qū)域 一般也允許數(shù)據(jù)訪問。一般此處為 Flash o在keil中,代碼編譯后,整個代碼分為幾部分:Code(代碼),RO-data (只 讀數(shù)據(jù)),RW-data,(初始化的可讀寫變量大?。琙I-data (Zero Initialize)未初始化的可讀寫變量大小,它會被自動初始化為00 ZI-data不會被算到代碼 里,因為它不會被初始化。簡單來說呢就是在燒寫的時候 FLASHY的被占用的空間為: Code+RO-data+RW-data程序運行的時彳g,芯片內(nèi)部 RAMS用的空間為:RW-data+ZI-d

27、ata2、范圍內(nèi)是SRAM主要用于連接SRAM其大都為片上SRAM不過對存儲 器的類型沒有什么限制。若支持可選的位段特性,則SRAMK域的第一個1MB可位尋址,還可以在這塊區(qū)域中執(zhí)行程序代碼。3、是外設(shè)區(qū)域,多用于片上外設(shè),和SRA順域類似,也可以放置程序代碼, 若支持可選的位段特性,則外設(shè)區(qū)域的第一個1MB是可選的。4、空間為外部RAMfi問5、2G-3G空間為設(shè)備空間,用于片外外設(shè)。6、3G-4G空間為系統(tǒng)空間。Bootloader芯片設(shè)計人員將Bootloader放入系統(tǒng)中的原因是多方面的。例如: 提供Flash編程功能,這樣就可以利用一個簡單的 UAR儂口來編程 Flash,或者當(dāng)程序

28、運行時,在自己的應(yīng)用程序中編程Flash存儲器的某些部分。 提供通信協(xié)議棧等額外的固件,可被軟件開發(fā)人員通過API調(diào)用。 提供芯片內(nèi)置的自檢功能(BIST)比如在1601中,提供一個4K的info 區(qū),和128K的main區(qū),4K的info 區(qū)就 是一個bootloader ,提供SPI下載功能,利用撥碼開關(guān)可以設(shè)置從哪里啟動, mode=0寸從info區(qū)啟動,mode=1時從main區(qū)啟動,并且main區(qū)分兩部分,軟 件可設(shè)置從低64K啟動還是從高64K啟動。這里設(shè)計存儲器重映射的問題,系統(tǒng) 啟動時是從0X00開始的,不管是Boot loader還是用戶flash ,都得從0x00開 始,然

29、后0x04放的reset_handler 的地址,mode=0那infor區(qū)就被映射到了 0x00, mode=1 main 區(qū)就被映射到了 0x00。位段操作對存儲器中某一位操作是如何實現(xiàn)的呢?先來看看普通模式下,寫某一位:LDR R0, =0X0 ;設(shè)置地址LDR R1,R0; 讀數(shù)據(jù)R1,#0X04; 修改第2位STR R1, R0; 寫回讀某一位:LDR R0, =0X0 ;設(shè)置地址LDR R1,R0; 讀數(shù)據(jù)R1 , R1 , #2, #1;提取第 2 位這種操作無法保證原子性,比如輸出端口的第0位被主程序使用,而第一位 被中斷使用,這樣有可能出現(xiàn)數(shù)據(jù)沖突。位段操作模式下,這種現(xiàn)象可

30、以避免, 因為位段操作是在硬件等級下修改的。位段操作只在兩個區(qū)域支持,SRAM勺第1MB外設(shè)區(qū)域的第1MB每1M哈 對應(yīng)一個32M的區(qū)域,只需操作這32M的某個字,就能對應(yīng)那1MBK域的某一位。 例如寫0x為1,就設(shè)置了 0x第3位為1。在指令上也會更加簡化。位段寫操作LDR R0, =0X2200000 ;設(shè)置 addMOV R1 #1;要寫的數(shù)據(jù)STR R1 ,R0;寫設(shè)置了位段操作模式,對應(yīng)的32MB區(qū)域?qū)⒉荒茉偈褂?。存儲器大小端大小端指的是?shù)據(jù)存儲時的順序問題。大端指的是高字節(jié)的數(shù)據(jù)放在低地址 中,低字節(jié)放在高地址中,這種方式符合人類思維。小端則是低字節(jié)放在低地址 中,高字節(jié)放在高地址

31、中,這種方式更符合計算機思維。例如將0x放到存儲器0x2000-0x2003地址處大端方式地址0x20030x20020x20010x2000數(shù)據(jù)0x780x560x340x12小端方式地址0x20040x20030x20020x2001數(shù)據(jù)0x120x340x560x78CM4t理器同時支持小端和大端的存儲器系統(tǒng)。CM的微控制器大多是小端 的。5異常和中斷中斷簡介所有的CORTEX-Mt理器都會提供一個用于中斷處理的嵌套向量中斷控制 器,也就是NVIC中斷也屬于異常的一種,其他異常包括如錯誤異常和其他用 于OS支持的系統(tǒng)異常。M4的NVIC支持最多240個IRQ (中斷請求),1個不可屏蔽中

32、斷(NMD, 1 個SysTick (系統(tǒng)節(jié)拍)定時中斷及多個系統(tǒng)異常。異常編號異常類型優(yōu)先級描述1復(fù)位-3復(fù)位2NMI-2/、口屏蔽中斷3硬件錯誤-1硬件錯誤4MemManage 誤可編程存儲器管理錯誤5總線錯誤可編程總線錯誤6使用錯誤可編程程序錯誤7-10保留11SVC可編程請求管理調(diào)用12調(diào)試監(jiān)控可編程調(diào)試監(jiān)控13保留14PendSV可編程一般用于上下文切換15SYSTICK可編程系統(tǒng)節(jié)拍定時器16外部中斷#0可編程片上外設(shè)或外部中斷源產(chǎn)生17外部中斷#1可編程255外部中斷#239可編程除了前3個異常的優(yōu)先級是固定的,其余異常都可以修改優(yōu)先級異常類型編號1-15為系統(tǒng)異常,16及以上的

33、則為中斷輸入中斷管理為了簡化中斷和異常管理,CMSIS-Core提供了多個訪問函數(shù)函數(shù)用法Void NVIC_EnableIRQ (IRQn_Type IRQ®使能外部中斷Void NVIC_DisableIRQ (IRQn_Type IRQn)禁止外部中斷Void NVIC_SetPriority(IRQn_Type IRQn,uint32_t priority)設(shè)置中斷的優(yōu)先級Void _enable_irq(void)清除PRIMASK!能中 斷Void _disable_irq(void)設(shè)置PRIMAS嫌止所有中斷Void NVIC_SetPriorityGrouping(

34、uint32_t priorityGroup)設(shè)置優(yōu)先級分組復(fù)位后,所有中斷都處于禁止?fàn)顟B(tài),且默認(rèn)的優(yōu)先級為 00在使用任何一個中斷之前需要 設(shè)置所需中斷的優(yōu)先級(可選) 使能外設(shè)中的可以觸發(fā)中斷的中斷產(chǎn)生控制 使能NVIC中的中斷在M4中,中斷優(yōu)先級共8位寬,但芯片廠商可進(jìn)行設(shè)置,范圍是 3-8位 中斷優(yōu)先級分為兩個部分,分組優(yōu)先級(也叫搶占優(yōu)先級)和子優(yōu)先級。處理器 首先判斷的是分組優(yōu)先級,分組優(yōu)先級高的會被首先處理,若分組優(yōu)先級相同, 再比較子優(yōu)先級。8為寬的優(yōu)先級如何分配搶占優(yōu)先級和分組優(yōu)先級,可由寄存 器設(shè)置。如下表優(yōu)先級分組搶占優(yōu)先級域分組優(yōu)先級域0 (默認(rèn))Bit7:1Bit01

35、Bit7:2Bit1:02Bit7:3Bit2:03Bit7:4Bit3:04Bit7:5Bit4:05Bit7:6Bit5:06Bit7Bit6:0Bit7:0這里要注意的是,異常編號和優(yōu)先級并不是一個意思, 異常編號僅僅是一個 編號,就像是枚舉一樣,而優(yōu)先級則是需要手動的進(jìn)行設(shè)置的。 只有在分組優(yōu)先 級和子優(yōu)先級完全一致時,異常編號才起作用,編號越小優(yōu)先級越高。另外,在M4內(nèi)核中,還提供了中斷向量重定位功能。向量表重定位功能提 供了一個名為向量表偏移寄存器(VTOR的可編程寄存器。前面提到的Bootloder 就可以使用此項功能來完成。異?;蛑袛嗥帘渭拇嫫鱌RIMASKPRIMASIffl

36、于禁止除NMI和HardFault外的所有異常,只能在特權(quán)狀態(tài)訪問 如:CPSIE I ;消除PRIMASK使能中斷)CPSID I;設(shè)置PRIMASK (禁止中斷)FAULMASK (M0中無)FAULMASK于禁止除NMI外的所有異常,只能在特權(quán)訪問,如:CPSIE F ;消除 FAULMASKCOSID F;設(shè)置 FAULMASKBASEPRI (M0中無)BASEPR可禁止優(yōu)先級低于某特定等級的中斷,只能在特權(quán)狀態(tài)訪問,如:_set_BASEPRI(0X60);中斷請求處理器開始處理中斷請求后,中斷請求被清除中斷掛起狀態(tài)處理器模式進(jìn)入中斷處理中斷活躍狀態(tài)中斷請求進(jìn)入中斷處理后活躍狀態(tài)被

37、置位中斷掛起狀態(tài)掛起狀態(tài)被軟件清除處理器模式中斷請求中斷掛起狀態(tài)處理器模式中斷請求保持活躍中斷請求中斷掛起狀態(tài)中斷活躍狀態(tài)處理器模式中斷請求中斷掛起狀態(tài)中斷活躍狀態(tài)處理器模式再次產(chǎn)生中斷請求中斷再次掛起中斷請求中斷掛起狀態(tài)中斷活躍狀態(tài)再次進(jìn)入中斷處理器模式C函數(shù)返回結(jié)果在函數(shù)調(diào)用后會被修改的寄存器*/ldr r1, r3Idr r0, r1Idmia r0!, r4-r11msr psp, r0/* Restore the task stack pointer. */isbmov r0, #0msr basepri, r0orr r14, #0xd /* 或上0b1101,返回線程棧,線程模式

38、*/ bx r14異常流程異常進(jìn)入和壓棧當(dāng)異常產(chǎn)生且被處理器接受時,壓棧流程會將寄存器壓入棧中并組織棧幀。 要注意的是,壓棧期間的棧訪問順序和棧幀中的順序不同,首先壓棧的是PC和xPSR這樣在取向量時會盡快更新PC這里再復(fù)習(xí)一下主棧與進(jìn)程棧的使用, 在處理模式,必須使用主棧,在進(jìn)程 模式,由CONTROL存器控制使用主棧還是進(jìn)程。在處理器處于進(jìn)程模式并且使用進(jìn)程棧時, 壓棧操作使用進(jìn)程棧,然后就進(jìn) 入了處理模式,直到異常返回之前,一直使用的是主棧,如異常嵌套的情況,在 一個異常中又進(jìn)入了另一個異常,仍然使用的是主棧進(jìn)行壓棧。另外,我們在使用OS的時候會有兩個??臻g,系統(tǒng)??臻g和任務(wù)棧空間, 系

39、統(tǒng)棧空間是在啟動文件中進(jìn)行了設(shè)置,如圖 6-1 ,這個棧空間是留給異常使用 的,也就是處理模式下的MSP而在創(chuàng)建任務(wù)的時候都會有對??臻g的設(shè)置,我 們稱為任務(wù)棧空間,也就是在線程模式下的 PSP *Stack_SizeEQU0x00400 jbessel:Need to fine rune this value,If princf( )AREASTACK r NO IKIRZADWRITEr ALIGN-3Stack_MettSPACEScackSizeEQU0x00000000;rtsa£_5izetyuUXOOO23C0O ;£>*ssel :03t:1000 -

40、>0X03neap IsaaeAREAHEAP, NOINIT, EtEiDWRlTE, ALIGN=3Hear_Men _!ie mp_1 Jlieel tSPACEHeaD_Slze進(jìn)入異常時,會將R0-R3, R12, LR和返回地址(帶浮點單元時包括 S0-S15 和FPSCR硬件自動壓棧保存,其他的(R4-R11)需要軟件保存。異常返回和由棧出棧時就是對EXC_RETURNfi的/U斷,也就是EXC_RETURN位域所表示的 那幾項,用什么棧進(jìn)行解訕的仍返回什么棧, 操作模式和次幀類型也類似。出棧 操作結(jié)束時,還要檢查xPSR的第9位,若置1則去除壓棧時插入的額外空間。對于棧空

41、間中的數(shù)據(jù),同入棧一樣,R0-R3, R122和LR (帶浮點單元時包括S0-S15和FPSCR是自動出棧的,其余的需要軟件出棧。7低功耗和系統(tǒng)控制特性低功耗模式CORTEX-M列處理器提供兩種休眠模式:休眠模式和深度休眠模式。由系 統(tǒng)控制寄存器SCR空制。處理器提供了兩個用于進(jìn)入休眠模式的指令:WFI,進(jìn)入休眠模式,等待中斷,可由中斷、調(diào)試、復(fù)位喚醒。 WFE等待事件,條件進(jìn)入休眠模式。內(nèi)部事 件寄存器為0,進(jìn)入休眠,否則內(nèi)部事件寄存器被清除,處理器繼續(xù)執(zhí)行,除了 中斷、調(diào)試、復(fù)位喚醒外,還能由事件喚醒。WF葉的事件喚醒包括事件輸入信號脈沖(RXEV。該信號屬于事件通信接 口特性的一部分。處

42、理器還存在一個名為 TXEV(發(fā)送事件)的輸出信號,當(dāng)執(zhí) 行SEV(發(fā)送事件)指令時,TXE&輸出一個周期的脈沖信號。事件通信接口的主要設(shè)計目標(biāo)位,在一個特定事件發(fā)生前讓處理器一直處于 休眠模式。例如:允許外設(shè)和處理器之間的通信允許多個處理器間的通信SysTick定時器Cortex-M處理器內(nèi)集成了一個小型的名為 Systick的定時器,它屬于NVIC 的一部分,可以產(chǎn)生Systick異常。Systick為簡單的向下計數(shù)的24位計數(shù)器。Systick的主要作用是用于在OS中任務(wù)管理和上下文切換,處理器可以在 不同時間片內(nèi)處理不同任務(wù)。設(shè)計這個定時器的目的是為了增加軟件的可移植性。所有C

43、ORTEX-陳歹I的芯片都有相同的定時器。定時器的時鐘可以是處理器時鐘或者是外部參考時鐘 (STCLK)。定時器的使用很簡單,只有四個寄存器地址寄存器作用0XE000E010Systick控制和狀態(tài)寄存器使能以及設(shè)置Systick0XE000E014Systick重裝載值寄存器Systick計時周期0XE000E018Systick當(dāng)前值寄存器Systick當(dāng)前數(shù)值0XE000E01CSystick校準(zhǔn)值寄存器校準(zhǔn)設(shè)置使用CMSIS-Core中的函數(shù)就能方便地使用Systick ,主要作用就是產(chǎn)生定 時中斷,如下,產(chǎn)生1HZ的定時中斷配置正確的始終頻率數(shù),產(chǎn)生1khz的定時中斷Sys_Conf

44、ig(SystemCoreClock/1000);SystemCoreClock為對應(yīng)芯片的時鐘頻率SysTick定時器的寄存器只能在特權(quán)狀態(tài)下訪問。8 OS支持特性os支持特性簡介上下文切換是OS中很重要的一點,經(jīng)過前面的學(xué)習(xí),我們知道一個OS的運 行就是在不同任務(wù)間頻繁的切換,而在切換時,就需要對上一個任務(wù)的一些數(shù)據(jù) 進(jìn)行保存,然后進(jìn)入下一個任務(wù),并取出這個任務(wù)保存的數(shù)據(jù)。可以手動的實現(xiàn) 一個系統(tǒng)的上下文切換。處理器架構(gòu)實現(xiàn)了多個特性,保證了 OS設(shè)計的方便和高效: 影子棧指針。有兩個棧指針,MS刖于OS內(nèi)核以及中斷處理,PSP 用于應(yīng)用任務(wù)。 Systick定時器。處理器內(nèi)部的簡單的定時

45、器??蓪崿F(xiàn)任務(wù)的定時器 切換 SVCffi PendSV常。這兩種異常對于嵌入式 OS的操作非常重要,如 上下文的切換的實現(xiàn)等等。 非特權(quán)等級執(zhí)行,可以利用其實現(xiàn)一種基本安全模型SVC 和 PendSVsv的作請求管理調(diào)用,它既是一條指令,也是一種異常。 svC旨令就可以 進(jìn)入SVC#常中,之前說道過從非特權(quán)轉(zhuǎn)換到特權(quán)模式就可以使用 SVC#常的方 法。并且SVC#常通常是不能被打斷的,如果打斷就會出現(xiàn)硬件錯誤。PendSV常是為完成OS的上下文切換,并且PendSV勺異常等級要設(shè)置為 最低。這是因為如果PendSV勺異常等級比較高的話,當(dāng)其他異常來臨或正在執(zhí) 行時,上下文切換就會打斷其他異常

46、,上下文的切換較為復(fù)雜,就造成中斷延遲。 這在實時系統(tǒng)中是不可以的。所以要把 PendSV#常等級設(shè)置為最低,等待所有 中斷執(zhí)行完畢后,再進(jìn)行上下文切換。下圖是兩種方式的對比。任務(wù)切換一般有兩種方式,一種可以通過 systick中斷觸發(fā)PendSV異常, 比如在時間片式的任務(wù)中;對于手動方式,可以通過 SVC®發(fā)PendSV#常,完 成上下文切換。這里要說明一下的是,下面兩幅圖中省略了觸發(fā) PendSV勺過程, Systick異常優(yōu)先級是比較高的,它的作用簡單,只是觸發(fā) PendSV#常,它對 IRQ的搶占影響很小。優(yōu)先級上下文切換時間時間實際的上下文切換上下文切換操作由PendSV

47、常執(zhí)行處理,由于異常流程已經(jīng)保存了寄存器 的R0-R3 R12 LR xPSR和返回地址,PendSVft需將R4-R11保存到棧中。保存彳£務(wù)A的上下文指向任務(wù)B的上下文任務(wù)B的上下文恢復(fù)進(jìn)入PendSV存儲器PSP任務(wù)A的棧任務(wù)A的異常棧幀(R0-R3R12、LR、PCF 口 xPSRPSP array口STDMB任務(wù)A的R4-R11任務(wù)B日SP 任務(wù)A的SP存儲器任務(wù)B的棧任務(wù)B的異常棧幀(R0-R3R12、LRPCF 口 xPSR任務(wù)B的R4-R11加載下一個任務(wù)的PSP存儲器PSPLDMIA任務(wù)B的棧任務(wù)B的異常棧幀(R0-R3R12、LRPG 口 xPSR具有四個任務(wù)的多任務(wù)系統(tǒng)實例:/*字訪問的宏定義*/#define HW32_REG(ADDRESS)(volatile unsigned long *)ADDRESS)/*以上宏定義相當(dāng)于Int *p;p = (int*)0x;*p = 0x01;就是可以對ADDRESS址處賦值,也就是訪問這個字地址處的數(shù)據(jù)。*/V

溫馨提示

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

評論

0/150

提交評論