<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM CORTEX-M3 內核架構理解歸納

ARM CORTEX-M3 內核架構理解歸納

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
在我看來(lái),Cotex-M3內核的主要包括:嵌套向量中斷控制器(NVIC),取值單元,指令譯碼器,算數邏輯單元(ALU),寄存器組,存儲器映射(4GB統一編址各區域功能的劃分與界定),對于開(kāi)發(fā)者而言,其實(shí)主要關(guān)注的主要分為三大塊:

1、寄存器組2、地址功能劃分映射3、中斷機制(NVIC)。

本文引用地址:http://dyxdggzs.com/article/201611/319530.htm

1)寄存器組

Cortex-M3內核共有19組32位寄存器:

R0——R12(通用寄存器);

低寄存器組R0——R7

32位Thumb-2指令與16位Thumb指令均可訪(fǎng)問(wèn)

高寄存器組R8——R12

32位Thumb-2指令與極少數16位Thumb指令可訪(fǎng)問(wèn)

R13(堆棧指針寄存器);

主堆棧寄存器MSP(main-SP)/進(jìn)程堆棧寄存器PSP(Process-SP)同一時(shí)間只能使用其中一個(gè)。MSP供操作系統內核及中斷(異常)處理子程序使用,PSP只供用戶(hù)的應用程序代碼使用(詳細使用詳見(jiàn)3、嵌套向量中斷控制器(NVIC)的總結)。

堆棧指針是4字節對齊的,故最低兩位永遠是00;

R14(連接寄存器)

用于存儲程序返回的地址及PC的返回地址;

R15(程序寄存器)指向當前程序執行的地址;

2)特殊功能寄存器組

xPSR(程序狀態(tài)字寄存器組),32位,可分為三個(gè)寄存器分別進(jìn)行訪(fǎng)問(wèn),也可以PSR或xPSR的名字直接組合訪(fǎng)問(wèn)。

應用程序PSR(APSR)

中斷號PSR(IPSR)

執行PSR (EPSR)

中斷屏蔽寄存器

PRIMASK單一比特位,置位后,除NMI與硬fault外,其他中斷都不響應;

FAULTMASK單一比特位,置位后,除NMI外,其他中斷都不響應;

BASEPRI共有9位,中斷號小于等于該寄存器設置值的中斷都不響應;

控制寄存器control

Control[0]0決定特權級線(xiàn)程模式;1用戶(hù)級線(xiàn)程模式;

Control[1]0主堆棧;1進(jìn)程堆棧;

控制寄存器只能在特權級模式下改寫(xiě),handler模式永遠是特權級,且只允許使用主堆棧MSP

復位后,處理器進(jìn)入特權級+線(xiàn)程模式下;

2、地址功能劃分映射

Cortex-m3是一個(gè)32位處理器,其地址總線(xiàn)、數據總線(xiàn)都是32位的,故可在4G的地址范圍上資源尋址。Cortex-m3內核把4G空間劃定了基本的框架,定義不同的使用用途。

0x0000 0000 ----0x1FFF FFFF (512MB)該區域為code區(flash區),供指令總線(xiàn)與數據總線(xiàn)取指取數使用;可以執行指令;

0x2000 0000 ----0x3FFF FFFF (512MB)該區域為片上SRAM區,芯片制造商可在此布設RAM,可以將代碼復制到此處運行,該區域也是可以執行指令code的;低1MB空間可位尋址,通過(guò)位帶別名可擴展為32Mb的位尋址。

0x4000 0000 ----0x5FFF FFFF (512MB)該區域為“片上外設”區 ,主要為片上外設的相關(guān)寄存器,即特殊功能寄存器區,同理低1MB也可位尋址;該區域不可執行代碼;

0x6000 0000 ----0x9FFF FFFF(1G)該區域為片外RAM區,該區域可執行代碼;

0xA000 0000 ----0xDFFF FFFF(1G)該區域為片外外設區,該區域不可執行代碼;

0xE000 0000 ----0xFFFF FFFF(1G)該區域為系統區,該區域不可執行代碼;

所以不同地址片段的起始地址可簡(jiǎn)記為:0,2,4,6,10,E,

該系統區又分為兩部分:

內部私有外設區0xE000 0000 ----0xE003 FFFF(256KB)主要有NVIC,FPB,DWT,ITM等

外部私有外設區0xE004 0000 ----0xE00F FFFF(512+256=768KB)有ROM表,ETM,TPIU等

數據的大小端模式:CM-3既支持大端模式也支持小端模式,其中對于大端模式,ARM7中使用的是字不變大端模式,CM3中則為字節不變大端模式。雖說(shuō)大小端模式都支持,但依然建議在絕大多數情況下使用小端模式,如果一些外設是大端模式,可以通過(guò)REV/REVH指令便可輕松完成端模式的轉換。

3、中斷機制(NVIC)

既然稱(chēng)之為MCU而非MPU,那么就是以控制為主,控制的一個(gè)關(guān)鍵指標就是實(shí)時(shí)性,能夠及時(shí)對變化的情況作出反應,而這主要是通過(guò)中斷機制來(lái)完成的,可以說(shuō)除卻運算性能,cortex-M3內核的主要修為都體現在控制的實(shí)時(shí)性上——也即中斷的即時(shí)響應機制。

CM3對中斷是怎么定義的呢?

一個(gè)是CM3內核異常導致當前運行程序的中斷,一個(gè)是外部事件引入導致的。

系統異常主要是CM3內核層面的,復位,NMI,硬fault,這三者優(yōu)先級固定且最高,此外還有總線(xiàn)fault、內存管理fault、用法fault等,svc系統調用服務(wù)、systick等的優(yōu)先級可以通過(guò)編程來(lái)設定;這些都放在一個(gè)向量表里,存儲的是中斷服務(wù)函數的入口地址,32位,共256項,前16個(gè)是系統內的中斷,除去保留位,系統中斷共有16-5-1=10個(gè),剩余240個(gè)外部中斷IRQ,其中有三個(gè)的優(yōu)先級是固定的:復位,NMI,硬fault,中斷號分別為-3,-2,-1,中斷號越小,優(yōu)先級也就越高,其他優(yōu)先級都是可編程的。此外,對于復位啟動(dòng)過(guò)程,M3內核的MCU與傳統的單片機復位是不一樣的,傳統的單片機是直接從地址0處開(kāi)始運行,然后再執行地址0處的跳轉指令,跳轉到設定的程序起始段;而CM3復位后首先是在地址零處0x0000 0000取出主堆棧MSP的初始值,(因為CM3的堆棧是向下生長(cháng)型的,所以這個(gè)初始值一般設為RAM區的末地址+1,以保證堆棧足夠大,再啰嗦下,比方說(shuō)RAM區為0x2000 0000——0x3FFF FFFF那么初始值就設置為0x4000 0000);然后通過(guò)復位中斷號找到存放復位程序入口地址的地址單元(0x00000004),地址單元(0x00000004)存放著(zhù)第一條指令執行的地址(0x0000 0100)并賦給PC,PC就從這個(gè)地址里存放的指令依次執行。關(guān)于指令執行的地址需要嚴重關(guān)切:CM3運行在thumb狀態(tài),所以加載到PC中的值的最低位LSB必須置1,以區別ARM狀態(tài)(ARM為偶數),所以若想指向0x0000 0100的地址值,中斷向量表中存的復位程序入口地址應為0x0000 0101,用0x0000 0101表示0x0000 0100,這里不要把存儲數據的地址和PC的指向地址搞混,只有PC的執行地址LSB不能等于0,其他總線(xiàn)訪(fǎng)問(wèn)地址則沒(méi)有此限制。(為了把問(wèn)題解釋清楚,啰嗦的我自己都受不了了)為什么要首先初始化堆棧MSP呢?因為在復位的過(guò)程中也可能發(fā)生中斷,例如NMI,硬fault等。

中斷從發(fā)生到結束主要需要經(jīng)過(guò)以下這么幾個(gè)步驟:1捕獲并響應中斷,2現場(chǎng)保護,3中斷程序入口,4返回。下面就根據這個(gè)脈絡(luò )來(lái)總結cortexM3在提高中斷響應速度方面所涉及的重要知識點(diǎn)(這個(gè)講解順序針對已具備一定的基礎人員):

說(shuō)到中斷必涉及到優(yōu)先級、涉及到嵌套,在CM3中用8位來(lái)編程中斷的優(yōu)先級數,可實(shí)現256級優(yōu)先級,其中這8位又分為兩段,一段決定搶占優(yōu)先級的級數,一個(gè)決定亞優(yōu)先級的級數,其中規定搶占優(yōu)先級不得少于3位(8級優(yōu)先級),亞優(yōu)先級最少不得少于1位,所以搶占優(yōu)先級在M3中最多128級,在哪一位開(kāi)始分組由NVIC中的寄存器中(應用程序中斷及復位控制寄存器)的PRIGROUP來(lái)決定;但實(shí)際中,芯片制造商一般只使用最高幾位,比如5位,高三位(7,6,5)編程搶占優(yōu)先級,剩下的兩個(gè)次高位(4,3)用來(lái)決定亞優(yōu)先級,從第4位處作為亞優(yōu)先級的分組,這里通過(guò)一個(gè)分組寄存器來(lái)決定從哪一位做亞優(yōu)先級分組。

優(yōu)先級確定好了,那么在眾多不同優(yōu)先級的中斷面前,CM3又是以什么樣的機制來(lái)提高響應速度的呢?這就需要表一表在響應之前,處理器必須要做的工作——現場(chǎng)保護即保護當前的程序運行環(huán)境,依次入棧以下8個(gè)寄存器:程序狀態(tài)寄存器XPSR,程序計數器PC,返回地址寄存器LR(連接寄存器),R12,R0——R3,這些都是硬件自動(dòng)完成的。如果當前正在使用堆棧,則壓入相應的堆棧寄存器MSP/PSP值,當前在用PSP就壓入PSP,反之則壓入MSP,進(jìn)入中斷服務(wù)程序就將一直用MSP了;好了,請注意,提高中斷的響應速度就在這些寄存器的入棧順序上,我們知道,堆棧是建立在片上RAM中的,通過(guò)系統總線(xiàn)(system code)來(lái)操作(為什么要建立在RAM上,因為堆棧需要不停地做出棧、入棧等動(dòng)作,需要不斷改變存儲的值,而flash或rom只在燒寫(xiě)的時(shí)候寫(xiě)入數據),指令是存放在flash中的即code區通過(guò)指令總線(xiàn)(code bus)來(lái)操作,所以在入棧的時(shí)候先壓入xPSR的值,再壓入PC的值,壓入PC的值后,就可以通過(guò)指令總線(xiàn),根據中斷向量號取出中斷服務(wù)函數的地址賦給PC新的指令地址,進(jìn)行指令的預取,而堆棧仍然可以通過(guò)系統總線(xiàn)繼續壓入其他寄存器的值,與取指令操作并行不悖,互不干擾,加快了中斷的響應速度。相關(guān)寄存器可查詢(xún)權威手冊。

在響應中斷前所做的準備工作都做好了,那么當眾多中斷前來(lái)叫門(mén)時(shí),應該如何以最短的延時(shí)處理一系列的中斷呢?第一級中斷自不必說(shuō),根據中斷號來(lái)進(jìn)行仲裁,當發(fā)生中斷嵌套的時(shí)候,CM3中的一些響應機制就能加快整個(gè)中斷響應過(guò)程的速度了,低優(yōu)先級由于高優(yōu)先級中斷的搶占而處于掛起狀態(tài),當高優(yōu)先級中斷處理完畢,按照傳統的嵌套中斷處理流程,高優(yōu)先級中斷處理完成后應該出棧彈出內容,然后再入棧壓入先前彈出的內容,再處理被掛起的低優(yōu)先級中斷,按書(shū)中所說(shuō),這就是砸鍋煉鐵再鑄鍋的過(guò)程,完全沒(méi)有必要,于是CM3內核在處理一系列嵌套的中斷時(shí),總共只執行一次入棧,出棧工作,這樣處理連續的幾個(gè)嵌套中斷時(shí),就減少了很多環(huán)節,縮短了時(shí)間,尤其是嵌套級別計較深的時(shí)候,尤為明顯。但是要注意的是:不要嵌套太深,因為每嵌套一級就至少入棧8個(gè)32位的寄存器值(32B),如果本身就是中斷進(jìn)程,當前代碼正在使用堆棧,還要將堆棧的值再入棧,這樣無(wú)疑加大了堆棧的存儲壓力,如果用穿堆棧,發(fā)生溢出,程序十有八九就跑飛了,是很危險的,所以在應用中,要盡量減小中斷的嵌套深度。

之前的中斷響應機制發(fā)生在高級中斷打斷低優(yōu)先級中斷完成響應之后,譯者將其名曰:咬尾中斷;下面的中斷則發(fā)生在高優(yōu)先級中斷打斷低優(yōu)先級中斷準備響應之時(shí),當高優(yōu)先級中斷還沒(méi)來(lái)的時(shí)候,低優(yōu)先級中斷已經(jīng)把前期準備工作給做完了,這時(shí)候高優(yōu)先級中斷來(lái)了,那么此時(shí)高優(yōu)先級中斷會(huì )直接利用低優(yōu)先級中斷的前期工作成果,直接開(kāi)始響應,進(jìn)入服務(wù)中斷服務(wù)程序,而之前的低級中斷則被迫掛起,為別人做嫁衣了,沒(méi)辦法,內核就是這樣規定的,譯者將其譯為“晚到(的高優(yōu)先級)異常”我將其名為“后來(lái)居上”中斷。

中斷延遲時(shí)間:從檢測到中斷,到執行中斷服務(wù)程序的第一條指令,其間所流逝的時(shí)間。

書(shū)中云:如果存儲系統足夠快,入棧與取指令可以分別進(jìn)行,且中斷可以即刻得到響應不被搶占,那么所耗費的時(shí)間就是固定的12個(gè)周期(滿(mǎn)足硬實(shí)時(shí)要求的確定性)。如果多級嵌套中斷響應,算上咬尾中斷省去的出入棧時(shí)間,每個(gè)中斷可減少至6個(gè)周期。

最后再說(shuō)說(shuō)異常即fault,內核活動(dòng)層面的東西,這個(gè)本應是需要大書(shū)特書(shū)的東西,尤其是在調試程序的時(shí)候找bug上,是體現一個(gè)人技能水平的很重要的方面,但是限于時(shí)間與研究深度,暫時(shí)不深究了,

就一句話(huà)吧:運行時(shí)出現的系統錯誤有時(shí)候不是編程上的語(yǔ)法錯誤,如果不了解內核架構和一些使用準則,是很難發(fā)現bug在哪里,這就需要追溯到底是程序運行到哪里出了問(wèn)題,導致內核運行出現了錯誤,得益于CM3完備的調試架構,很多fault的產(chǎn)生都會(huì )被監測到,并記錄在對應的寄存器中,按圖索驥就知道問(wèn)題出在哪里,是哪條指令導致的,借此針對性的自查、分析、修改。

下面將結合上面的內核架構以及內核運行機制,針對具體的基于cortex—M4內核(M4比M3內核多了DSP與FPU)的STM32F407芯片,進(jìn)行硬件資源的對比。



關(guān)鍵詞: ARMCORTEX-M3內核架

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>