ARMCortex-M3內(nèi)核結(jié)構(gòu)_第1頁
ARMCortex-M3內(nèi)核結(jié)構(gòu)_第2頁
ARMCortex-M3內(nèi)核結(jié)構(gòu)_第3頁
ARMCortex-M3內(nèi)核結(jié)構(gòu)_第4頁
ARMCortex-M3內(nèi)核結(jié)構(gòu)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、ARM Cortex-M3 內(nèi)核結(jié)構(gòu)2.1 ARM Cortex-M3 處理器簡介2.1.1 概述ARM公司成立于上個世紀(jì)九十年代初,致力于處理器內(nèi)核研究,ARM 即 Advanced RISC Machines 的縮寫,ARM公司本身不生產(chǎn)芯片,只設(shè)計內(nèi)核,靠轉(zhuǎn)讓設(shè)計許可,由合作伙伴公司來生產(chǎn)各具特色的 芯片。這種運(yùn)行模式運(yùn)營的成果受到全球半導(dǎo)公司以及用戶的青睞。目前ARM體系結(jié)構(gòu)的處理器內(nèi)核有: ARM7TDMI、ARM9TDMI、ARM10TDMI、ARM11以及Cortex等。2005年ARM推出的ARM Cortex系列內(nèi)核,分別為:A系列、R系列和M系列,其中A系列是針對可以運(yùn)行復(fù)

2、雜操作系統(tǒng)(Linux、Windows CE、Symbian 等)的處理器;R系列是主要針對處理實時性要求較高的處理器(汽車電子、網(wǎng)絡(luò)、影像系統(tǒng));M系列 又叫微控制器,對開發(fā)費(fèi)用敏感,對性能要求較高的場合。Cortex-M系列目前的產(chǎn)品有M0、M1、M3,其中M1用在FPGA中。Cortex-M系列對微控制器和低成本應(yīng) 用提供優(yōu)化,具有低成本、低功耗和高性能的特點,能夠滿足微控制器設(shè)計師進(jìn)行創(chuàng)新設(shè)計的需求。其 中,ARM Cortex-M3處理器的性能是ARM7的兩倍,而功耗卻只有ARM7的1/3,適用于眾多高性能、極其低 成本需求的嵌入式應(yīng)用,如微控制器、汽車系統(tǒng)、大型家用電器、網(wǎng)絡(luò)裝置等

3、,ARM Cortex-M3提供了 32位微控制器市場前所未有的優(yōu)勢。Cortex-M3內(nèi)核,內(nèi)部的數(shù)據(jù)路徑為32位,寄存器為32位,存儲器接口也是32位。Cortex-M3采用了 哈佛結(jié)構(gòu),擁有獨立的指令總線和數(shù)據(jù)總線,可以讓取指與數(shù)據(jù)訪問分開進(jìn)行。Cortex-M3還提供一個 可選的MPU,對存儲器進(jìn)行保護(hù),而且在需要的情況下也可以使用外部的cache。另外在Cortex-M3中, 存儲器支持小端模式和大端存儲格式。Cortex-M3內(nèi)部還附贈了很多調(diào)試組件,用于在硬件水平上支持 調(diào)試操作,如指令斷點,數(shù)據(jù)觀察點等。另外,為支持更高級的調(diào)試,還有其它可選組件,包括指令跟 蹤和多種類型的調(diào)試

4、接口。2.1.2 內(nèi)核結(jié)構(gòu)組成及功能描述Cortex-M3微控制器內(nèi)核包括處理核心和許多的組件,目的是用于系統(tǒng)管理和調(diào)試支持。如圖2.1為 Cortex-M3內(nèi)核方框圖。NMI 中斷號239:0SLEEPING SLEEPDEEPNVICSysTick中斷睡眠CM3核調(diào)試指令數(shù)據(jù)MPUCortex-M3觸發(fā)ETMTPIUFPBDWTITM專用外 設(shè)總線SW-DP JTAG-DP專用外設(shè)總線(內(nèi)部) AHB-APAPBROM表總線矩陣I-code總線D-code總線系統(tǒng)總線總線矩陣系統(tǒng)總線(AHB)靜態(tài) RAM外部 RAM外部控制器設(shè)備AHB to APB 總線Flash 存 儲器SRAM 可選

5、配外部 RAMI/O外設(shè)總線UARTPWMTimer圖 2.1 Cortex-M3 內(nèi)核方框圖1.處理器內(nèi)核Cortex-M3處理器內(nèi)核采用ARMv7-M架構(gòu),其主要特性如下:lThumb-2指令集架構(gòu)(ISA)的子集,包含所有基本的16位和32位Thumb-2指令;l哈佛處理器架構(gòu),在加載/存儲數(shù)據(jù)的同時能夠執(zhí)行指令取指;l帶分支預(yù)測的三級流水線;l32位單周期乘法;l硬件除法;lThumb狀態(tài)和調(diào)試狀態(tài);l處理模式和線程模式;lISR的低延遲進(jìn)入和退出;l 可中斷-可繼續(xù)(interruptible-continued)的LDM/STM、PUSH/POP;l 支持ARMv6類型BE8/LE

6、;l支持ARMv6非對齊訪問。2.NVIC(嵌套向量中斷控制器)NVIC與處理器內(nèi)核是緊密耦合的,這樣可實現(xiàn)快速、低延遲的異常處理。在Cortex-M微控制器此功 能非常強(qiáng)大。3.總線矩陣總線矩陣用來將處理器和調(diào)試接口與外部總線相連。 處理器包含4 個總線接口:lICode 存儲器接口:從Code 存儲器空間(0x00000000x1FFFFFFF)的取指都在這條32 位 AHBLite 總線上執(zhí)行。lDCode 存儲器接口:對Code 存儲器空間(0x00000000x1FFFFFFF)進(jìn)行數(shù)據(jù)和調(diào)試訪問都 在這條32 位AHBLite 總線上執(zhí)行。l系統(tǒng)接口:對系統(tǒng)空間(0x2000000

7、00xDFFFFFFF)進(jìn)行取指、數(shù)據(jù)和調(diào)試訪問都在這條32 位 AHBLite 總線上執(zhí)行。l外部專用外設(shè)總線(PPB):對外部PPB 空間(0xE00400000xE00FFFFF)進(jìn)行數(shù)據(jù)和調(diào)試訪 問都在這條32 位APB 總線(AMBA v2.0)上執(zhí)行。跟蹤端口接口單元(TPIU)和廠商特定的 外圍器件都在這條總線上。注:處理器包含一條內(nèi)部專用外設(shè)總線,用來訪問嵌套向量中斷控制器(NVIC)、數(shù)據(jù)觀察點和 觸發(fā)(DWT)、Flash 修補(bǔ)和斷點(FPB),以及存儲器保護(hù)單元(MPU)。4.FPBFPB單元實現(xiàn)硬件斷點以及從代碼空間到系統(tǒng)空間的修補(bǔ)訪問,F(xiàn)PB有8個比較器。5.DWT數(shù)

8、據(jù)觀察點和跟蹤,調(diào)試功能部件。6.ITMITM是一個應(yīng)用導(dǎo)向(application driven)的跟蹤源,支持對應(yīng)用事件的跟蹤和printf類型的調(diào) 試。7.MPU存儲器保護(hù)單元(MPU)是用來保護(hù)存儲器的一個元件。處理器支持標(biāo)準(zhǔn)的ARMv7“受保護(hù)的存儲器 系統(tǒng)結(jié)構(gòu)”(PMSA)模型。如果希望向處理器提供存儲器保護(hù),則可以使用可選的MPU;MPU對訪問允許 和存儲器屬性進(jìn)行檢驗。它包含8個區(qū)和一個可選的執(zhí)行默認(rèn)存儲器映射訪問屬性的背景區(qū)。8.ETMETM支持指令跟蹤的低成本跟蹤宏單元。9.TPIUTPIU用作來自ITM和ETM(如果存在)的Cortex-M3內(nèi)核跟蹤數(shù)據(jù)與片外跟蹤端口分析

9、儀之間的橋接。10.SW/JTAG-DPCortex-M3處理器可配置為具有SW-DP或JTAG-DP調(diào)試端口的接口,或兩者都有。這兩個調(diào)試端口提 供對系統(tǒng)中包括處理器寄存器在內(nèi)的所有寄存器和存儲器的調(diào)試訪問。2.2 內(nèi)核寄存器組織如圖 2.2 所示,Cortex_M3 內(nèi)核寄存器分為 16 個通用寄存器 R0R15 和 7 個特殊功能寄存器。R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)低 寄 存 器通 用 寄 存 器高寄 存 器特殊狀態(tài)寄存器 功能中斷屏蔽寄寄存器 存器控制寄存器xPSRPRIMASKFAULTMASKBASEPRICO

10、NTROLMSP PSP圖 2.2 寄存器組織圖2.2.1 通用寄存器 R0-R15R0R12 寄存器:是真正意義上的通用。在處理器運(yùn)行過程中,作數(shù)據(jù)的寄存。R13 為堆棧指針寄存器:堆棧指針是用于訪問堆棧,也即系統(tǒng)的 RAM 區(qū)。Cortex_M3 中采用了兩個 堆棧指針:主堆棧指針(MSP)和進(jìn)程堆棧指針(PSP),R13 在任何時刻只能是其中一個,默認(rèn)情況為 MSP,可以通過控制寄存器(CONTORL)來改變。Cortex_M3 中堆棧方向是向低地址方向增長,為滿堆棧 機(jī)制。堆棧操作是通過 PUSH 和 POP 來完成操作的。例如 MSP 當(dāng)前指針指向:0x2000_000C;R0=0x

11、00000000。 執(zhí)行:PUSHR0此時 MSP 指向:0x2000_0008 執(zhí)行示意如圖 2.3 所示。已使用已使用上次壓入的數(shù)據(jù)未用未用RAMRAM0x2000_000C MSP向 下 生已使用已使用已使用0x00000000未用0x2000_0008長 MSP2.3 堆棧操作示意圖R14 程序連接寄存器(LR):在執(zhí)行分支(B)和鏈接(BL)指令或帶有交換分支(BX)和鏈接 指令(BLX)時,PC 的返回地址自動保存進(jìn) LR。比如在子程序調(diào)用時用保存子程序的返回地址。LR 也用于異常返回,但是在這里保存的是返回后的狀態(tài),不是返回的地址,異常返回是通過硬件自動出棧 彈出之前壓入的 PC

12、 完成的。R15 程序計數(shù)器(PC):是程序運(yùn)行的基礎(chǔ),具有自加的功能。該寄存器的位 0 始終為 0,因此,指令始終與字或半字邊界對齊。2.2.2 特殊功能寄存器特殊功能寄存器分為程序狀態(tài)寄存器、中斷屏蔽寄存器和控制寄存器三類。xPSR 程序狀態(tài)寄存器:系統(tǒng)級的處理器狀態(tài)可分為 3 類,應(yīng)用狀態(tài)寄存器(APSR)、中斷狀態(tài)寄 存器(IPSR)、執(zhí)行狀態(tài)寄存器(EPSR),可組合起來構(gòu)成一個 32 位的寄存器,統(tǒng)稱 xPSR。表 2.1 xPSR 寄存器寄存 器名位313029282726:252423:2019:1615:10987654:0APSRNZCVQIPSR中斷編號EPSRICI/I

13、TTICI/ITxPSR 寄存器的各位的功能如表 2.2:表 2.2 xPSR 寄存器各位功能位名稱定義31N負(fù)數(shù)或小于標(biāo)志:1:結(jié)果為負(fù)數(shù)或小于;0 結(jié)果為正數(shù)或大于30Z零標(biāo)志:1:結(jié)果為 0;0:結(jié)果為非 029C進(jìn)位/借位標(biāo)志:1:進(jìn)位或借位;0 沒有進(jìn)位或借位28V溢出標(biāo)志:1:溢出;0:沒有溢出27Q粘著飽和標(biāo)志:1:已飽和;0:沒有飽和26:2515:10ITIF-Then 位。它們是 if-Then 指令的執(zhí)行狀態(tài)位。 包含 if-Then 模塊的指令數(shù)目和它們的執(zhí)行條件24T用于指示處理器當(dāng)前是 ARM 狀態(tài)還是 Thumb 狀態(tài)15:12ICI可中斷-可繼續(xù)的指令位:如果在

14、執(zhí)行 LDM 或 STM 操作時產(chǎn)生一次中斷,則 LDM 或 STM 操作暫停,該位來保存該操作中下一個寄存器操作數(shù)的編號,在中斷響 應(yīng)之后,處理器返回由該位指向的寄存器并恢復(fù)操作。8:0ISR占先異常的編號中斷屏蔽寄存器:分為三組,分別是 PRIMASK、FAULTMASK、BASEPRI。PRIMASK 為片上外設(shè)總中斷開關(guān),該寄存器只有位 0 有效,當(dāng)該位為 0 是響應(yīng)所有外設(shè)中斷;當(dāng)該位為 1 時屏蔽所有片上外設(shè)中斷。FAULTMASK 寄存器管理系統(tǒng)錯誤的總開關(guān),該寄存器中有位 0 有效,當(dāng)該位為 0 時,響應(yīng)所有的異常;為 1 屏蔽所有的異常。BASEPRI 寄存器用來屏蔽優(yōu)先級等

15、于和小于某一個中斷數(shù)值的寄存器??刂萍拇嫫鳎篊ONTROL 有兩個作用,其一用于定義處理器特權(quán)級別,其二用于選擇堆棧指針,如表 3.3 所示。表 2.3 CONTROL 寄存器位功能CONTROL1堆棧指針選擇0:選擇主堆棧指針 MSP1:選擇進(jìn)程堆棧指針 PSPCONTROL00:特權(quán)級1:用戶級CONTROL0:異常情況下,處理器總是處于特權(quán)模式,CONTROL0位總是為 0;在線程模式情況下(非異常情況),處理器可以工作在特權(quán)級也可工作在用戶級,該位可為 0 或 1。特權(quán)級下所有的資源 都可以訪問,而用戶級下被限制的資源不能訪問,比如 MPU 被限制的資源。CONTROL1:為 0 時,

16、只使用 MSP,此時用戶程序和異常共享同一個堆棧,處理器復(fù)位后默認(rèn)的也 是該模式。為 1 時,用戶應(yīng)用程序使用進(jìn)程堆棧 PSP,而中斷任然得使用主堆棧 MSP。這種雙堆棧機(jī)制, 特別適合在帶有 OS(操作系統(tǒng))的環(huán)境下使用,只要 OS 內(nèi)核在特權(quán)級下執(zhí)行,而用戶應(yīng)用程序在用戶 模式下執(zhí)行,就可很好的將代碼隔離互不影響。2.3 處理器操作模式ARM Cortex-M3支持2個模式和兩個特權(quán)等級。如圖2.4所示,在嵌入式系統(tǒng)應(yīng)用程序中,程序代碼 涉及異常服務(wù)程序代碼和非異常服務(wù)程序代碼,這些代碼可以工作在處理器特權(quán)級也可以工作在用戶級 級,但有區(qū)別。當(dāng)處理器處在線程模式下時,既可以使用特權(quán)級,也可

17、以使用用戶級;另一方面,handler 模式總是特權(quán)級的。在復(fù)位后,處理器進(jìn)入線程模式特權(quán)級。特權(quán)級用戶級Handler 模式錯誤的用法線程模式線程模式異常 handler 的代碼 主應(yīng)用程序的代碼圖 2.4 操作模式和特權(quán)等級在線程模式用戶級下,對系統(tǒng)控制空間(SCS,0xE000E0000xE000EFFF,包括NVIC、SysTick、 MPU以及代碼調(diào)試控制所用的寄存器)的訪問將被禁止。除此之外,還禁止使用MRS/MSR訪問,除了APSR 之外的特殊功能寄存器。如果操作,則對于訪問特殊功能寄存器的,訪問操作被忽略;而對于訪問SCS 空間的,將產(chǎn)生錯誤。在特權(quán)級下不管是任何原因產(chǎn)生了任何

18、異常,處理器都將以特權(quán)級來運(yùn)行其服務(wù)例程,異常返回 后,系統(tǒng)將回到產(chǎn)生異常時所處的級別,同時特權(quán)級也可通過置位CONTROL0來進(jìn)入用戶級。用戶級下 的代碼不能再試圖修改CONTROL0來回到特權(quán)級。它必須通過一個異常handler,來修改CONTROL0, 才能在返回到線程模式后進(jìn)入特權(quán)級。如圖2.5所示。特權(quán)級 handler模式CONTROL0=1異常服務(wù) 例程CONTROL0=0異常服務(wù) 例程特權(quán)級 線 啟 動 程模式代碼用戶級 線 程模式異常異常用戶用戶程序程序特權(quán)級的 線程圖 2.5 處理器模式轉(zhuǎn)換圖把代碼按特權(quán)級和用戶級分開處理,有利于使Cortex-M3的架構(gòu)更加穩(wěn)定可靠。例如

19、,當(dāng)某個用戶 程序代碼出問題時,可防止處理器對系統(tǒng)造成更大的危害,因為用戶級的代碼是禁止寫特殊功能寄存器 和NVIC中寄存器的。另外,如果還配有MPU,保護(hù)力度就更大,甚至可以阻止用戶代碼訪問不屬于它的 內(nèi)存區(qū)域。在引入了嵌入式實時操作系統(tǒng)中,為了避免系統(tǒng)堆棧因應(yīng)用程序的錯誤使用而毀壞,我們可以給 應(yīng)用程序?qū)iT配一個堆棧,不讓它共享操作系統(tǒng)內(nèi)核的堆棧。在這個管理制度下,運(yùn)行在線程模式的用 戶代碼使用PSP,而異常服務(wù)例程則使用MSP。這兩個堆棧指針的切換是智能全自動的,在異常服務(wù)的始 末由Cortex-M3硬件處理。如前所述,特權(quán)等級和堆棧指針的選擇均由CONTROL負(fù)責(zé)。 當(dāng)CONTROL0

20、=0,在異常處理的始末,只發(fā)生了處理器模式的轉(zhuǎn)換,如圖2.6所示。 若CONTROL0=1(線程模式+用戶級),則在中斷響應(yīng)的始末,處理器模式和特權(quán)等級都要發(fā)生變化,如圖2.7所示。 CONTROL0只有在特權(quán)級下才能訪問。用戶級的程序如想進(jìn)入特權(quán)級,通常都是使用一條“系統(tǒng)服務(wù)呼叫指令(SVC)”來觸發(fā)“SVC異?!?,該異常的服務(wù)例程可以視具體情況而修改CONTROL0。中斷事件中斷服務(wù)程序中斷返回主程序入棧出棧線 程 模 式(特權(quán)級)Handler 模 式(特權(quán)級)線 程 模 式(特權(quán)級)圖 2.6 中斷前后的狀態(tài)轉(zhuǎn)換中斷事件中斷服務(wù)程序中斷返回主程序入棧出棧線 程 模 式(用戶級)Hand

21、ler 模 式(特權(quán)級)線 程 模 式(用戶級)圖 2.7 中斷前后的狀態(tài)轉(zhuǎn)換+特權(quán)等級切換2.4 存儲器系統(tǒng)2.4.1 存儲器映射Cortex-M3 采用了固定的存儲映射結(jié)構(gòu),如圖 2.8 所示。Cortex-M3 的地址空間是 4GB, 程序可以在代碼區(qū),內(nèi)部 SRAM 區(qū)以及外部 RAM 區(qū)中執(zhí)行。但是因為 指令總線與數(shù)據(jù)總線是分開的,最理想的是把程序放到代碼區(qū),從而使取指和數(shù)據(jù)訪問各自使用己的總 線。內(nèi)部 SRAM 區(qū)的大小是 512MB,用于讓芯片制造商連接片上的 SRAM,這個區(qū)通過系統(tǒng)總線來訪問。 在這個區(qū)的下部,有一個 1MB 的區(qū)間,被稱為“位帶區(qū)”。該位帶區(qū)還有一個對應(yīng)的

22、32MB 的 “位帶別 名(alias)區(qū)”,容納了 8M 個“位變量”(對比 8051 的只有 128 個位變量),位帶區(qū)對應(yīng)的是最低的 1MB 地址范圍,而位帶別名區(qū)里面的每個字對應(yīng)位帶區(qū)的一個比特。位帶操作只適用于數(shù)據(jù)訪問,不適 用于取指。通過位帶的功能,可以把多個布爾型數(shù)據(jù)打包在單一的字中,卻依然可以從位帶別名區(qū)中, 像訪問普通內(nèi)存一樣地使用它們。位帶別名區(qū)中的訪問操作是原子的,消滅了傳統(tǒng)的“讀改寫”三 步。ROM外部 PPBETMTPIU0xE00FFFFF0xE00FF0000xE00420000xE00410000xE0040000保留NVIC保留FPBDWTITM0xE003F

23、FFF0xE000F0000xE000E0000xE00030000xE00020000xE00010000xE000000032MB 位帶別名區(qū)31MB1MB 位帶區(qū)0x43FFFFFF0x420000000x41FFFFFF0x401000000x4000000032MB 位帶別名區(qū)31MB1MB 位帶區(qū)0x23FFFFFF0x220000000x21FFFFFF0x201000000x200000000xFFFFFFFF芯片廠商定義內(nèi)核 私有 區(qū)域 512MB外部私有外設(shè)總線內(nèi)部私有外設(shè)總線片外外設(shè) 1.0GB片外 RAM 1.0GB片上外設(shè)區(qū) 512MB片上 SRAM 512MB代碼區(qū)

24、 512MB0xE01000000xE00FFFFF0xE00400000xE003FFFF0xE00000000xDFFFFFFF0xA00000000x9FFFFFFF0x600000000x5FFFFFFF0x400000000x3FFFFFFF0x200000000x1FFFFFFF0x00000000圖 2.8 Cortex-M3 存儲器映射圖片上外設(shè)對應(yīng) 512MB 的空間,芯片上所有與外圍設(shè)備相關(guān)的寄存器都位于該區(qū)域。這個區(qū)中也有一 條 32MB 的位帶別名,以便于快捷地訪問外設(shè)寄存器,用法與內(nèi)部 SRAM 區(qū)中的位帶相同。例如,可以方 便地訪問各種控制位和狀態(tài)位。要注意的是,外

25、設(shè)區(qū)內(nèi)不允許執(zhí)行指令。通常半導(dǎo)體廠商就是修改此區(qū) 域的片上外設(shè),來達(dá)到各具特色的、個性化的設(shè)備。還有兩個 1GB 的范圍,分別用于連接外部 RAM 和外部設(shè)備,它們之中沒有位帶。兩者的區(qū)別在于外 部 RAM 區(qū)允許執(zhí)行指令,而外部設(shè)備區(qū)則不允許。最后還剩下 0.5GB 的隱秘地帶,包括了系統(tǒng)級組件,內(nèi)部私有外設(shè)總線,外部私有外設(shè)總線,以及 由提供者定義的系統(tǒng)外設(shè)。私有外設(shè)總線有兩條:AHB 私有外設(shè)總線,只用于 CM3 內(nèi)部的 AHB 外設(shè),它們是:NVIC, FPB, DWT 和 ITM。APB 私有外設(shè)總線,既用于 CM3 內(nèi)部的 APB 設(shè)備,也用于外部設(shè)備(這里的“外部”是對內(nèi)核而言)

26、。 Cortex-M3 允許器件制造商再添加一些片上 APB 外設(shè)到 APB 私有總線上,它們通過 APB 接口來訪問。NVIC 所處的區(qū)域叫做“系統(tǒng)控制空間(SCS)”,在 SCS 里的除了 NVIC 外,還有 SysTick、MPU 以 及代碼調(diào)試控制所用的寄存器。最后,未用的提供商指定區(qū)也通過系統(tǒng)總線來訪問,但是不允許在其中執(zhí)行指令。2.4.2 位帶操作在Cotex-M3存儲器映射中包括兩個位操作區(qū)。分別位于SRAM和片上外設(shè)存儲區(qū)的最低1MB空間中。 這兩個位帶中的地址除了可以像普通的RAM一樣使用外,它們還都有自己的“位帶別名區(qū)”,位帶別名 區(qū)把每個比特膨脹成一個32位的字形成位地址

27、。當(dāng)你通過位帶別名區(qū)訪問這些字時,就可以達(dá)到訪問原 始比特的目的,其對應(yīng)關(guān)系如圖2.8所。位地址與位別名對應(yīng)關(guān)系統(tǒng)如下: 對于 SRAM 位帶區(qū)的某個位:Aliasaddr = 0x22000000+ (A - 0x20000000) ´ 8 + n) ´ 4= 0x22000000+ ( A - 0x20000000) ´ 32 + n ´ 4對于片上外設(shè)位帶區(qū)的某個位:Aliasaddr = 0x42000000+ (A - 0x40000000) ´ 8 + n) ´ 4= 0x42000000+ ( A - 0x4000000

28、0) ´ 32 + n ´ 4在上述表達(dá)式中,A 表示要操作的位所在的字節(jié)地址,n(0n7)表示位序號。0x23FFFFFC 0x23FFFFF8 0x23FFFFF4 0x23FFFFF0 0x23FFFFEC 0x23FFFFE8 0x23FFFFE4 0x23FFFFE0位帶別名區(qū)(共 32MB)0x2200001C 0x22000018 0x22000014 0x22000010 0x2200000C 0x22000008 0x22000004 0x220000007 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6

29、 5 4 3 2 1 00x200FFFFF0x200FFFFE0x200FFFFD0x200FFFFCSRAM 位帶區(qū)(共 1MB)7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 00x200000030x200000020x200000010x200000002.9 位操作對應(yīng)關(guān)系圖舉例:將地址 0x20000000 的第 2 位置 1。通過上述計算關(guān)系,可計算出位帶別名為 0x22000008。 如程序清單 L2.1 所示。程序清單 L2.1 SRAM 位操作實例 LDR R0,=0x22000008 LDR R

30、1,=0x01 STR R1,R0將片上外設(shè) I/O 端口的 A 口的第 0 位(也即 PORTA0)為輸出,其 A 口的方向寄存器地址為 0x40004400,設(shè)置 1 作為輸出,可根據(jù)上述關(guān)系計算出位帶別名為 0x42088000。如程序清單 L2.2 所示。程序清單 L2.2 片上外設(shè)位操作實例LDR R0,=0x42088000 LDR R1,=0x01STR R1,R0注:采用大端格式時,對位邦定別名區(qū)的訪問必須以字節(jié)方式,否則訪問不可預(yù)知。2.5 異常ARM Cortex-M3 中異常涉及異常的類型、優(yōu)先級、向量表等,本節(jié)并以 Luminary 系列微控制器為 例說明異常的具體行為

31、。2.5.1 異常類型在 Cortex-M3 中有 一個 與內(nèi) 核緊 耦 合部 件叫 嵌套向 量 中斷 控制 器( NVIC, Nested Vectored Interrupt Controller),定義了 16 種系統(tǒng)異常和 240 路外設(shè)中斷。通常芯片設(shè)計者可自由設(shè)計片上外設(shè),因此具體的片上外設(shè)中斷都不會用到多達(dá) 240 路。如表 2.4 所示系統(tǒng)異常類型,表 2.5 所示為外設(shè) 中斷類型。Cortex-M3 中目前只有 11 種系統(tǒng)異??捎梅謩e是:系統(tǒng)復(fù)位、NMI(不可屏蔽中斷)、硬件故障、 存儲器管理、總線故障、用法故障、SVCall(軟件中斷)、調(diào)試監(jiān)視器中斷、PendSV(系統(tǒng)

32、服務(wù)請求)、 SysTick(24 位定時器中斷)。240 路外設(shè)中斷,是指片上外設(shè)的各模塊,比如 I/O 口、UART 通信接口、 SSI 總線接口等所需的中斷。表 2.4 異常類型編號類型優(yōu)先級描述0-復(fù)位時載入向量表的第一項作為主堆棧棧頂?shù)刂贰?復(fù)位-3復(fù)位。2NMI-2不可屏蔽中斷(來自外部 NMI 輸入腳)。3硬故障-1當(dāng)故障由于優(yōu)先級或者是可配置的故障處理程序被禁止的原因 而無法激活時,所有類型故障都會以硬故障的方式激活。4存儲器管理可編程MPU 不匹配,包括訪問沖突和不匹配。5總線故障可編程預(yù)取指故障、存儲器訪問故障和其它地址/存儲器相關(guān)的故障。6用法故障可編程由于程序錯誤導(dǎo)致的

33、異常,通常是使用一條無效指令,或都是非 法的狀態(tài)轉(zhuǎn)換。7-10保留-保留11SVCall可編程執(zhí)行 SVC 指令的系統(tǒng)服務(wù)調(diào)用。12調(diào)試監(jiān)視器可編程調(diào)試監(jiān)視器(斷點,數(shù)據(jù)觀察點,或是外部調(diào)試請求)13保留-14PendSV可編程系統(tǒng)服務(wù)的可觸發(fā)(pendable)請求。15SysTick可編程系統(tǒng)節(jié)拍定時器。表 2.5 中斷類型編號類型優(yōu)先級描述16IRQ#0可編程外設(shè)中斷#017IRQ#1可編程外設(shè)中斷#1255IRQ#239可編程外設(shè)中斷#2392.5.2 優(yōu)先級Cortex-M3 的異常功能非常強(qiáng)大,機(jī)制非常靈活,異??梢酝ㄟ^占先、末尾連鎖和遲來等處理來降 低中斷的延遲。優(yōu)先級決定了處理

34、器何時以及怎樣處理異常。Cortex-M3 支持 3 個固定的高優(yōu)先級和多達(dá) 256 級的可編程優(yōu)先級,并且支持 128 級搶占,絕大多 數(shù)芯片都會精簡設(shè)計,實際中支持的優(yōu)先級數(shù)會更少,如 8 級、16 級、32 級等,通常的做法是裁掉表 達(dá)優(yōu)先級的幾個低端有效位(防止優(yōu)先級反轉(zhuǎn)),以減少優(yōu)先級的級數(shù)。比如 Luminary 的芯片采用 8 級優(yōu)先級。Cortex-M3 中 NVIC 支持由軟件指定的可配置的優(yōu)先級(稱為軟件優(yōu)先級),其寄存器地址為: 0xE000_E400-0xE000_E4EF。通過對中斷優(yōu)先級寄存器的 8 位 PRI_N 區(qū)執(zhí)行寫操作,來將中斷的優(yōu)先級 指定為 0-255

35、。硬件優(yōu)級隨著中斷中的增加而降低。0 優(yōu)先級最高,255 優(yōu)先級最低。指定軟件優(yōu)先級 后,硬件優(yōu)先級無效。例如:如果將 INTISR0指定為優(yōu)先級 1,INTISR31指定為優(yōu)先級 0,則 INTISR0 的優(yōu)先級比 INTISR31低。為了對具有大量中斷的系統(tǒng)加強(qiáng)優(yōu)先級控制,Cortex-M3 支持優(yōu)先級分組,通過 NVIC 控制,設(shè)置 為占先優(yōu)先級和次優(yōu)先級。可通過對應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR,地址為:0xE000_ED00) 的10:8位進(jìn)行設(shè)置。如果有多個激活異常共用相同的組優(yōu)先級,則使用次優(yōu)先級區(qū)來決定同組中的異 常優(yōu)先級,這就是同組內(nèi)的次優(yōu)先級。如表 2.6 應(yīng)用程序

36、中斷及復(fù)位控制寄存器,表 2.7 為占先優(yōu)先級 和次優(yōu)級的關(guān)系。表 26 應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR,地址:0xE000ED00)位段名稱類型復(fù)位值描述31:16VECTKEYRW-訪問鑰匙:任何對該寄存器的寫操作,都必須同時 把 0x05FA 寫入此段,否則寫操作被忽略。若讀取此半字,則讀回值為 0xFA05。15ENDIANESSR-指示端設(shè)置。1:大端,0:小端。10:8PRIGROUPR/W0優(yōu)先級分組2SYSRESETREQW-請求芯片控制邏輯產(chǎn)生一次復(fù)位1VECTCLRACTIVEW-清零所有異常的活動狀態(tài)信息。通常只在調(diào)試時 用,或都在 OS 從錯誤中恢復(fù)時用。0V

37、ECTRESETW-復(fù)位 Coretex-M3 微控制器內(nèi)核。表 2.7 搶占優(yōu)先級和次優(yōu)先級分組位置的關(guān)系分組位置表達(dá)搶占優(yōu)先級的位段表達(dá)亞優(yōu)先的位段07:10:017:21:027:32:037:43:047:54:057:65:067:76:07無7:0所有位注:表 2.7 顯示了利用優(yōu)先級的 8 個位來配置處理器優(yōu)先級。如果使用小于 8 的位來配置處理 器的優(yōu)先級,則寄存器的低位始終為 0,例如,如果使用 3 個位來配置優(yōu)先級,則 PRI_N7:5用來配置 優(yōu)先級,而 PRI_N4:0為 4b0000。2.5.3 中斷向量表當(dāng)發(fā)生了異常并且要響應(yīng)它時,Cortex-M3 需要定位其服務(wù)

38、例程的入口地址。這此入口地址存儲在 所謂“異常向量表”中。缺省情況下,Cortex-M3 認(rèn)為該表位于零地址處,且各向量占用 4 字節(jié)。因此 每個表項占用 4 字節(jié),復(fù)位后的向量表如表 2.8 所列。表 2.8 復(fù)位后向量表地址異常編號值(32 位整數(shù))0x0000_0000-MSP 的初始值0x0000_00041復(fù)位向量(PC 初始值)0x0000_00082NMI 服務(wù)例程的入口地址0x0000_000C3硬 fault 服務(wù)例程的入口地址其它異常服務(wù)例程的入口地址向量表中的第 1 個字為指向堆棧棧頂?shù)闹羔?,?fù)位時內(nèi)核讀取該地址的數(shù)據(jù)設(shè)置主堆棧。 向量表的基地址可以通過 NVIC 中的向

39、量偏移寄存器(0xE000ED08)來設(shè)置,如表 2.9 所示。從表中可以看出,可以將異常向量表放在 Code 區(qū)也可以將其放在 RAM 區(qū),起始地址也可改變,起始地址是 有要求的:必須先求出系統(tǒng)中共有多少個向量,再把這個數(shù)字向上記到 2 的整次冪,而起始地址必須對齊到后者的邊界上。例如,如果一共有 32 個中斷,則共有 32+16(系統(tǒng)異常)=48 個向量,向上記到 2的整數(shù)次冪后值為 64,因此向量表重定位的地址必須能被 64 X 4=256 整除。表 2.9 向量偏移量寄存器(0xE000ED08)位段名稱類型復(fù)位值描述29TBLOFFR-向量表是在 Code 區(qū)(0),還是在 RAM

40、區(qū)(1)7-28TBLBASER/W0向量表的起始地址向量表中至少需要有 4 個值:棧頂?shù)刂罚粡?fù)位程序的位置;NMI 異常的位置;硬故障的異常的位置。 當(dāng)中斷使能時,不管向量表的位置在哪,它指向所有使能屏蔽的異常。并且如果使用 SVC 指令,還需要指定 SVCCall ISR 的位置。2.5.4 異常的進(jìn)入與退出1異常進(jìn)入入棧:當(dāng)處理器發(fā)生異常時,首先自動把 8 個寄存器(xPSR、PC、LR、R12、R3、R2、R1、R0)壓 入棧,處理器自動完成,在自動入棧的過程中,把寄存器寫入棧的時間順序,并不是寫入空間相對應(yīng)的, 但機(jī)器會保證正確的寄存器被保存到正確的位置,如圖 2.10 所示,假設(shè)入

41、棧,棧地址為 N。N-8N-4N-32N-28N-24N-20N-16N-12地址PCPSRR0R1R2R3R12LR數(shù)據(jù)時間2.10 內(nèi)部入棧示意圖取向量:發(fā)生異常,緊接著內(nèi)核將根據(jù)向量表找出正確的異常向量,然后在服務(wù)程序的入口處預(yù)取 指,處理器將取指與取數(shù)據(jù)分別能過總線控制,使入棧與取指這兩項工作能同時進(jìn)行,以便快速進(jìn)入中 斷。更新寄存器:入棧和取向量操作完成之后,在執(zhí)行服務(wù)程序之前,還必須更新一系列寄存器。 SP:在入棧后會把堆棧指針(PSP或MSP)更新到新的位置。在執(zhí)行服務(wù)例程時,將由MSP負(fù)責(zé)對堆棧的訪問。PSR:更新IPSR位段(地處PSR的最低部分)的值為新響應(yīng)的異常編號。 P

42、C:在取向量完成后,PC將指向服務(wù)例程的入口地址, LR:在出入ISR的時候,LR的值將得到重新的詮釋,這種特殊的值稱為“EXC_RETURN”,在異常進(jìn)入時由系統(tǒng)計算并賦給LR,并在異常返回時使用它。 以上是在響應(yīng)異常時通用寄存器及特殊功能寄存器的變化。另外在NVIC中,也會更新若干個相關(guān)寄存器。2異常退出當(dāng)異常服務(wù)程序最后一條指令將進(jìn)入異常時的 LR 的值加載到 PC 中。該操作指示中斷服務(wù)結(jié)束,在 從異常返回時處理器將執(zhí)行下列操作之一:如果激活異常的優(yōu)先級比所有被壓棧(等待處理)的異常的優(yōu)先級都高,則處理器會末尾連鎖到一 個激活異常。如果沒有激活異常,或者如果被壓棧的異常的最高優(yōu)先級比激

43、活異常的最高優(yōu)先級要高,則處理器 返回到上一個被壓棧的中斷服務(wù)程序。如果沒有激活的中斷或被壓棧的異常,則處理器返回線程模式。 在啟動了中斷返回序列后,下述的處理就將進(jìn)行: 出棧:先前壓入棧中的寄存器在這里恢復(fù)。內(nèi)部的出棧順序與入棧時的相對應(yīng),堆棧指針的值也改回先前的值。更新NVIC寄存器:伴隨著異常的返回,它的活動位也被硬件清除。對于外部中斷,倘若中斷輸入再 次被置為有效,懸起位也將再次置位,新一次的中斷響應(yīng)序列也可隨之再次開始。異常返回值:異常返回值存放在LR中。這是一個高28位全為1的值,只有3:0的值有特殊含義,如 表2.10所示。當(dāng)異常服務(wù)例程把這個值送往PC時,就會啟動處理器的中斷返

44、回序列。因為LR的值是由 Cortex-M3自動設(shè)置的,所以只要沒有特殊需求,就不要改動它。表 2.10 EXC_RETURN 各位含義位段含義31:4EXC_RETURN的標(biāo)識:必須全為1。30=返回后進(jìn)入處理器模1=返回后進(jìn)入線程模式。20=從主堆棧中做出棧操作,返回后使用MSP 1=從進(jìn)程堆棧中做出棧操作,返回使用PSP。1保留,必須為0。00=返回ARM狀態(tài)1=返回Thumb狀態(tài)。Cortex-M3中必須為1。因此,上述表格中EXC_RETURN的值有三種情況: 0xFFFF_FFF1:返回處理器模式;0xFFFF_FFF9:返回線程模式,并使用主堆棧;0xFFFF_FFFD:返回線程

45、模式,并使用線程堆棧。 例如系統(tǒng)中使用了PendSV異常,服務(wù)程序結(jié)束時由處理模式返回到線程模式前使用進(jìn)程堆棧,如程序清單L2.3所示。程序清單 L2.3 異常返回類型實例OSPendSV;異常服務(wù)程序LDR LR,=0Xfffffffd;返回到線程模式進(jìn)程堆棧 BX LR2.5.5 Cortex-M3 異常處理機(jī)制1末尾連鎖末尾連鎖能夠在兩個中斷之間沒有多余的狀態(tài)保存和恢復(fù)指令的情況下實現(xiàn)異常背對背處理。如圖 2.11 所示。在退出 ISR 并進(jìn)入另一個中斷時,處理器省略了 8 個寄存器的出棧和入棧操作。如果當(dāng)前 掛起中斷的優(yōu)先級比所有被壓棧的異常的優(yōu)先級都高。則處理器執(zhí)行末尾連鎖機(jī)制。如果

46、掛起中斷的優(yōu) 先級比被壓棧的異常的最高優(yōu)先級都高,則省略壓棧和出棧操作,處理器立即取出掛起的中斷向量。在 退出前一個 ISR 之后,開始執(zhí)行被末尾連鎖的 ISR。用戶程序優(yōu)先級 3優(yōu)先級 2中斷 1壓棧中斷 2中斷 1中斷 2中斷 1 結(jié)束出棧圖 2.11 末尾連鎖示意圖2異常遲來在 Cortex-M3 中遲來中斷的意思是如果前一個 ISR 還沒有進(jìn)入執(zhí)行階段,并且遲來中斷的優(yōu)先級比 前一個中斷的優(yōu)先級要高,則遲來中斷能夠搶占前一個中斷。如圖 2.12 所示。用戶程序優(yōu)先級 3中斷 1優(yōu)先級 2中斷 2中斷 1中斷 2壓棧繼續(xù)壓棧 出棧圖 2.12 遲來異常示意圖響應(yīng)遲來中斷時需執(zhí)行新的取向量

47、地址和 ISR 預(yù)取操作。遲來中斷不保存狀,因為狀態(tài)保存已經(jīng)被 最初的中斷執(zhí)行過了,因此不需要重復(fù)執(zhí)行。2.5.6 嵌套向量中斷控制器嵌套向量中斷控制器,簡稱NVIC,完成對中斷的響應(yīng)。NVIC共支持1至240個外部中斷輸入(通常外 部中斷寫作IRQs)。具體的數(shù)值由芯片廠商在設(shè)計芯片時決定。NVIC的訪問地址是0xE000_E000。所有NVIC的中斷控制/狀態(tài)寄存器都只能在特權(quán)級下訪問。不過有 一個例外軟件觸發(fā)中斷寄存器可以在用戶級下訪問以產(chǎn)生軟件中斷。所有的中斷控制、狀態(tài)寄存器均可 按字、半字、字節(jié)的方式訪問。中斷配置內(nèi)容:u使能與禁止寄存器u掛起與解掛寄存器u優(yōu)先級寄存器u活動狀態(tài)寄存

48、器 另外,下列寄存器也對中斷處理有重大影響:u異常掩蔽寄存器u向量表偏移寄存器u軟件觸發(fā)中斷寄存器u優(yōu)先級分組寄存器Cortex-M3 中異常及中斷的行為如圖 2.13 所示。分成三級,由 NVIC 負(fù)責(zé)管理。第三級第二級第一級 中斷掛起NVIC_PEND中斷解掛 NVIC_CLRPEND外設(shè)中斷源中斷使能NVIC_EN中斷禁止 NVIC_DIS優(yōu)先級設(shè)置 NVIC_PRI激活位設(shè)置 NVIC_ACTIVEPRIMASK中斷控制及狀態(tài) 寄存器NVIC_INT_CTRL優(yōu)先級設(shè)置NVIC_SYS_PRI系統(tǒng)處理控制與狀態(tài) 寄存器 NVIC_SYS_HAND_CTRL內(nèi)核FLAUTMASK系統(tǒng)異常

49、源圖 2.13 異常和中斷控制示意圖1.中斷的使能與禁止此處的中斷使能與禁止,主要是針對片上外設(shè) 240 路中斷的控制,使能是向 SETENA 寄存器對應(yīng)位 寫“1”,禁止是向 CLRENA 寄存器對應(yīng)位寫“1”。如表 2.11 所示。表 2.11 SETENA/CLRENA 寄存器族名稱類型地址復(fù)位值描述SETENA0R/W0xE000_E1000中斷 0-31 的使能寄存,共 32 個使能位n,中斷#n 使能(異常號 16+n)SETENA1R/W0xE000_E1040中斷 32-63 使能寄存器,共 32 個使能位SETENA7R/W0xE000_E11C0中斷 224-239 使能寄存器,16 個使能位CL

溫馨提示

  • 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

提交評論