《ARM Cortex嵌入式系統(tǒng)開發(fā)教程》課件第2章_第1頁
《ARM Cortex嵌入式系統(tǒng)開發(fā)教程》課件第2章_第2頁
《ARM Cortex嵌入式系統(tǒng)開發(fā)教程》課件第2章_第3頁
《ARM Cortex嵌入式系統(tǒng)開發(fā)教程》課件第2章_第4頁
《ARM Cortex嵌入式系統(tǒng)開發(fā)教程》課件第2章_第5頁
已閱讀5頁,還剩108頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第2章ARMCortex-M3體系結(jié)構(gòu)2.1ARMCortex-M3編程模型2.2ARMCortex-M3寄存器組織2.3ARMCortex-M3存儲器2.4ARMCortex-M3異常處理2.5NVIC與中斷控制

處理器的“體系結(jié)構(gòu)”是指從程序員的角度觀察到的處理器組織方式,所以又稱為處理器的編程模型。其主要內(nèi)容為處理器內(nèi)的寄存器組織、對存儲器的尋址方式、指令系統(tǒng)等。

本章將介紹ARMCortext-M3編程模型、工作狀態(tài)與工作模式、ARM和Thumb狀態(tài)的寄存器組織、存儲器組織結(jié)構(gòu)、異常及協(xié)處理器接口等一些基本概念,還將講述ARM的編程基礎(chǔ),如ARM微處理器的基本工作原理、與程序設(shè)計(jì)相關(guān)的基本技術(shù)細(xì)節(jié)等。

2.1.1ARMCortex-M3處理器的編程模型

ARMCortex-M3是ARM公司推出的下一代新生內(nèi)核,它是一款低功耗處理器,具有門數(shù)目少、中斷延遲短、調(diào)試成本低的特點(diǎn),是為要求有快速中斷響應(yīng)能力的深度嵌入式應(yīng)用而設(shè)計(jì)的。2.1ARMCortex-M3編程模型ARMCortex-M3CPU具有3級流水線、哈佛結(jié)構(gòu)、獨(dú)立的本地指令、數(shù)據(jù)總線以及用于外設(shè)的稍微低性能的第三條總線,可提供系統(tǒng)增強(qiáng)型特性,例如現(xiàn)代化調(diào)試特性和支持更高級別的塊集成。ARMCortex-M3CPU還包含一個支持隨機(jī)跳轉(zhuǎn)的內(nèi)部預(yù)取指單元。

Cortex-M3處理器采用ARMv7-M架構(gòu),它包括所有的16位Thumb指令集和基本的32位Thumb-2指令集架構(gòu)。Cortex-M3處理器不能執(zhí)行ARM指令。Thumb指令集是ARM指令集的子集,重新被編碼為16位,它支持較高的代碼密度以及16位或小于16位的存儲器數(shù)據(jù)總線系統(tǒng)。Thumb-2在Thumb指令集架構(gòu)(ISA)上進(jìn)行了大量的改進(jìn),與Thumb相比,它的代碼密度更高,并且通過使用16/32位指令,可提供更高的性能。

Cortex-M3處理器整合了以下組件:

(1)

ARMv7-M處理器內(nèi)核。Thumb-2ISA子集,包含所有基本的16位和32位Thumb-2指令、硬件除法指令、處理模式(HandlerMode)和線程模式(ThreadMode)、Thumb狀態(tài)和調(diào)試狀態(tài)、可中斷-可繼續(xù)(Interruptible-Continued)的LDM/STM及PUSH/POP,以實(shí)現(xiàn)低中斷延遲,自動保存和恢復(fù)處理器狀態(tài),可實(shí)現(xiàn)低延遲地進(jìn)入和退出中斷服務(wù)程序(ISR)。

(2)嵌套向量中斷控制器(NVIC)。NVIC可與處理器內(nèi)核緊密結(jié)合實(shí)現(xiàn)低延遲中斷處理,并具有以下特性:外部中斷可配置為1~240個,優(yōu)先級位可配置為3~8位,中斷優(yōu)先級可動態(tài)地重新配置,優(yōu)先級分為占先中斷等級和非占先中斷等級,支持末尾連鎖(Tail-Chaining)和遲來(LateArrival)中斷。

(3)存儲器保護(hù)單元(MPU)。MPU功能可選,用于對存儲器進(jìn)行保護(hù)。

(4)總線接口。包括AHBLiteICode、DCode和系統(tǒng)總線接口,APB專用外設(shè)總線(PPB)接口,支持bit-band方式的原子寫和讀訪問。

(5)低成本調(diào)試解決方案。當(dāng)內(nèi)核正在運(yùn)行、被中止或處于復(fù)位狀態(tài)時,能對系統(tǒng)中包括Cortex-M3寄存器組在內(nèi)的所有存儲器和寄存器進(jìn)行調(diào)試訪問;支持串行線(SW-DP)或JTAG(JTAG-DP)調(diào)試訪問;支持Flash修補(bǔ)和斷點(diǎn)單元(FPB),實(shí)現(xiàn)斷點(diǎn)和代碼修補(bǔ);支持?jǐn)?shù)據(jù)觀察點(diǎn)和觸發(fā)單元(DWT),實(shí)現(xiàn)觀察點(diǎn)、觸發(fā)資源和系統(tǒng)分析(Systemprofiling);實(shí)現(xiàn)了儀表跟蹤宏單元(ITM),支持對printf類型的調(diào)試;提供跟蹤端口的接口單元(TPIU),用來連接跟蹤端口分析儀;提供可選的嵌入式跟蹤宏單元(ETM),實(shí)現(xiàn)指令跟蹤。

Cortex-M3處理器的內(nèi)核模塊框圖如圖2.1所示。

圖2.1ARMCortex-M3內(nèi)核模塊框圖

Cortex-M3處理器專門針對快速和簡單的編程而設(shè)計(jì),用戶無需深厚的架構(gòu)知識或編寫任何匯編代碼就可以建立簡單的應(yīng)用程序。Cortex-M3處理器帶有一個簡化的基于棧的編程模型,該模型與傳統(tǒng)的ARM架構(gòu)兼容,Cortex-M3與傳統(tǒng)的8位、16位架構(gòu)所使用的系統(tǒng)相似,它簡化了8位、16位到32位的轉(zhuǎn)換過程。此外,使用基于硬件的中斷機(jī)制意味著編寫中斷服務(wù)程序(handlers)不再重要。在不需要匯編代碼寄存器操作的情況下,啟動代碼得到了大大的簡化。在位字段處理、硬件除法和If/Then指令的協(xié)助下,Thumb-2指令集架構(gòu)(InstructionSetArchitecture,ISA)底層的關(guān)鍵特性使C代碼的執(zhí)行變得更加自然。在開發(fā)方面,Thumb-2指令自動優(yōu)化了性能和代碼密度,在無需交互使用ARM代碼和Thumb代碼的情況下加快了開發(fā)的進(jìn)程,簡化了編譯目標(biāo)的長期維護(hù)和支持工作。如此一來,用戶不但可以繼續(xù)使用C代碼,而且還免去了建立預(yù)編譯目標(biāo)代碼庫的麻煩,代碼在更大程度上獲得了重復(fù)利用。2.1.2Cortex-M3處理器的工作狀態(tài)和工作模式

1.Cortex-M3的工作狀態(tài)

Cortex-M3處理器有以下兩種工作狀態(tài):

(1)

Thumb狀態(tài)。這是16位和32位半字對齊的Thumb和Thumb-2指令的正常執(zhí)行狀態(tài)。

(2)調(diào)試狀態(tài)。處理器停機(jī)調(diào)試時進(jìn)入該狀態(tài)。

與ARM7處理器不同,Cortex-M3處理器不支持ARM指令的執(zhí)行,也即沒有ARM狀態(tài)。

2.Cortex-M3的工作模式

Cortex-M3處理器支持兩種工作模式:線程模式(threadmode)和處理模式(handlermode)。

在復(fù)位時,Cortex-M3處理器進(jìn)入線程模式,異常返回時也會進(jìn)入該模式。特權(quán)和用戶(非特權(quán))代碼能夠在線程模式下運(yùn)行。出現(xiàn)異常時,Cortex-M3處理器進(jìn)入處理模式,在處理模式中,所有代碼都是特權(quán)訪問的。

引入線程模式和處理模式的概念,是為了讓處理器區(qū)分普通應(yīng)用程序代碼和異常服務(wù)(包括中斷服務(wù))例程代碼,從而進(jìn)行不同的處理。

3.Cortex-M3代碼的特權(quán)分級

Cortex-M3的代碼執(zhí)行進(jìn)行了特權(quán)分級,可以分為特權(quán)執(zhí)行和非特權(quán)執(zhí)行。特權(quán)執(zhí)行時可以訪問所有資源。非特權(quán)執(zhí)行時對有些資源的訪問受到限制或不允許訪問。

特權(quán)分級可以提供一種存儲器訪問的保護(hù)機(jī)制,避免普通用戶因程序代碼出現(xiàn)意外而進(jìn)行對存儲器關(guān)鍵區(qū)域的操作,這也是一種基本的安全模型。

處理模式始終是特權(quán)訪問,線程模式可以是特權(quán)訪問,也可以是非特權(quán)訪問。系統(tǒng)復(fù)位之后,處理器默認(rèn)進(jìn)入線程模式,特權(quán)級別為特權(quán)訪問,此時的程序可以訪問所有范圍的存儲器,并且可以執(zhí)行所有指令。應(yīng)用程序也可以通過MSR指令清零控制寄存器(CONTROL)的第0位,將它配置為用戶(非特權(quán))訪問。但是,當(dāng)線程模式的程序從特權(quán)訪問變?yōu)橛脩粼L問后,本身便不能回到特權(quán)訪問。只有通過執(zhí)行一條系統(tǒng)調(diào)用指令SVC,觸發(fā)SVC異常,然后由異常服務(wù)例程(一般由操作系統(tǒng)提供,用戶不能自己編寫)接管,如果獲準(zhǔn)進(jìn)入特權(quán)訪問,由異常服務(wù)例程修改CONTROL寄存器,才能使非特權(quán)訪問的線程模式程序重新進(jìn)入特權(quán)訪問。通過引入特權(quán)訪問和非特權(quán)訪問,能夠在硬件水平上限制某些不受信任的程序執(zhí)行,使系統(tǒng)的可靠性得到提高。例如,操作系統(tǒng)的內(nèi)核通常都在特權(quán)級下執(zhí)行,所有可使用的存儲器都可以訪問;一旦在操作系統(tǒng)里開啟了一個用戶程序,就讓該用戶程序在非特權(quán)級下執(zhí)行,從而使整個系統(tǒng)不會因個別程序的錯誤或惡意攻擊而導(dǎo)致崩潰。

4.Cortex-M3的雙堆棧機(jī)制

Cortex-M3的程序存儲使用堆棧來實(shí)現(xiàn)。整個系統(tǒng)提供一個主堆棧MSP(MainStackPointer)供用戶程序和異常處理程序使用,每一個處于線程模式的程序也有一個自己的進(jìn)程堆棧PSP(ProcessStackPointer)。

結(jié)束復(fù)位后,所有代碼都使用主堆棧。異常處理程序(例如SVC)可以通過改變其在退出時使用的EXC_RETURN值來改變線程模式使用的堆棧。所有異常繼續(xù)使用主堆棧,堆棧指針r13是分組寄存器,可在SP_main和SP_process之間切換。任何時候,進(jìn)程堆棧和主堆棧中只有一個是可見的,由r13指示。除了使用從處理模式退出時的EXC_RETURN值外,在線程模式中,使用MSR指令對CONTROL[1]執(zhí)行寫操作也可以從主堆棧切換到進(jìn)程堆棧。

使用這種雙堆棧機(jī)制,可以使操作系統(tǒng)內(nèi)核僅在處理模式下執(zhí)行,此時內(nèi)核僅使用主堆棧,而用戶應(yīng)用程序僅在線程模式下執(zhí)行,此時用戶應(yīng)用程序使用自己的進(jìn)程堆棧,這樣便可以防止因用戶程序的堆棧錯誤而破壞操作系統(tǒng)使用的堆棧。

Cortex-M3處理器擁有16個32位的通用寄存器r0~r15以及一些特殊功能寄存器。絕大多數(shù)的16位指令只能使用r0~r7(低組寄存器),而32位的Thumb-2指令則可以訪問所有通用寄存器。特殊功能寄存器有預(yù)定義的功能,包括程序狀態(tài)寄存器(xPSR)、控制寄存器(CONTROL)、中斷屏蔽寄存器(PRIMASK、FAULTMASK、BASEPRI)等,它們必須通過專用的指令來訪問。2.2ARMCortex-M3寄存器組織

圖2.2ARMCortex-M3寄存器集合2.2.1通用寄存器

1.通用目的寄存器r0~r7

r0~r7也被稱為低組寄存器,所有指令都能訪問它們,其字長全為32位,復(fù)位后的初始值是不可預(yù)料的。

2.通用目的寄存器r8~r12

r8~r12也被稱為高組寄存器。這是因?yàn)橹挥泻苌俚?6位Thumb指令能訪問它們,32位的Thumb-2指令則不受限制。其字長也是32位,且復(fù)位后的初始值是不可預(yù)料的。

3.堆棧指針寄存器r13

寄存器r13用作堆棧指針(SP)。由于SP忽略了寫入位[1:0]的值,因此它自動與字,即4字節(jié)邊界對齊。

在Cortex-M3處理器內(nèi)核中共有兩個堆棧指針。當(dāng)引用r13(或?qū)懽鯯P)時,引用到的是當(dāng)前正在使用的那一個堆棧,則另一個堆棧必須用特殊的指令來訪問。這兩個堆棧指針分別是:

●主堆棧指針(MSP),或?qū)懽鯯P_main。這是缺省的堆棧指針,它由操作系統(tǒng)內(nèi)核、異常服務(wù)例程以及所有需要特權(quán)訪問的應(yīng)用程序代碼來使用?!襁M(jìn)程堆棧指針(PSP),或?qū)懽鯯P_process。用于常規(guī)的應(yīng)用程序代碼(不處于異常服務(wù)例程中時)。

處理模式始終使用SP_main,而線程模式可配置為SP_main或SP_process。r13是堆棧指針。

要注意的是,并不是每個程序都要用齊兩個堆棧指針,簡單的應(yīng)用程序只使用MSP就可以了。堆棧指針用于訪問堆棧,并且PUSH指令和POP指令默認(rèn)使用SP。

4.鏈接寄存器r14

寄存器r14是子程序的鏈接寄存器(LR)。在執(zhí)行分支(branch)和鏈接(BL)指令或帶有交換的分支和鏈接指令(BLX)時,LR用于接收來自PC的返回地址。LR也用于異常返回。

其它任何時候都可以將r14看做一個通用寄存器。

在一個匯編程序中,LR用于在調(diào)用子程序時存儲返回地址。例如,當(dāng)使用BL(分支并鏈接,BranchandLink)指令時,就自動填充LR的值。如:

main;主程序

BLfunction1;使用“分支并鏈接”指令呼叫function1

;PC=function1,并且LR=main的下一條指令地址

Function1

…;function1的代碼

BXLR;函數(shù)返回

5.程序計(jì)數(shù)器r15

寄存器r15為程序計(jì)數(shù)器(PC)。該寄存器的位0始終為0,因此,指令始終與字或半字邊界對齊。由于Cortex-M3處理器內(nèi)部使用了指令流水線,讀PC時返回的值是當(dāng)前指令的地址+4。如:

0x1000:MOVR0,PC;R0=0x1004

如果向PC中寫數(shù)據(jù),就會引起一次程序的分支(但是不更新LR寄存器)。2.2.2程序狀態(tài)寄存器

系統(tǒng)級的Cortex-M3處理器狀態(tài)可分為3類,因此有3個程序狀態(tài)寄存器,即應(yīng)用PSR(APSR)、中斷PSR(IPSR)、執(zhí)行PSR(EPSR)。

通過MRS/MSR指令,這3個PSR既可以單獨(dú)訪問,也可以組合訪問(2個組合,3個組合都可以)。當(dāng)使用三合一的方式訪問時,應(yīng)使用“xPSR”或“PSR”作為名稱。

1.應(yīng)用PSR(APSR)

應(yīng)用PSR(APSR)包含條件代碼標(biāo)志。在進(jìn)入異常之前,Cortex-M3處理器將條件代碼標(biāo)志保存在堆棧內(nèi)??梢允褂肕SR(2)和MRS(2)指令來訪問APSR。APSR的位分配示意圖如圖2.3所示。

圖2.3APSR的位分配示意圖●

N位:負(fù)數(shù)或小于標(biāo)志。為1時表示結(jié)果為負(fù)數(shù)或小于,為0時表示結(jié)果為正數(shù)或大于。

Z位:零標(biāo)志。為1時表示結(jié)果為0,為0時表示結(jié)果為非0。

C位:進(jìn)位/借位標(biāo)志。為1時表示有進(jìn)位或借位,為0時表示沒有進(jìn)位或借位。

V位:溢出標(biāo)志。為1時表示溢出,為0時表示沒有溢出。

Q位:粘著飽和(stickysaturation)標(biāo)志。

2.中斷PSR(IPSR)

中斷PSR(IPSR)包含當(dāng)前激活的異常的ISR編號。IPSR的位分配示意圖如圖2.4所示。

圖2.4IPSR的位分配示意圖

IPSR的9位表示了當(dāng)前激活的異常ISR編號,即中斷編號。常用的一些中斷編號有:基礎(chǔ)級別=0,NMI=2,SVCall=11,INTISR[0]=16,INTISR[1]=17,…,INTISR[239]=255。

具體的中斷編號請參見有關(guān)中斷的章節(jié)。

3.執(zhí)行PSR(EPSR)

執(zhí)行PSR(EPSR)包含兩個重疊的區(qū)域:

(1)可中斷-可繼續(xù)指令區(qū)(ICI):多寄存器加載(LDM)和存儲(STM)操作是可中斷的。EPSR的ICI區(qū)用來保存從產(chǎn)生中斷的點(diǎn)繼續(xù)執(zhí)行多寄存器加載和存儲操作時所必需的信息。

(2)

If-Then(IT)狀態(tài)區(qū):EPSR的IT區(qū)包含了If-Then指令的執(zhí)行狀態(tài)位。

注意:ICI區(qū)和IT區(qū)是重疊的,因此,If-Then模塊內(nèi)的多寄存器加載或存儲操作不具有可中斷-可繼續(xù)功能。EPSR的位分配示意圖如圖2.5所示。

圖2.5EPSR的位分配示意圖●

ICI區(qū):[15:12]位,可中斷-可繼續(xù)的指令位。如果在執(zhí)行LDM或STM操作時產(chǎn)生一次中斷,則LDM或STM操作暫停。EPSR使用位[15:12]來保存該操作中下一個寄存器操作數(shù)的編號。在中斷響應(yīng)之后,處理器返回由[15:12]指向的寄存器并恢復(fù)操作。如果ICI區(qū)指向的寄存器不在指令的寄存器列表中,則處理器對列表中的下一個寄存器(如果有)繼續(xù)執(zhí)行LDM/STM操作。

IT(If-Then)區(qū):[15:10]位和[26:25]位,它們是If-Then指令的執(zhí)行狀態(tài)位,包含If-Then模塊的指令數(shù)目和它們的執(zhí)行條件。●

T位:[24]位。T位使用一條可相互作用的指令來清零,這里寫入的PC的位0的值為0。也可以使用異常出棧操作來清零,被壓棧的T位為0。當(dāng)T位為0時執(zhí)行指令會引起INVSTATE異常。

由以上3個PSR的位分配圖可以看出,3個PSR的位分配是互不影響的。因此在實(shí)際使用中常將3個PSR組合成一個xPSR來使用。在進(jìn)入異常時,處理器也將3個狀態(tài)寄存器組合的信息xPSR保存在堆棧里。2.2.3控制寄存器

控制寄存器(CONTROL)有兩個用途:其一,用于定義特權(quán)級別;其二,用于選擇當(dāng)前使用哪個堆棧指針。應(yīng)用時可由兩個位來行使這兩個職能。

(1)

CONTROL[1]位:堆棧指針選擇位,該位為0時表示選擇主堆棧指針MSP(復(fù)位后的缺省值);為1時表示選擇進(jìn)程堆棧指針PSP。在線程模式下,可以使用PSP;在處理模式下,只允許使用MSP,所以此時不得在該位寫1。在Cortex-M3的處理模式中,CONTROL[1]總是0;在線程模式中則可以為0或1。因此,僅當(dāng)處于特權(quán)級的線程模式下時此位才可寫,其它場合下禁止寫此位。改變處理器的模式也有其它的方式:在異常返回時,通過修改LR的位2,也能實(shí)現(xiàn)模式切換,這是LR在異常返回時的特殊用法。

(2)

CONTROL[0]位:特權(quán)級別選擇位,其值為0時表示特權(quán)級的線程模式,為1時表示用戶級的線程模式。處理模式永遠(yuǎn)都是特權(quán)級的。僅當(dāng)在特權(quán)級下操作時才允許寫該位。一旦進(jìn)入了用戶級,唯一返回特權(quán)級的途徑就是觸發(fā)一個(軟)中斷,再由服務(wù)例程改寫該位。2.2.4中斷屏蔽寄存器

中斷屏蔽寄存器包括PRIMASK、FAULTMASK和BASEPRI三個寄存器,這三個寄存用于控制異常的使能和清除。

(1)

PRIMASK。PRIMASK是一個只有單一比特的寄存器。在它被置1后,就關(guān)掉所有可屏蔽的異常,只剩下NMI和硬fault可以響應(yīng)。它的缺省值是0,表示沒有關(guān)中斷。

(2)

FAULTMASK。FAULTMASK也是一個只有一個位的寄存器。當(dāng)它置1時,只有NMI才能響應(yīng),所有其它的異常,甚至是硬錯誤,也全部被屏蔽。它的缺省值也是0,表示沒有關(guān)異常。

(3)

BASEPRI。BASEPRI寄存器最多有9位(由表達(dá)優(yōu)先級的位數(shù)決定),它定義了被屏蔽優(yōu)先級的閾值。當(dāng)BASEPRI寄存器被設(shè)成某個值后,所有優(yōu)先級號大于等于此值的中斷都被關(guān)(優(yōu)先級號越大,優(yōu)先級越低)。但若被設(shè)成0,則不關(guān)閉任何中斷,0也是缺省值。

對于某些任務(wù)而言,恰如其分地使用PRIMASK和BASEPRI來暫時關(guān)閉一些中斷是非常重要的。FAULTMASK則可以被操作系統(tǒng)用于暫時關(guān)閉fault處理機(jī)能,這種處理在某個任務(wù)崩潰時可能需要。因?yàn)樵谌蝿?wù)崩潰時,常常伴隨著一大堆fault。在系統(tǒng)進(jìn)行后續(xù)處理時,通常不再需要響應(yīng)這些fault??傊瓼AULTMASK就是專門留給操作系統(tǒng)用的。

只有在特權(quán)級下,才允許訪問這三個寄存器。

Cortex-M3處理器的存儲器系統(tǒng)與傳統(tǒng)ARM處理器的存儲器系統(tǒng)架構(gòu)有所不同,主要體現(xiàn)在幾個方面:Cortex-M3的存儲器映射是預(yù)定義好的,并且還規(guī)定了哪個位置應(yīng)該使用哪個總線,而傳統(tǒng)的ARM處理器的存儲器映射是由各生產(chǎn)廠家自己定義的;Cortex-M3存儲器系統(tǒng)支持位帶(bit-band)操作,通過它可以實(shí)現(xiàn)對單一比特的位操作,適用于一些特殊的存儲器區(qū)域中;Cortex-M3的存儲器系統(tǒng)支持非對齊訪問和互斥訪問,這個特性是傳統(tǒng)ARM處理器沒有的;Cortex-M3的存儲器系統(tǒng)同時支持大端格式配置和小端格式配置。2.3ARMCortex-M3存儲器2.3.1Cortex-M3存儲器格式

Cortex-M3處理器將存儲器看做從0開始向上編號的字節(jié)的線性集合。例如:字節(jié)0~3存放第一個被保存的字,字節(jié)4~7存放第二個被保存的字,等等。

Cortex-M3處理器能夠以小端格式或大端格式訪問存儲器中的數(shù)據(jù)字,而訪問代碼時始終使用小端格式。

小端格式中,一個字中最低地址的字節(jié)為該字的最低有效字節(jié),最高地址的字節(jié)為最高有效字節(jié)。存儲器系統(tǒng)地址0的字節(jié)與數(shù)據(jù)線7~0相連。小端數(shù)據(jù)格式示意圖如圖2.6所示。小端格式是ARM處理器默認(rèn)的存儲器格式。大端格式中,一個字中最低地址的字節(jié)為該字的最高有效字節(jié),而最高地址的字節(jié)為最低有效字節(jié)。存儲器系統(tǒng)地址0的字節(jié)與數(shù)據(jù)線31~24相連。大端數(shù)據(jù)格式示意圖如圖2.7所示。

圖2.6小端數(shù)據(jù)格式示意圖

圖2.7大端數(shù)據(jù)格式示意圖

Cortex-M3處理器有一個配置引腳BIGEND,用戶能夠使用它來選擇小端格式或大端格式。該引腳在復(fù)位時被采樣,結(jié)束復(fù)位后存儲器格式不能修改。2.3.2Cortex-M3存儲器映射

微處理器將存儲器空間和外設(shè)空間分為獨(dú)立編址和統(tǒng)一編址兩種方式。存儲器映射是指把芯片中或芯片外的各類存儲器、外設(shè)等進(jìn)行統(tǒng)一編址,便可以用地址來表示某一使用對象。通過把片上外設(shè)的寄存器映射到外設(shè)區(qū),就可以簡單地以訪問內(nèi)存的方式來訪問這些外設(shè)的寄存器,從而控制外設(shè)的工作。

Cortex-M3處理器擁有32位地址線,尋址空間為4GB。它有一個預(yù)定義好的基本存儲器映射,這一特性極大地方便了軟件在各種Cortex-M3芯片間的移植。由于各廠商生產(chǎn)的各種型號的Cortex-M3芯片的NVIC和MPU都在相同的位置布設(shè)寄存器,使得它們與具體器件無關(guān),這樣,中斷和存儲保護(hù)有關(guān)的代碼便可在各種Cortex-M3處理器上運(yùn)行。

Cortex-M3的存儲器映射是一個粗線條的方框,它依然允許芯片制造商靈活細(xì)膩地分配存儲器空間,以制造出各具特色的芯片。

Cortex-M3的存儲器映射如圖2.8所示。

圖2.8Cortex-M3存儲器映射

Cortex-M3的地址空間為4GB,程序可以在代碼區(qū)、內(nèi)部SRAM區(qū)以及外部RAM區(qū)中執(zhí)行。但是因?yàn)橹噶羁偩€與數(shù)據(jù)總線是分開的,最理想的是把程序放到代碼區(qū),從而使取指和數(shù)據(jù)訪問各自使用自己的總線并行執(zhí)行。代碼區(qū)的地址范圍是0x00000000~0x1FFFFFFF。

Cortex-M3內(nèi)部SRAM區(qū)的大小是512MB,用于讓芯片制造商連接片上的SRAM,這個區(qū)通過系統(tǒng)總線來訪問,地址范圍是0x20000000~0x3FFFFFFF。在這個區(qū)的下部,有一個1MB的區(qū)間,被稱為位帶區(qū)。該位帶區(qū)還有一個對應(yīng)的32MB的位帶別名(alias)區(qū),容納了8M個位變量。位帶區(qū)對應(yīng)的是最低的1MB地址范圍,而位帶別名區(qū)里面的每個字對應(yīng)位帶區(qū)的一個比特。位帶操作只適用于數(shù)據(jù)訪問,不適用于取指。通過位帶的功能,可以把多個布爾型數(shù)據(jù)打包在單一的字中,但依然可以從位帶別名區(qū)中,像訪問普通內(nèi)存一樣地使用它們。位帶別名區(qū)中的訪問操作是原子的,省去了傳統(tǒng)的“讀取-修改-寫回”步驟。

地址空間的另一個512MB范圍由片上外設(shè)使用,地址范圍是0x40000000~0x5FFFFFFF。這個區(qū)中也有一條32MB的位帶別名,以便于快捷地訪問外設(shè)寄存器,用法與內(nèi)部SRAM區(qū)中的位帶相同。例如,可以方便地訪問各種控制位和狀態(tài)位。要注意的是,外設(shè)區(qū)內(nèi)不允許執(zhí)行指令。還有兩個1GB的范圍,分別用于連接外部RAM和外部設(shè)備,它們之中沒有位帶。兩者的區(qū)別在于外部RAM區(qū)允許執(zhí)行指令,而外部設(shè)備區(qū)則不允許。這兩個區(qū)域的地址范圍分別是0x60000000~0x9FFFFFFF和0xA0000000~0xDFFFFFFF。最后還剩下512MB的專用空間,包括了系統(tǒng)級組件、內(nèi)部私有外設(shè)總線、外部私有外設(shè)總線以及由提供者定義的系統(tǒng)外設(shè)。

Cortex-M3私有外設(shè)總線遵循AMBA片上總線規(guī)范,主要包括AHB(AdvancedHighperformanceBus)系統(tǒng)總線和APB(AdvancedPeripheralBus)外圍總線兩種。AHB主要用于高性能模塊(如CPU、DMA和DSP等)之間的連接,APB主要用于低帶寬的周邊外設(shè)之間的連接。

AHB私有外設(shè)總線,只用于Cortex-M3內(nèi)部的AHB外設(shè),它們是嵌套向量中斷控制器NVIC、閃存地址重載及斷點(diǎn)單元FPB、數(shù)據(jù)觀察點(diǎn)及跟蹤單元DWT和指令跟蹤宏單元ITM。

APB私有外設(shè)總線,既用于Cortex-M3內(nèi)部的APB設(shè)備,也用于外部設(shè)備(這里的“外部”是對內(nèi)核而言)。這一部分還包括嵌入式跟蹤宏單元ETM和跟蹤端口接口單元TPIU。Cortex-M3允許器件制造商再添加一些片上APB外設(shè)到APB私有總線上,它們通過APB接口來訪問。

NVIC所處的區(qū)域叫做“系統(tǒng)控制空間(SCS)”,在SCS中除了NVIC外,還有系統(tǒng)時鐘節(jié)拍器SysTick、存儲器保護(hù)單元MPU以及代碼調(diào)試控制所用的寄存器,這是整個系統(tǒng)控制中一個相當(dāng)重要的區(qū)域。

未用的提供商指定區(qū)也通過系統(tǒng)總線來訪問,但是不允許在其中執(zhí)行指令。

Cortex-M3中的MPU是選配的,由芯片制造商決定是否配上。2.3.3存儲器訪問屬性

Cortex-M3在定義了存儲器映射之外,還為存儲器的訪問規(guī)定了4種屬性,分別是:可否緩沖(Bufferable)、可否緩存(Cacheable)、可否執(zhí)行(Executable)、可否共享(Sharable)。

Cortex-M3有一個缺省的存儲訪問許可,它能防止用戶代碼訪問系統(tǒng)控制存儲空間,保護(hù)NVIC、MPU等關(guān)鍵部件。缺省訪問許可在沒有配備MPU或配備了MPU但是MPU被除能時生效。如果啟用了MPU,則MPU可以在地址空間中劃出若干個區(qū)域,并為不同的區(qū)域規(guī)定不同的訪問許可權(quán)限。

Cortex-M3的缺省訪問許可如表2.1所示。

當(dāng)一個用戶級訪問被阻止時,會立即產(chǎn)生一個總線fault。

表2.1Cortex-M3的存儲器訪問許可2.3.4位帶(bit-band)操作

Cortex-M3在支持了位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進(jìn)行讀寫。在Cortex-M3中,有兩個區(qū)中實(shí)現(xiàn)了位帶。其中一個是SRAM區(qū)的最低1MB范圍,第二個則是片內(nèi)外設(shè)區(qū)的最低1MB范圍。這兩個位帶中的地址除了可以像普通的RAM一樣使用外,它們還都有自己的位帶別名區(qū),位帶別名區(qū)把每個比特膨脹成一個32位的字。當(dāng)通過位帶別名區(qū)訪問這些字時,就可以達(dá)到訪問原始比特的目的。映射公式顯示如何將別名區(qū)中的字與bit-band區(qū)中的對應(yīng)位或目標(biāo)位關(guān)聯(lián)。映射公式如下:

bit_word_offset=(byte_offset×32)+(bit_number×4)

bit_word_addr=bit_band_base+bit_word_offset

其中,

bit_word_offset:bit-band存儲區(qū)中目標(biāo)位的位置。

bit_word_addr:別名存儲區(qū)中映射為目標(biāo)位的字的地址。

bit_band_base:別名區(qū)的開始地址。

bit_offset:bit-band區(qū)中包含目標(biāo)位的字節(jié)的編號。

bit_number:目標(biāo)位的位位置(0~7)。

bit-band映射關(guān)系如圖2.9所示。

圖2.9bit-band映射關(guān)系圖中顯示了SRAMbit-band別名區(qū)和SRAMbit-band區(qū)之間的bit-band映射的例子,其中:

地址0x23FFFFE0的別名字映射為0x200FFFFC的bit-band字節(jié)的位0:

0x23FFFFE0=0x22000000+(0xFFFFF*32)+0*4

地址0x23FFFFEC的別名字映射為0x200FFFFC的bit-band字節(jié)的位7:

0x23FFFFEC=0x22000000+(0xFFFFF*32)+7*4

地址0x22000000的別名字映射為0x20000000的bit-band字節(jié)的位0:

0x22000000=0x22000000+(0*32)+0*4

地址0x220001C的別名字映射為0x20000000的bit-band字節(jié)的位0:

0x2200001C=0x22000000+(0*32)+7*4

向別名區(qū)寫入一個字與在bit-band區(qū)的目標(biāo)位執(zhí)行讀—修改—寫操作具有相同的作用。

寫入別名區(qū)的字的位0決定了寫入bit-band區(qū)的目標(biāo)位的值。將位0為1的值寫入別名區(qū)表示向bit-band位寫入1,將位0為0的值寫入別名區(qū)表示向bit-band位寫入0。別名字的位[31:1]在bit-band位上不起作用。寫入0x01與寫入0xFF的效果相同;寫入0x00與寫入0x0E的效果相同。

讀別名區(qū)的一個字返回0x01或0x00。0x01表示bit-band區(qū)中的目標(biāo)位置位;0x00表示目標(biāo)位清零。位[31:1]將為0。

例2.1

欲置位地址0x20000000中的比特0。

不使用bit-band操作時,操作流程如下:首先將地址0x20000000的一個32位字讀取到某一通用寄存器,然后給該寄存器的最低位置1,最后將該寄存器的值回寫入地址0x20000000。使用bit-band操作時,則根據(jù)以上公式可知,地址0x20000000的位0映射為地址0x2200001C的一個字,直接向0x2200001C寫一個值0x01即可。

顯然,從操作的角度來說,使用bit-band操作的方式更簡單,效率更高。

例2.2

利用bit-band進(jìn)行位清零操作。

(1)在地址0x20000000處寫入0x3355AACC。

(2)讀取地址0x22000008。本次讀訪問將讀取0x20000000,并提取比特2,值為1。

(3)向地址0x22000008處寫0。本次操作將被映射成對地址0x20000000的“讀-改-寫”操作,把比特2清零。

(4)現(xiàn)在再讀取0x20000000,將返回0x3355AAC8(bit[2]已清零)。

引入bit-band操作,可以更方便地操作數(shù)據(jù)中的比特位,對于直接控制引腳電平的硬件底層程序大有用處。引入bit-band操作還可以用于簡化跳轉(zhuǎn)程序的判斷、多任務(wù)系統(tǒng)中共享資源的互鎖訪問等領(lǐng)域。

當(dāng)正常的程序執(zhí)行流程發(fā)生暫時停止時,稱之為異常。例如,處理一個外部的中斷請求,系統(tǒng)執(zhí)行完當(dāng)前執(zhí)行的指令后可以轉(zhuǎn)去執(zhí)行異常處理程序。在處理異常之前,當(dāng)前處理器的狀態(tài)必須保留,這樣當(dāng)異常處理完成之后,當(dāng)前程序可以繼續(xù)執(zhí)行。處理器允許多個異常同時發(fā)生,它們將會按固定的優(yōu)先級進(jìn)行處理。2.4ARMCortex-M3異常處理

Cortex-M3體系結(jié)構(gòu)中的異常與8位/16位處理器體系結(jié)構(gòu)的中斷有很大的相似之處,但異常與中斷的概念并不完全等同。從原則上說,所有能打斷正常執(zhí)行流的事件都稱為異常。但在工程實(shí)踐中,經(jīng)?;旌鲜褂眯g(shù)語“中斷”與“異常”,強(qiáng)調(diào)的都是它們對主程序所體現(xiàn)出來的“中斷”性質(zhì)。中斷與異常的區(qū)別在于:中斷請求信號來自Cortex-M3內(nèi)核外面,來自各種片上外設(shè)和外擴(kuò)的外設(shè),對Cortex-M3來說是異步的;而異常則是在Cortex-M3內(nèi)核執(zhí)行指令或訪問存儲器時產(chǎn)生,因此對Cortex-M3來說是同步的。

Cortex-M3處理器和嵌套向量中斷控制器(NVIC)對所有異常按優(yōu)先級進(jìn)行排序并處理。所有異常都在處理模式中操作。出現(xiàn)異常時,自動將處理器狀態(tài)保存到堆棧中,并在中斷服務(wù)程序(ISR)結(jié)束時自動從堆棧中恢復(fù)。在狀態(tài)保存的同時取出向量快速地進(jìn)入中斷。處理器支持末尾連鎖(tail-chaining)中斷技術(shù),它能夠在沒有多余的狀態(tài)保存和恢復(fù)指令的情況下執(zhí)行背對背中斷(back-to-backinterrupt)。2.4.1異常類型

Cortex-M3在內(nèi)核水平上搭載了一個異常響應(yīng)系統(tǒng),支持為數(shù)眾多的系統(tǒng)異常和外部中斷。其中,編號為1~15的對應(yīng)系統(tǒng)異常,大于等于16的則全是外部中斷。除了個別異常的優(yōu)先級被定死外,其它異常的優(yōu)先級都是可編程的。由于芯片設(shè)計(jì)者可以修改Cortex-M3的硬件描述源代碼,所以做成芯片后,支持的中斷源數(shù)目常常不到240個,并且優(yōu)先級的位數(shù)也由芯片廠商最終決定。

Cortex-M3支持的異常類型如表2.2所示。

表2.2Cortex-M3支持的異常類型表2.2顯示了Cortex-M3處理器支持的異常類型、優(yōu)先級以及位置。位置是指從向量表開始處的字偏移。在優(yōu)先級列中,數(shù)字越小表示優(yōu)先級越高。表中還顯示了異常類型的激活方式,即是同步的還是異步的。優(yōu)先級的準(zhǔn)確含義和使用見異常優(yōu)先級。

如果一個發(fā)生的異常不能被即刻響應(yīng),就稱它被“掛起”(pending)。不過,少數(shù)異常是不允許被掛起的。一個異常被掛起的原因,可能是系統(tǒng)當(dāng)前正在執(zhí)行一個更高優(yōu)先級異常的服務(wù)例程,或者因相關(guān)掩蔽位的設(shè)置導(dǎo)致該異常被除能。對于每個異常源,在被掛起的情況下,都會有一個對應(yīng)的“掛起狀態(tài)寄存器”保存其異常請求。待到該異常能夠響應(yīng)時,執(zhí)行其服務(wù)例程,這與傳統(tǒng)的ARM是完全不同的。在以前,是由產(chǎn)生中斷的設(shè)備保持住請求信號的;Cortex-M3則由NVIC的掛起狀態(tài)寄存器來解決這個問題。于是,即使設(shè)備在后來已經(jīng)釋放了請求信號,曾經(jīng)的中斷請求也不會錯失。2.4.2異常優(yōu)先級

在Cortex-M3中,優(yōu)先級對于異常來說是很關(guān)鍵的,它會決定一個異常是否能被掩蔽,以及在未掩蔽的情況下何時可以響應(yīng)。優(yōu)先級的數(shù)值越小,則優(yōu)先級越高。

Cortex-M3支持中斷嵌套,使得高優(yōu)先級異常會搶占(preempt)低優(yōu)先級異常。Corter-M3有3個系統(tǒng)異常:復(fù)位、NMI以及硬故障。它們有固定的優(yōu)先級,并且優(yōu)先級號是負(fù)數(shù),從而高于所有其它異常。所有其它異常的優(yōu)先級則都是可編程的,但不能為負(fù)數(shù)。原則上,Cortex-M3支持3個固定的高優(yōu)先級和多達(dá)256級的可編程優(yōu)先級,并且支持128級搶占。但是,絕大多數(shù)Cortex-M3芯片都會精簡設(shè)計(jì),以使實(shí)際上支持的優(yōu)先級數(shù)會更少,如8級、16級、32級等。它們在設(shè)計(jì)時會裁掉表達(dá)優(yōu)先級的幾個低端有效位,以減少優(yōu)先級的級數(shù)。如果使用更多的位來表達(dá)優(yōu)先級,則可以使用的值也更多,同時需要的門也更多,也就是會帶來更多的成本和功耗。Cortex-M3允許的最少使用位數(shù)為3個,亦即至少要支持8級優(yōu)先級。為了使搶占機(jī)能變得更可控,Cortex-M3還把256級優(yōu)先級按位分成高低兩段,分別稱為搶占優(yōu)先級和子優(yōu)先級。NVIC中有一個寄存器是應(yīng)用程序中斷及復(fù)位控制寄存器,其中有一個8位的位段名為優(yōu)先級組。該位段的值對每一個優(yōu)先級可配置的異常都有影響,把其優(yōu)先級分為2個位段:MSB所在的位段(左邊的)對應(yīng)搶占優(yōu)先級,而LSB所在的位段(右邊的)對應(yīng)子優(yōu)先級。

搶占優(yōu)先級決定了搶占行為:當(dāng)系統(tǒng)正在響應(yīng)某異常L時,如果來了搶占優(yōu)先級更高的異常H,則H可以搶占L,子優(yōu)先級則處理“內(nèi)務(wù)”;當(dāng)搶占優(yōu)先級相同的異常有不止一個掛起時,就最先響應(yīng)子優(yōu)先級最高的異常。

這種優(yōu)先級分組做出了如下規(guī)定:子優(yōu)先級至少是1個位。因此搶占優(yōu)先級最多是7個位,這就造成了最多只有128級搶占的現(xiàn)象。但是Cortex-M3允許從比特7處分組,此時所有的位都表達(dá)子優(yōu)先級,沒有任何位表達(dá)搶占優(yōu)先級,因而所有優(yōu)先級可編程的異常之間就不會發(fā)生搶占——相當(dāng)于在它們之中除能了Cortex-M3的中斷嵌套機(jī)制。但三個特殊的異常(復(fù)位、NMI和硬故障),無論它們何時出現(xiàn),都立即無條件搶占所有優(yōu)先級可編程的“平民異?!?。2.4.3向量表

當(dāng)Cortex-M3發(fā)生了異常并且要響應(yīng)它時,對應(yīng)的異常處理程序(exceptionhandler)就會執(zhí)行。Cortex-M3需要定位其異常處理程序的入口地址,這些入口地址存儲在一個向量表中。向量表其實(shí)是一個字類型(word,32位整數(shù))的數(shù)組,每個字對應(yīng)一種異常,存儲了該異常處理程序的入口地址。缺省情況下,Cortex-M3認(rèn)為該表位于零地址處,且各向量占用4字節(jié),因此每個表項(xiàng)占用4字節(jié)。但向量表在地址空間中的位置是可以設(shè)置的,通過NVIC中的一個重定位寄存器來指出向量表的地址。發(fā)生復(fù)位時,該寄存器的值為0。所以,在地址0處必須包含一張向量表,用于復(fù)位時的異常分配。

表2.3Cortex-M3的異常向量表例如,如果發(fā)生了異常12(調(diào)試監(jiān)控),則NVIC會根據(jù)向量表計(jì)算出偏移量為12

×

4

=

0x30,然后從地址0x30處取出異常處理程序的入口地址并轉(zhuǎn)移到該地址。要注意的是:類型0并不是什么入口地址,而是存儲了復(fù)位后主堆棧指針MSP的初值。

由于地址0處應(yīng)該存儲引導(dǎo)代碼,所以它通常會映射到Flash或者是ROM器件,并且它們的值不得在運(yùn)行時改變。盡管如此,為了支持動態(tài)的重新分發(fā)中斷,Cortex-M3允許向量表重定位,即從其它地址處開始定位各異常向量。這些地址對應(yīng)的區(qū)域可以是代碼區(qū),但更多是在RAM區(qū)。在RAM區(qū)就可以修改異常向量的入口地址。為了實(shí)現(xiàn)這個功能,NVIC中有一個寄存器,稱為向量表偏移量寄存器(在地址0xE000ED08處),通過修改它的值就能重定位向量表。但必須注意的是,向量表的起始地址是有要求的,即必須先求出系統(tǒng)中共有多少個向量,再把這個數(shù)字向上取整到2的整數(shù)次冪,而起始地址必須對齊到后者的邊界上。例如,如果一共有32個中斷,則共有32

+

16(系統(tǒng)異常)

=

48個向量,向上圓整到2的整次冪后值為64,因此向量表重定位的地址必須能被64

×

4

=

256整除,從而合法的起始地址可以是0x0、0x100、0x200等。

表2.4向量表偏移量寄存器(VTOR)如果需要動態(tài)地更改向量表,則對于任何器件來說,向量表的起始處都必須包含以下向量:主堆棧指針(MSP)的初始值、復(fù)位向量、NMI、硬故障服務(wù)例程。后兩者是必需的,因?yàn)橛锌赡茉谝龑?dǎo)過程中發(fā)生這兩種異常。

在SRAM中可以開出一塊空間用于存儲向量表。在引導(dǎo)期間先填寫好各向量,然后在引導(dǎo)完成后,就可以啟用內(nèi)存中的新向量表,從而實(shí)現(xiàn)向量可動態(tài)調(diào)整的能力。

2.5.1NVIC概述

NVIC(NestedVectoredInterruptController)即嵌套向量中斷控制器,是Cortex-M3不可分離的一部分,它與Cortex-M3內(nèi)核的邏輯緊密耦合,共同完成對中斷的響應(yīng)。NVIC的寄存器以存儲器映射的方式來訪問,除了包含控制寄存器和中斷處理的控制邏輯之外,NVIC還包含了MPU、SysTick定時器以及與調(diào)試控制相關(guān)的寄存器。2.5NVIC與中斷控制

NVIC共支持1~240個外部中斷輸入(通常外部中斷寫做IRQ),具體的數(shù)值由芯片廠商在設(shè)計(jì)芯片時決定。此外,NVIC還支持一個不可屏蔽中斷NMI(NonMaskableInterrupt)輸入。NMI的實(shí)際功能亦由芯片制造商決定,在某些情況下,NMI無法由外部中斷源控制。

NVIC的訪問地址是0xE000E000。所有NVIC的中斷控制/狀態(tài)寄存器都只能在特權(quán)級下訪問。不過有一個例外——軟件觸發(fā)中斷寄存器可以在用戶級下訪問以產(chǎn)生軟件中斷。所有的中斷控制及狀態(tài)寄存器均可按字、半字、字節(jié)的方式訪問。此外,還有幾個中斷掩蔽寄存器也與中斷控制密切相關(guān),它們是特殊功能寄存器,只能通過MRS、MSR及CPS來訪問。

用戶應(yīng)用程序可以在運(yùn)行期間更改中斷的優(yōu)先級。如果在某個中斷服務(wù)程序中修改了自己所對應(yīng)中斷的優(yōu)先級,而且這個中斷又由新的服務(wù)程序掛起(pending),也不會自己打斷自己,從而避免了重入(reentry)的風(fēng)險(xiǎn)。2.5.2中斷配置基礎(chǔ)

每個外部中斷都需要使用以下一些NVIC寄存器:使能與禁止寄存器、掛起與解掛寄存器、優(yōu)先級寄存器以及活動狀態(tài)寄存器。另外,下列寄存器也對中斷處理有重大影響:異常掩蔽寄存器(PRIMASK、FAULTMASK以及BASEPRI)、向量表偏移量寄存器、軟件觸發(fā)中斷寄存器以及優(yōu)先級分組位段表。2.5.3中斷的使能與禁止

中斷的使能與禁止分別使用各自的寄存器來控制,這與傳統(tǒng)的使用單一比特的兩個狀態(tài)來表達(dá)使能與禁止是不同的。Cortex-M3中可以有240對使能位、禁止位(SETENA位、CLRENA位),每個中斷擁有一對。這240對分布在8對32位寄存器中(最后一對沒有用完)。

如果要使能一個中斷,需要寫1到對應(yīng)SETENA的位中;如果要禁止一個中斷,需要寫1到對應(yīng)的CLRENA位中。如果往它們中寫0,則不會有任何效果。如上所述,SETENA位和CLRENA位可以有240對,對應(yīng)的32位寄存器可以有8對,因此可使用數(shù)字后綴來區(qū)分這些寄存器,如SETENA0、SETENA1、…、SETENA7,如表2.5所示。但是在特定的芯片中,只有該芯片實(shí)現(xiàn)的中斷,其對應(yīng)的位才有意義。因此,如果某個芯片支持32個中斷,則只有SETENA0和CLRENA0才需要使用。SETENA和CLRENA可以按字、半字、字節(jié)的方式來訪問。由于前16個異常已經(jīng)分配給系統(tǒng)異常,故而中斷0的異常號是16。SETENA/CLRENA寄存器族的定義如表2.5所示。

表2.5SETENA/CLRENA寄存器族2.5.4中斷的掛起與解掛

如果中斷發(fā)生,Cortex-M3正在處理同級或高優(yōu)先級異?;蛘弑谎诒螘r,中斷不能立即得到響應(yīng),此時中斷被掛起。中斷的掛起狀態(tài)可以通過中斷設(shè)置掛起寄存器(SETPEND)和中斷掛起清除寄存器(CLRPEND)來讀取,還可以寫它們來手工掛起中斷。

中斷設(shè)置掛起寄存器和中斷掛起清除寄存器也可以有8對,其用法和用量都與前面介紹的使能/除能寄存器完全相同,見表2.6。

表2.6SETPEND/CLRPEND寄存器族每個外部中斷都有一個對應(yīng)的優(yōu)先級寄存器,每個寄存器占用8位,但是Cortex-M3允許在最“粗線條”的情況下,只使用最高3位。4個相鄰的優(yōu)先級寄存器拼成一個32位寄存器。如前所述,根據(jù)優(yōu)先級組的設(shè)置,優(yōu)先級可以被分為高低兩個位段,分別是搶占優(yōu)先級和亞優(yōu)先級。優(yōu)先級寄存器都可以按字節(jié)訪問,當(dāng)然也可以按半字、字來訪問。有意義的優(yōu)先級寄存器數(shù)目由芯片廠商實(shí)現(xiàn)的中斷數(shù)目決定。

中斷優(yōu)先級寄存器見表2.7。

表2.7中斷優(yōu)先級寄存器2.5.5中斷建立全過程

下面以一個簡單的例子說明如何建立一個外部中斷。

(1)當(dāng)系統(tǒng)啟動后,先設(shè)置優(yōu)先級組寄存器。缺省情況下使用組0

(7位搶占優(yōu)先級,1位子優(yōu)先級)。

(2)如果需要重定位向量表,先把硬故障和NMI服務(wù)例程的入口地址寫到新向量表項(xiàng)所在的地址中。

(3)配置向量表偏移量寄存器,使之指向新的向量表(如果有重定位的話)。

(4)為該中斷建立中斷向量。因?yàn)橄蛄勘砜赡芤呀?jīng)重定位了,需要先讀取向量表偏移量寄存器的值,然后根據(jù)該中斷在表中的位置,計(jì)算出對應(yīng)的表項(xiàng),再把服務(wù)例程的入口地址填寫進(jìn)去。如果一直使用ROM中的向量表,則無需此步驟。

(5)為該中斷設(shè)置優(yōu)先級。

(6)使能該中斷表。2.5.6中斷/異常的響應(yīng)序列

中斷是一種異常,異常基本上以中斷為主,所以如果沒有特殊說明,兩個名詞可以互換使用。當(dāng)Cortex-M3開始響應(yīng)一個中斷時,會產(chǎn)生三個動作:入棧,把8個寄存器的值壓入堆棧;取向量,從向量表中找出對應(yīng)的服務(wù)程序入口地址;選擇堆棧指針MSP/PSP,更新堆棧指針SP、連接寄存器LR及程序計(jì)數(shù)器PC。

1.入棧

響應(yīng)異常的第一個行動,就是自動保存現(xiàn)場的必要部分:依次把xPSR、PC、LR、R12以及R3~R0由硬件自動壓入適當(dāng)?shù)亩褩V小.?dāng)響應(yīng)異常,當(dāng)前的代碼正在使用PSP時,壓入PSP,也就是使用進(jìn)程堆棧;否則就壓入MSP,使用主堆棧。一旦進(jìn)入了服務(wù)例程,就將一直使用主堆棧。所有的嵌套中斷都使用主堆棧。

2.取向量

當(dāng)數(shù)據(jù)總線(系統(tǒng)總線)正在為入棧操作而忙碌時,指令總線(I-Code總線)也在為響應(yīng)中斷緊張有序地執(zhí)行另一項(xiàng)重要的任務(wù),即從向量表中找出正確的異常向量(服務(wù)程序的入口地址),然后在服務(wù)程序的入口處預(yù)取指。由此可以看到各自都有專用總線的好處:入棧與取指這兩個工作能同時進(jìn)行。

3.更新寄存器

在入棧和取向量操作完成之后,執(zhí)行服務(wù)程序之前,還要更新以下一系列的寄存器。

(1)

SP。在入棧后會把堆棧指針(PSP或MSP)更新到新的位置。在執(zhí)行服務(wù)程序時,將由MSP負(fù)責(zé)對堆

溫馨提示

  • 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

提交評論