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

下載本文檔

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

文檔簡(jiǎn)介

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

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

本章將介紹ARMCortext-M3編程模型、工作狀態(tài)與工作模式、ARM和Thumb狀態(tài)的寄存器組織、存儲(chǔ)器組織結(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級(jí)流水線、哈佛結(jié)構(gòu)、獨(dú)立的本地指令、數(shù)據(jù)總線以及用于外設(shè)的稍微低性能的第三條總線,可提供系統(tǒng)增強(qiáng)型特性,例如現(xiàn)代化調(diào)試特性和支持更高級(jí)別的塊集成。ARMCortex-M3CPU還包含一個(gè)支持隨機(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位的存儲(chǔ)器數(shù)據(jù)總線系統(tǒng)。Thumb-2在Thumb指令集架構(gòu)(ISA)上進(jìn)行了大量的改進(jìn),與Thumb相比,它的代碼密度更高,并且通過(guò)使用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)低中斷延遲,自動(dòng)保存和恢復(fù)處理器狀態(tài),可實(shí)現(xiàn)低延遲地進(jìn)入和退出中斷服務(wù)程序(ISR)。

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

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

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

(5)低成本調(diào)試解決方案。當(dāng)內(nèi)核正在運(yùn)行、被中止或處于復(fù)位狀態(tài)時(shí),能對(duì)系統(tǒng)中包括Cortex-M3寄存器組在內(nèi)的所有存儲(chǔ)器和寄存器進(jìn)行調(diào)試訪問(wèn);支持串行線(SW-DP)或JTAG(JTAG-DP)調(diào)試訪問(wèn);支持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),支持對(duì)printf類型的調(diào)試;提供跟蹤端口的接口單元(TPIU),用來(lái)連接跟蹤端口分析儀;提供可選的嵌入式跟蹤宏單元(ETM),實(shí)現(xiàn)指令跟蹤。

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

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

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

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

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

(1)

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

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

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

2.Cortex-M3的工作模式

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.堆棧指針寄存器r13

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

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

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

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

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

4.鏈接寄存器r14

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

其它任何時(shí)候都可以將r14看做一個(gè)通用寄存器。

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

main;主程序

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

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

Function1

…;function1的代碼

BXLR;函數(shù)返回

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

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

0x1000:MOVR0,PC;R0=0x1004

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

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

通過(guò)MRS/MSR指令,這3個(gè)PSR既可以單獨(dú)訪問(wèn),也可以組合訪問(wèn)(2個(gè)組合,3個(gè)組合都可以)。當(dāng)使用三合一的方式訪問(wèn)時(shí),應(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)指令來(lái)訪問(wèn)APSR。APSR的位分配示意圖如圖2.3所示。

圖2.3APSR的位分配示意圖●

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

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

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

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

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

2.中斷PSR(IPSR)

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

圖2.4IPSR的位分配示意圖

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

具體的中斷編號(hào)請(qǐng)參見(jiàn)有關(guān)中斷的章節(jié)。

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

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

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

(2)

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

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

圖2.5EPSR的位分配示意圖●

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

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

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

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

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

(1)

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

(2)

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

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

(1)

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

(2)

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

(3)

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

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

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

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

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

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

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

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

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

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

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

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

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

Cortex-M3的存儲(chǔ)器映射如圖2.8所示。

圖2.8Cortex-M3存儲(chǔ)器映射

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

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

地址空間的另一個(gè)512MB范圍由片上外設(shè)使用,地址范圍是0x40000000~0x5FFFFFFF。這個(gè)區(qū)中也有一條32MB的位帶別名,以便于快捷地訪問(wèn)外設(shè)寄存器,用法與內(nèi)部SRAM區(qū)中的位帶相同。例如,可以方便地訪問(wèn)各種控制位和狀態(tài)位。要注意的是,外設(shè)區(qū)內(nèi)不允許執(zhí)行指令。還有兩個(gè)1GB的范圍,分別用于連接外部RAM和外部設(shè)備,它們之中沒(méi)有位帶。兩者的區(qū)別在于外部RAM區(qū)允許執(zhí)行指令,而外部設(shè)備區(qū)則不允許。這兩個(gè)區(qū)域的地址范圍分別是0x60000000~0x9FFFFFFF和0xA0000000~0xDFFFFFFF。最后還剩下512MB的專用空間,包括了系統(tǒng)級(jí)組件、內(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è)備(這里的“外部”是對(duì)內(nèi)核而言)。這一部分還包括嵌入式跟蹤宏單元ETM和跟蹤端口接口單元TPIU。Cortex-M3允許器件制造商再添加一些片上APB外設(shè)到APB私有總線上,它們通過(guò)APB接口來(lái)訪問(wèn)。

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

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

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

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

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

Cortex-M3的缺省訪問(wèn)許可如表2.1所示。

當(dāng)一個(gè)用戶級(jí)訪問(wèn)被阻止時(shí),會(huì)立即產(chǎn)生一個(gè)總線fault。

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

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

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

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

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

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ū)寫入一個(gè)字與在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ū)的一個(gè)字返回0x01或0x00。0x01表示bit-band區(qū)中的目標(biāo)位置位;0x00表示目標(biāo)位清零。位[31:1]將為0。

例2.1

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

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

顯然,從操作的角度來(lái)說(shuō),使用bit-band操作的方式更簡(jiǎn)單,效率更高。

例2.2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

×

4

=

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

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

+

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

=

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

×

4

=

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

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

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

2.5.1NVIC概述

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

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

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

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

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

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

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

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

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

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

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

中斷優(yōu)先級(jí)寄存器見(jiàn)表2.7。

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

下面以一個(gè)簡(jiǎn)單的例子說(shuō)明如何建立一個(gè)外部中斷。

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

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

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

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

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

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

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

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

1.入棧

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

2.取向量

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

3.更新寄存器

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

(1)

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

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論