![Cortex-M3學(xué)習(xí)小結(jié)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/174b574a-1e03-4faf-9275-4307e89d00a8/174b574a-1e03-4faf-9275-4307e89d00a81.gif)
![Cortex-M3學(xué)習(xí)小結(jié)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/174b574a-1e03-4faf-9275-4307e89d00a8/174b574a-1e03-4faf-9275-4307e89d00a82.gif)
![Cortex-M3學(xué)習(xí)小結(jié)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/174b574a-1e03-4faf-9275-4307e89d00a8/174b574a-1e03-4faf-9275-4307e89d00a83.gif)
![Cortex-M3學(xué)習(xí)小結(jié)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/174b574a-1e03-4faf-9275-4307e89d00a8/174b574a-1e03-4faf-9275-4307e89d00a84.gif)
![Cortex-M3學(xué)習(xí)小結(jié)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/174b574a-1e03-4faf-9275-4307e89d00a8/174b574a-1e03-4faf-9275-4307e89d00a85.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Cortex-M3 學(xué)習(xí)小結(jié) 2012.112內(nèi)容 Cortex-M3 匯編指令集 AMBA總線AHB & APB 流水線技術(shù) 異常和中斷 與ARM7的比較3內(nèi)容 Cortex-M3 匯編指令集 AMBA總線AHB & APB 流水線技術(shù) 異常和中斷 與ARM7的比較ARM 各種架構(gòu)版本45CM3芯片6CM3內(nèi)核CM3操作模式和特權(quán)極別 當(dāng)處理器處在線程狀態(tài)下時(shí),既可以使用特權(quán)級(jí)也可以使用用戶級(jí);另一方面,handler模式總是特權(quán)級(jí)的。在復(fù)位后,處理器進(jìn)入線程模式特權(quán)級(jí)。7CM3 寄存器組8 如我們所見(jiàn),CM3擁有通用寄存器R0-R15以及一些特殊功能寄存器。R0-R12是最
2、“通用目的”的,但是絕大多數(shù)的16位指令只能使用R0-R7(低組寄存器),而32位的Thumb-2指令則可以訪問(wèn)所有通用寄存器。 特殊功能寄存器有預(yù)定義的功能,而且必須通過(guò)專用的指令來(lái)訪問(wèn)。堆棧指針R13 主堆棧指針(MSP),或?qū)懽鱏P_main。這是缺省的堆棧指針,它由OS內(nèi)核、異常服務(wù)例程以及所有需要特權(quán)訪問(wèn)的應(yīng)用程序代碼來(lái)使用。 進(jìn)程堆棧指針(PSP),或?qū)慡P_process。用于常規(guī)的應(yīng)用程序代碼(不處于異常服用例程中時(shí))。9堆棧指針R13(續(xù))10連接寄存器R14l R14是連接寄存器(LR)。在一個(gè)匯編程序中,你可以把它寫作LR和R14。LR用于在調(diào)用子程序時(shí)存儲(chǔ)返回地址。例如
3、,當(dāng)你在使用BL(分支并連接,Branch and Link)指令時(shí),就自動(dòng)填充LR的值。main ;主程序BL function1 ; 使用“分支并連接”指令呼function1;PC=function1,并且LR=main的下一條指令地址 function1 ; function1的代碼 BX LR ; 函數(shù)返回(如果function1要使用LR,必須在使用前 ; PUSH, 否則返回時(shí)程序就可能跑飛了)11程序計(jì)數(shù)器R15l R15是程序計(jì)數(shù)器,在匯編代碼中一般我們都都叫它的外號(hào)“PC”。因?yàn)?CM3內(nèi)部使用了指令流水線,讀PC時(shí)返回的值是當(dāng)前指令的地址+4。l 如:0 x1000: M
4、OV R0, PC ; R0 = 0 x100412特殊功能寄存器組Cortex-M3中的特殊功能寄存器包括: 程序狀態(tài)寄存器組(PSRs或曰xPSR) 中斷屏蔽寄存器組(PRIMASK, FAULTMASK,以及BASEPRI) 控制寄存器(CONTROL) 它們只能被專用的MSR/MRS指令訪問(wèn),而且它們也沒(méi)有與之相關(guān)聯(lián)的訪問(wèn)地址。MRS , ;讀特殊功能寄存器的值到通用寄存器 MSR , ;寫通用寄存器的值到特殊功能寄存器13程序狀態(tài)寄存器組 (PSRs或xPSR)l 程序狀態(tài)寄存器在其內(nèi)部又被分為三個(gè)子狀態(tài)寄存器:u 應(yīng)用程序PSR(APSR)u 中斷號(hào)PSR(IPSR)u 執(zhí)行PSR
5、(EPSR)14中斷屏蔽寄存器組15控制寄存器(CONTROL)16CM3存儲(chǔ)器系統(tǒng)CM3的存儲(chǔ)器系統(tǒng)與從傳統(tǒng)ARM架構(gòu)的相比,已經(jīng)有過(guò)脫胎換骨般的改革了:l 第一, 它的存儲(chǔ)器映射是預(yù)定義的,并且還規(guī)定好了哪個(gè)位置使用哪條總線。l 第二, CM3的存儲(chǔ)器系統(tǒng)支持所謂的“位帶”(bit-band)操作。通過(guò)它,實(shí)現(xiàn)了對(duì)單一比特的原子操作。位帶操作僅適用于一些特殊的存儲(chǔ)器區(qū)域中,見(jiàn)本章論述。l 第三, CM3的存儲(chǔ)器系統(tǒng)支持非對(duì)齊訪問(wèn)和互斥訪問(wèn)。這兩個(gè)特性是直到了v7M時(shí)才出來(lái)的。l 最后,CM3的存儲(chǔ)器系統(tǒng)支持小端配置和大端配置。17CM3存儲(chǔ)器映射18存儲(chǔ)器的缺省訪問(wèn)許可19位帶操作l 支持
6、了位帶操作后,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(jìn)行讀寫。在CM3中,有兩個(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)原始比特的目的。20位帶操作21非對(duì)齊數(shù)據(jù)傳送l CM3支持在單一的訪問(wèn)中使用非(地址)對(duì)齊的傳送,數(shù)據(jù)存儲(chǔ)器的訪問(wèn)無(wú)需對(duì)齊。在以前,ARM處理器只允許對(duì)齊的數(shù)據(jù)傳送。這種對(duì)齊是說(shuō):以字為單位的傳送,其地址的最低兩位必須是0;以半字為單位的傳送,其地址的
7、LSB必須是0;以字節(jié)為單位的傳送則無(wú)所謂對(duì)不對(duì)齊。l 在CM3中,非對(duì)齊的數(shù)據(jù)傳送只發(fā)生在常規(guī)的數(shù)據(jù)傳送指令中,如LDR/LDRH/LDRSH。其它指令則不支持,包括:u 多個(gè)數(shù)據(jù)的加載/存儲(chǔ)(LDM/STM)u 堆棧操作PUSH/POPu 互斥訪問(wèn)(LDREX/STREX)。如果非對(duì)齊會(huì)導(dǎo)致一個(gè)用法faultu 位帶操作。因?yàn)橹挥蠰SB有效,非對(duì)齊的訪問(wèn)會(huì)導(dǎo)致不可預(yù)料的結(jié)果。22互斥訪問(wèn)l 在新版的ARM處理器中,讀/寫訪問(wèn)往往使用不同的總線,導(dǎo)致SWP無(wú)法再保證操作的原子性,因?yàn)橹挥性谕粭l總線上的讀/寫能實(shí)現(xiàn)一個(gè)互鎖的傳送。因此,互鎖傳送必須用另外的機(jī)制實(shí)現(xiàn),這就引入了“互斥訪問(wèn)”。互
8、斥訪問(wèn)的理念同SWP非常相似,不同點(diǎn)在于:在互斥訪問(wèn)操作下,允許互斥體所在的地址被其它總線master訪問(wèn),也允許被其它運(yùn)行在本機(jī)上的任務(wù)訪問(wèn),但是CM3能夠“駁回”有可能導(dǎo)致競(jìng)態(tài)條件的互斥寫操作。23端模式l CM3支持小端模式和大端模式。但是,單片機(jī)其它部分的設(shè)計(jì),包括總線的連接,內(nèi)存控制器以及外設(shè)的性質(zhì)等,也共同決定可以支持的內(nèi)存類型。所以在設(shè)計(jì)軟件之前,一定要先在單片機(jī)的數(shù)據(jù)手冊(cè)上查清楚可以使用的端。l 在CM3中,是在復(fù)位時(shí)確定使用哪種端模式的,且運(yùn)行時(shí)不得更改。指令預(yù)取永遠(yuǎn)使用小端模式,在配置控制存儲(chǔ)空間的訪問(wèn)也永遠(yuǎn)使用小端模式(包括NVIC, FPB等)。另外,外部私有總線地址區(qū)
9、0 xE0000000至0 xE00FFFFF也永遠(yuǎn)使用小端模式。24CM3電源管理l 兩種睡眠模式依次為:u 睡眠:由CM3處理器的SLEEPING信號(hào)指示 u 深度睡眠:由CM3處理器的SLEEPDEEP信號(hào)指示為了判定當(dāng)前使用的是哪一種睡眠模式,以及其它睡眠時(shí)的上下文,需要檢視在NVIC的系統(tǒng)控制寄存器25WFI/WFE進(jìn)入睡眠26WFI/WFE喚醒l WFI/WFE除了進(jìn)入睡眠的序列不同外,它們的喚醒行為也有所不同。l 當(dāng)從WFI喚醒時(shí),要根據(jù)異常系統(tǒng)的游戲規(guī)則來(lái)決定是否喚醒。只有當(dāng)該中斷的優(yōu)先級(jí)比當(dāng)前優(yōu)先級(jí)要高(如果是在服務(wù)例程中使用WFI),并且比BASEPRI掩蔽的高時(shí),才喚醒處
10、理器并執(zhí)行ISR。但如果PRIMASK置位,則依然喚醒處理器,然而ISR卻不執(zhí)行了。l WFE則有點(diǎn)區(qū)別,不管優(yōu)先級(jí)和掩蔽情況如何,只要SEVONPEND置位,它就會(huì)不錯(cuò)過(guò)任何一個(gè)事件,在發(fā)生事件時(shí)一定把處理器喚醒。至于是否執(zhí)行ISR,則與WFI的規(guī)則相同。27SleepOnExitl CM3還有一個(gè)“自動(dòng)睡眠”的機(jī)制:SleepOnExit它可以被編程為從中斷服務(wù)例程返回后立即睡眠。這樣一來(lái),處理器的所有工作就只是響應(yīng)中斷了,其它時(shí)間都在睡眠。在真實(shí)的應(yīng)用程序里,通常只有在程序很簡(jiǎn)單的電池供電設(shè)備中,才會(huì)用此功能。如欲使用此特性,需要把系統(tǒng)控制寄存器中的SLEEPONEXIT位置位。28MP
11、Ul 在Cortex-M3處理器中可以選配一個(gè)存儲(chǔ)器保護(hù)單元(MPU),它可以實(shí)施對(duì)存儲(chǔ)器(主要是內(nèi)存和外設(shè)寄存器)的保護(hù),從而使軟件更加健壯和可靠。如果打算啟用MPU,則在使用前,必須根據(jù)需要對(duì)其編程。如果沒(méi)有啟用MPU,則等同于系統(tǒng)中沒(méi)有配MPU。MPU有如下的能力可以提高系統(tǒng)的可靠性:u 阻止用戶應(yīng)用程序破壞操作系統(tǒng)使用的數(shù)據(jù)u 阻止一個(gè)任務(wù)訪問(wèn)其它任務(wù)的數(shù)據(jù)區(qū),從而把任務(wù)隔開(kāi)。u 可以把關(guān)鍵數(shù)據(jù)區(qū)設(shè)置為只讀,從根本上消除了被破壞的可能。u 檢測(cè)意外的存儲(chǔ)訪問(wèn),如,堆棧溢出,數(shù)組越界。u 此外,還可以通過(guò)MPU設(shè)置存儲(chǔ)器regions的其它訪問(wèn)屬性,比如,是否緩區(qū),是否緩沖等。29MPU
12、(續(xù))l MPU在執(zhí)行其功能時(shí),是以所謂的“region”為單位的。一個(gè)region其實(shí)就是一段連續(xù)的地址,只是它們的位置和范圍都要滿足一些限制(對(duì)齊方式,最小容量等)。CM3的MPU共支持8個(gè)regions。怎么,嫌少?是少了點(diǎn),不過(guò),還允許把每個(gè)region進(jìn)一步劃分成更小的“子region”。此外,還允許啟用一個(gè)“背景region”(即沒(méi)有MPU時(shí)的全部地址空間),不過(guò)它是只能由特權(quán)級(jí)享用。在啟用MPU后,就不得再訪問(wèn)定義之外的地址區(qū)間,也不得訪問(wèn)未經(jīng)授權(quán)的region。否則,將以“訪問(wèn)違例”處理,觸發(fā)MemManage fault。30復(fù)位信號(hào)3132內(nèi)容 Cortex-M3 匯編指令
13、集 AMBA總線AHB & APB 流水線技術(shù) 異常和中斷 與ARM7的比較指令集概述l 在過(guò)去,做ARM開(kāi)發(fā)必須處理好兩個(gè)狀態(tài)。這兩個(gè)狀態(tài)是井水不犯河水的,它們是:32位的ARM狀態(tài)和16位的Thumb狀態(tài)。當(dāng)處理器在ARM狀態(tài)下時(shí),所有的指令均是32位的(哪怕只是個(gè)”NOP”指令),此時(shí)性能相當(dāng)高。而在Thumb狀態(tài)下,所有的指令均是16位的,代碼密度提高了一倍。不過(guò),thumb狀態(tài)下的指令功能只是ARM下的一個(gè)子集,結(jié)果可能需要更多條的指令去完成相同的工作,導(dǎo)致處理性能下降。l 伴隨著Thumb-2指令集的橫空出世,終于可以在單一的操作模式下搞定所有處理了,再也沒(méi)有來(lái)回切換的事來(lái)
14、煩你了。事實(shí)上,Cortex-M3內(nèi)核干脆都不支持ARM指令,中斷也在Thumb態(tài)下處理(以前的ARM總是在ARM狀態(tài)下處理所有的中斷和異常)。這可不是小便宜,它使CM3在好幾個(gè)方面都比傳統(tǒng)的ARM處理器更先進(jìn):u 消滅了狀態(tài)切換的額外開(kāi)銷,節(jié)省了both 執(zhí)行時(shí)間和指令空間。u 不再需要把源代碼文件分成按ARM編譯的和Thumb編譯的,軟件開(kāi)發(fā)管理大大減負(fù)。u 無(wú)需再反復(fù)地求證和測(cè)試:究竟該在何時(shí)何地切換到何種狀態(tài)下,我的程序才最有效率。開(kāi)發(fā)軟件容易多了。33CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l MRS和MSR雖然名字與以前的ARM相同,但功能變了。這兩條指令是訪問(wèn)特殊功能寄存
15、器的“專用通道”當(dāng)然必須在特權(quán)級(jí)下使用,除了APSR可以在用戶級(jí)下訪問(wèn)外。指令語(yǔ)法如下:MRS , ;加載特殊功能寄存器的值到RnMSR , ;存儲(chǔ)Rn的值到特殊功能寄存器SReg可以是下表中的一個(gè):34CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l IF-THENu IF-THEN(IT)指令圍起一個(gè)塊,里面最多有4條指令,它里面的指令可以條件執(zhí)行。IT指令已經(jīng)帶了一個(gè)“T”,因此還可以最多再帶3個(gè)“T”或者“E”。并且對(duì) T和E的順序沒(méi)有要求。其中T對(duì)應(yīng)條件成立時(shí)執(zhí)行的語(yǔ)句,E對(duì)應(yīng)條件不成立時(shí)執(zhí)行的語(yǔ)句。在If-Then塊中的指令必須加上條件后綴,且T對(duì)應(yīng)的指令必須使用和IT指令中相同
16、的條件,E對(duì)應(yīng)的指令必須使用和IT指令中相反的條件。u IT 指令使能了指令的條件執(zhí)行方式,并且使CM3不再預(yù)取不滿足條件的指令。又因?yàn)樗谑褂脮r(shí)取代了條件轉(zhuǎn)移指令,還避免了在執(zhí)行流轉(zhuǎn)移時(shí),對(duì)流水線的清洗和重新指令預(yù)取的開(kāi)銷,所以能優(yōu)化C結(jié)構(gòu)中的微小if 塊和很多“?:”運(yùn)算符 35CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l SDIV和UDIV突破性的32位硬件除法指令,如下所示:SDIV.W Rd, Rn, RmUDIV.W Rd, Rn, Rm運(yùn)算結(jié)果是 Rd= Rn/Rm,余數(shù)被丟棄。例如:LDR r0, =300MOV R1, #7UDIV.W R2, R0, R1則R2= 3
17、00/7 =44 為了捕捉被零除的非法操作,你可以在NVIC的配置控制寄存器中置位DIVBYZERO位。這樣,如果出現(xiàn)了被零除的情況,將會(huì)引發(fā)一個(gè)用法fault 異常。如果沒(méi)有任何措施,Rd將在除數(shù)為零時(shí)被清零。36CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l REV, REVH,REV16以及REVSHREV反轉(zhuǎn)32位整數(shù)中的字節(jié)序,REVH則以半字為單位反轉(zhuǎn),且只反轉(zhuǎn)低半字。語(yǔ)法格式為:REV Rd, RmREVH Rd, RmREV16 Rd, RmREVSH Rd, Rm例如,記R0=0 x12345678,在執(zhí)行下列兩條指定后:REV R1, R0REVH R2, R0REV1
18、6 R3, R0則R1=0 x78563412,R2=0 x12347856,R3=0 x34127856。這些指令專門服務(wù)于小端模式和大端模式的轉(zhuǎn)換,最常用于網(wǎng)絡(luò)應(yīng)用程序中(網(wǎng)絡(luò)字節(jié)序是大端,主機(jī)字節(jié)序常是小端)。REVSH在REVH的基礎(chǔ)上,還把轉(zhuǎn)換后的半字做帶符號(hào)擴(kuò)展。例如,記R0=0 x33448899,則 REVSH R1, R0執(zhí)行后,R1=0 xFFFF998837CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l RBITRBIT比前面的REV之流更精細(xì),它是按位反轉(zhuǎn)的,相當(dāng)于把32位整數(shù)的二進(jìn)制表示法水平旋轉(zhuǎn)180度。其格式為:RBIT.W Rd, Rn這個(gè)指令在處理串行比特
19、流時(shí)大有用場(chǎng),而且?guī)缀醯搅藳](méi)它不行的地步例如, 記 R1=0 xB4E10C23(二進(jìn)制數(shù)值為 1011,0100,1110,0001,0000,1100,0010,0011),RBIT.W R0, R1 執(zhí)行后,則R0=0 xC430872D(二進(jìn)制數(shù)值為1100,0100,0011,0000,1000,0111,0010,1101)這條指令單獨(dú)使用時(shí)看不出什么作用,但是與其它指令組合使用時(shí)往往有特效,高級(jí)技巧常用到它。38CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l SXTB, SXTH, UXTB, UXTH這4個(gè)指令是為了體貼C語(yǔ)言的強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換而設(shè)的,把數(shù)據(jù)寬度轉(zhuǎn)換成處理器
20、喜歡的32位長(zhǎng)度(處理器字長(zhǎng)是多少,就喜歡多長(zhǎng)的整數(shù),其操作效率和存儲(chǔ)效率都最高)。它們的語(yǔ)法如下:SXTB Rd, RnSXTH Rd, RnSXTB Rd, RnUXTH Rd, Rn對(duì)于SXTB/SXTH,數(shù)據(jù)帶符號(hào)位擴(kuò)展成32位整數(shù)。對(duì)于UXTB/UXTH,高位清零。例如,記R0=0 x55aa8765,則SXTB R1, R0 ; R1=0 xffffff65SXTH R1, R0 ; R1=0 xffff8765UXTB R1, R0 ; R1=0 x00000065UXTH R1, R0 ; R1=0 x0000876539CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l BF
21、C/BFIBFC(位段清零)指令把32位整數(shù)中任意一段連續(xù)的2進(jìn)制位s清0,語(yǔ)法格式為:BFC.W Rd, #lsb, #width其中,lsb 為位段的末尾,width則指定在lsb 和它的左邊(更高有效位),共有多少個(gè)位參與操作。例如,LDR R0, =0 x1234FFFFBFC R0, #4, #10執(zhí)行完后,R0= 0 x1234C00FBFI(位段插入指令)把某個(gè)寄存器按LSB對(duì)齊的數(shù)值,拷貝到另一個(gè)寄存器某個(gè)位段中BFI.W Rd, Rn, #lsb, #width例如,LDR R0, =0 x12345678LDR R1, =0 xAABBCCDDBFI.W R1, R0, #
22、8, #16則執(zhí)行后,R1= 0 xAA5678DD 40CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l UBFX/SBFXUBFX/SBFX都是位段提取指令,語(yǔ)法格式為:UBFX.W Rd, Rn, #lsb, #widthSBFX.W Rd, Rn, #lsb, #widthUBFX從Rn中取出任一個(gè)位段,執(zhí)行零擴(kuò)展后放到Rd中。例如:LDR R0, =0 x5678ABCDUBFX.W R1, R0, #12,#16則R0=0 x0000678A類似地,SBFX也抽取任意的位段,但是以帶符號(hào)的方式進(jìn)行擴(kuò)展。例如:LDR R0, =0 x5678ABCDSBFX.W R1, R0, #
23、8,#4則R0=0 xFFFFFFFB41CM3中一些前衛(wèi)的指令(v6v7 才開(kāi)始支持的)l LDRD/STRD CM3在一定程度上支持64位整數(shù)。其中LDRD/STRD就是為64位整數(shù)的數(shù)據(jù)傳送而設(shè)的,語(yǔ)法格式為:LDRD.W RL, RH, Rn, #+/-offset ! ;可選預(yù)索引的64位整數(shù)加載LDRD.W RL, RH, Rn,#+/-offset ;后索引的64位整數(shù)加載STRD.W RL, RH, Rn, #+/-offset ! ;可選預(yù)索引的64位整數(shù)存儲(chǔ)STRD.W RL, RH, Rn,#+/-offset ;后索引的64位整數(shù)存儲(chǔ)例如,記 (0 x1000)= 0
24、x1234_5678_ABCD_EF00:則LDR R2, =0 x1000 ;LDRD.W R0, R1, R2執(zhí)行后, R0= 0 xABCD_EF00, R1=0 x1234_5678同理,我們也可以使用STRD來(lái)存儲(chǔ)64位整數(shù)。在上面的例子執(zhí)行完畢后,若執(zhí)行如下代碼:STRD.W R1, R0, R2執(zhí)行后, (0 x1000)=0 xABCD_EF00_1234_5678,從而實(shí)現(xiàn)了雙字的字序反轉(zhuǎn)操作。42CM3中詳細(xì)指令集指令集的詳細(xì)信息由ARMv7-M Architecture Application Level Reference Manual A5.7 Alphabetica
25、l list of Thumb instructions4344內(nèi)容 Cortex-M3 匯編指令集 AMBA總線AHB & APB 流水線技術(shù) 異常和中斷 與ARM7的比較 Advanced Microcontroller Bus Architecture 片上總線的標(biāo)準(zhǔn) 定義了三種總線 AHB (Advanced High-performance Bus) ASB (Advanced System Bus) APB (Advanced Peripheral Bus)45AMBA介紹l 處理器和其它主設(shè)備/從設(shè)備都是可以替換46一個(gè)典型的AMBA系統(tǒng)AHBl高速總線,高性能l流水線操
26、作l可支持多個(gè)總線主設(shè)備l上升沿觸發(fā)操作l支持Burst傳輸l非三態(tài)l寬數(shù)據(jù)位:8、16、32、64、128、512、 1024bits47AHB組成部分l AHB 主設(shè)備(master)u 初始化一次讀/寫操作u 某一時(shí)刻只允許一個(gè)主設(shè)備使用總線u uP、DMA、DSP、LCDC l AHB從設(shè)備(slave)u 響應(yīng)一次讀/寫操作u 通過(guò)地址映射來(lái)選擇使用哪一個(gè)從設(shè)備u 外部存儲(chǔ)器控制器、APB橋、UART、 l AHB仲裁器(arbiter)u 允許某一個(gè)主設(shè)備控制總線u 在AMBA協(xié)議中沒(méi)有定義仲裁算法l AHB譯碼器(decoder)u 通過(guò)地址譯碼來(lái)決定選擇哪一個(gè)從設(shè)備48AHB傳
27、輸49發(fā)起一個(gè)請(qǐng)求給仲裁器驅(qū)動(dòng)地址和控制信號(hào)允許某個(gè)主設(shè)備控制總線僅選中的從設(shè)備響應(yīng)地址/控制信號(hào)拉高HREADY信號(hào),總線傳輸完成AMBA AHB-Lite5051AHB主 從設(shè)備接口5152AHB Decoder52AHB信號(hào)53基本AHB信號(hào)l HCLK 總線時(shí)鐘l HRESETn 總線復(fù)位,低電平有效l HADDR31:0 32位系統(tǒng)地址總線l HWDATA31:0 寫數(shù)據(jù)總線,從主設(shè)備寫到從設(shè)備l HRDATA31:0 讀數(shù)據(jù)總線,從從設(shè)備讀到主設(shè)備54基本AHB信號(hào)(續(xù))lHTRANS 指出當(dāng)前傳輸?shù)念愋?NONSEQ、SEQ、IDLE、BUSYl HRESP 從設(shè)備發(fā)給主設(shè)備的總
28、線傳輸狀態(tài) OKAY、ERRORl HBURST 指出傳輸?shù)腷urst類型l HREADY 高:從設(shè)備指出傳輸結(jié)束 低電平:從設(shè)備需延長(zhǎng)傳輸周期5556其它AHB控制信號(hào)l HWRITE 高電平:寫 低電平:讀l HSIZE2:0 000:8bits 100:128bits 001:16bits 101:256bits 010:32bits 110:513bits 011:64bits 111:1024bits 最大值受總線的配置所限制 通常使用32bits(010) l HPROT3:0 HPROT0: OPCODE/DATA HPROT1: USER/PRIVILGED HPROT2: B
29、ufferable/Non-Bufferable HPROT3: Cacheable/Non-Cacheable5657數(shù)據(jù)總線 不是三態(tài)總線,讀數(shù)據(jù)總線和寫數(shù)據(jù)總線分開(kāi) 大小端模式 在AMBA定義中沒(méi)有定義 主設(shè)備和從設(shè)備應(yīng)該采用同樣的大小端模式 不支持動(dòng)態(tài)大小端轉(zhuǎn)換 對(duì)于IP設(shè)計(jì), 只有應(yīng)用面比較廣泛的應(yīng)用程序才支持兩種端模式。5758小端模式數(shù)據(jù)的有效字節(jié)5859大端模式數(shù)據(jù)的有效字節(jié)59時(shí)鐘和復(fù)位要求l時(shí)鐘u每個(gè)AHB-Lite部件使用一個(gè)單一的時(shí)鐘信號(hào)HCLK。所有的輸入信號(hào)都在該信號(hào)的上升沿采樣。所有的輸出信號(hào)必須在上升沿后改變。l復(fù)位u復(fù)位信號(hào)HRESETn是所有總線元素的復(fù)位信
30、號(hào),低有效,可以進(jìn)行異步置位,但推薦在HCLK信號(hào)的上升沿后同步置位。復(fù)位中,所有的Master必須確保地址和控制信號(hào)處于正確的電平,并且HTRANS1:0置為IDLE;所有的Slave必須保證HREADYOUT為高。60基本AHB傳輸l兩個(gè)階段 地址周期,只有一個(gè)有效周期 數(shù)據(jù)周期,由HBURST信號(hào)決定需要幾個(gè)有效周期l流水線傳送 先是有效地址周期,然后是有效數(shù)據(jù)周期61基本AHB傳輸(續(xù))l一次無(wú)需等待狀態(tài)的簡(jiǎn)單傳輸62Master release address and controlSlave sample the addressMaster sample the dataIf sl
31、ave hasnt ready to receive data, how to deal with it?63Not readyNot readyReadyNote: according to spec, slave shouldnt insert more than 16 wait cycles! 需要兩個(gè)等待周期的簡(jiǎn)單傳輸63基本AHB傳輸(續(xù))One transfer need at least two cycles, how to promote its efficiency?64PipelineA AddressA DataB AddressB DataC AddressC Data
32、64基本AHB傳輸(續(xù))Slave decodes every transfer, one transfer on wait, how to decrease the wait cycles?65Burst TransferAAA+4A+4A+8A+8A+12A+12HBURST shows the burst types:Single TransferIncrementing transfer with unspecified length4-beat 8-beat16-beatSlave has know that master need 4 data, A/A+4/A+8/A+12Dur
33、ing burst transfer, if slave is not ready, then hready=0; but if master is not ready, how to do?65基本AHB傳輸(續(xù))66 HTRANS1:0:傳輸類型 四種類型:IDLE、BUSY、NONSEQ、SEQ 00:IDLE 主設(shè)備占用總線,但沒(méi)進(jìn)行傳輸 兩次burst傳輸中間主設(shè)備可發(fā)IDLE 01:BUSY 主設(shè)備占用總線,但是在burst傳輸過(guò)程中還沒(méi)有準(zhǔn)備好進(jìn)行下一次傳輸 一次burst傳輸中間主設(shè)備可發(fā)BUSY傳輸類型6667傳輸類型(續(xù)) 10:NOSEQ 表明一次單個(gè)數(shù)據(jù)的傳輸 或者一次
34、burst傳輸?shù)牡谝粋€(gè)數(shù)據(jù) 地址和控制信號(hào)與上一次傳輸無(wú)關(guān) 11:SEQ 表明burst傳輸接下來(lái)的數(shù)據(jù) 地址和上一次傳輸?shù)牡刂肥窍嚓P(guān)的6768The first transfer Master is busyThe subsequent transferThe subsequent transferSlave is not readyThe subsequent transfer傳輸類型舉例6869BURST傳輸l AHB Burst 操作 4beat、8beat、16beat、單個(gè)字節(jié)傳輸、未定義長(zhǎng)度的傳輸 支持incrementing和wrapping兩種burst傳輸l Increme
35、nting burst 地址是上一次的傳輸?shù)刂芳?個(gè)傳輸單位l Wrapping burst 例:4beat的wrapping burst 字傳輸(4byte): 0 x34 - 0 x38 - 0 x3c - 0 x30 應(yīng)用場(chǎng)合:Cache填充注意:Master不允許開(kāi)始一個(gè)跨越1KB地址邊界的遞增Burst。6970INCR4 Burst707171WRAP4 Burst72INCR8 BurstHCLKSEQNSEQSEQSEQSEQSEQINCR80 x600 x680 x640 x6c0 x740 x70HTRANSHBURSTHADDRHRDATAd1d0d2d4d3d50 x7
36、80 x7cSEQSEQd6d77273WRAP8 BurstHCLKSEQNSEQSEQSEQSEQSEQWRAP80 x700 x780 x740 x7c0 x640 x60HTRANSHBURSTHADDRHRDATAd5d4d6d0d7d10 x680 x6cSEQSEQd2d3start of line7374未定義長(zhǎng)度的Burst傳輸7475注意! Burst傳輸不能穿越1K邊界 一個(gè)從設(shè)備最小的地址間隙是1KB NONSEQ - SEQ - 1KB Boundary - NONSEQ - SEQ 主設(shè)備不能試圖開(kāi)始一個(gè)可能穿越1K邊界的INCR傳輸7576INCR Burst o
37、ver 1k boundaryHCLKSEQNSEQSEQNSEQSEQSEQINCR0 x3F00 x3F80 x3F40 x3FC0 x4040 x400HTRANSHBURSTHADDRHRDATAd1d0d2d4d3d50 x408 0 x40CSEQSEQd6d7start of 1k page7677從設(shè)備響應(yīng)信號(hào)77例:ERROR響應(yīng)的傳輸78APB7980APB信號(hào)8081APB信號(hào)(續(xù))l PADDR31:0 地址總線,由設(shè)備總線的bridge單元驅(qū)動(dòng)l PSELx 從譯碼器來(lái)的信號(hào),到每一個(gè)總線從設(shè)備xl PENABLE 用于在設(shè)備總線上把所有訪問(wèn)按時(shí)間階段進(jìn)行l(wèi) PWRI
38、TE 高電平:寫 低電平:讀l PRDATA和PWDATA 最多32位寬8182Address Decoding StagesSlave 3(APB)Slave 1(EBI)Slave 2(SRAM)0 xCFFF_FFFF0 xC000_00000 x5000_FFFF0 x5000_00000 x3FFF_FFFF0 x0000_0000Peripheral 3(UART)Peripheral 1(Int Cont)Peripheral 2(Timers)0 xC3FF_FFFF0 xC300_00000 xC2FF_FFFF0 xC100_00000 xC000_FFFF0 xC000_
39、0000APBmemory mapTimer 2Timer 10 xC2FF_FFFF0 xC200_00000 xC1FF_FFFF0 xC100_0000AHB DecoderHSELapbPSELtimAPB BridgeTimersAHBmemory mapTimersmemory map8283APB InterconnectAHB2APBBridgeAPBMasterPADDRHCLKPSEL#1PWRITEPSEL#2PSEL#3PCLKHADDRHWRITEPeripheral #1Peripheral #3Peripheral #2PENABLEPWDATAPRDATAHRD
40、ATAHSELHWDATAAHBAPB8384寫傳輸8485讀傳輸8586BridgeHow to translate ahb pipelined timing to 2-cycle apb timing?8687Bridge FSMAHB Transfer8788APB Slave8889APB to AHBHCLK/PCLKDataDataAddrAddrHADDRHWRITEHRDATAHREADYPADDRPWRITEPSELPRDATA8990APB到AHB的接口讀9091APB到AHB的接口寫9192Back to Back Transfers9293內(nèi)容 Cortex-M3 匯編
41、指令集 AMBA總線AHB & APB 流水線技術(shù) 異常和中斷 與ARM7的比較流水線(Pipeline)簡(jiǎn)介l 流水線縮短了在一個(gè)時(shí)鐘周期內(nèi)給的那個(gè)信號(hào)必須通過(guò)的通路長(zhǎng)度,從而可以提高時(shí)鐘頻率。例如:一個(gè)2級(jí)組合邏輯假定每級(jí)延遲相同為Tpd,無(wú)流水線的總 延遲就是2Tpd,可以在一個(gè)時(shí)鐘周期完成,但是時(shí)鐘周期受限制在2Tpd,如果使用流水線,每一級(jí)加入寄存器(延遲為Tco)后,單級(jí)的延遲為Tpd+ Tco,每級(jí)消耗一個(gè)時(shí)鐘周期,流水線需要2個(gè)時(shí)鐘周期來(lái)獲得第一個(gè)計(jì)算結(jié)果,稱為首次延遲,它要2*(Tpd+Tco),但是執(zhí)行重復(fù)操作時(shí),只要一個(gè) 時(shí)鐘周期來(lái)獲得最后的計(jì)算結(jié)果,稱為吞吐延遲
42、(Tpd+Tco)可見(jiàn)只要Tco小于Tpd,流水線可以提高速度。94流水線在CPU設(shè)計(jì)中的應(yīng)用l 對(duì)于一條具體的指令執(zhí)行過(guò)程,通??梢苑譃槲鍌€(gè)部分:取指令,指令譯碼,取操作數(shù),運(yùn)算(ALU),寫結(jié)果。其中前三步一般由指令控制器完成, 后兩步則由運(yùn)算器完成。按照傳統(tǒng)的方式,所有指令順序執(zhí)行,那么先是指令控制器工作,完成第一條指令的前三步,然后運(yùn)算器工作,完成后兩步,在指令控制器 工作,完成第二條指令的前三步,在是運(yùn)算器,完成第二條指令的后兩部很明顯,當(dāng)指令控制器工作是運(yùn)算器基本上在休息,而當(dāng)運(yùn)算器在工作時(shí)指令控制器卻 在休息,造成了相當(dāng)大的資源浪費(fèi)。解決方法很容易想到,當(dāng)指令控制器完成了第一條指
43、令的前三步后,直接開(kāi)始第二條指令的操作,運(yùn)算單元也是。這樣就形成了 流水線系統(tǒng),這是一條2級(jí)流水線。如果是一個(gè)超標(biāo)量系統(tǒng),假設(shè)有三個(gè)指令控制單元和兩個(gè)運(yùn)算單元,那么就可以在完成了第一條指令的取址工作后直接開(kāi)始第二條指令的取址,這時(shí)第一條指令在進(jìn)行譯碼,然后第三條指令取址,第二條指令譯碼,第一條指令取操作數(shù)這樣就是一個(gè)5級(jí)流水線。95流水線在CPU設(shè)計(jì)中的問(wèn)題l 流水線系統(tǒng)最大限度地利用了CPU資源,使每個(gè)部件在每個(gè)時(shí)鐘周期都工作,大大提高了效率。但是,流水線有兩個(gè)非常大的問(wèn)題:相關(guān)和轉(zhuǎn)移。l 越是長(zhǎng)的流水線,相關(guān)和轉(zhuǎn)移兩大問(wèn)題也越嚴(yán)重,所以,流水線并不是越長(zhǎng)越好,超標(biāo)量也不是越多越好,找到一個(gè)
44、速度與效率的平衡點(diǎn)才是最重要的。96相關(guān)l 在一個(gè)流水線系統(tǒng)中,如果第二條指令需要用到第一條指令的結(jié)果,這種情況叫做相關(guān)。以上面哪個(gè)5級(jí)流水線為例,當(dāng)?shù)诙l指令需要取操作數(shù)時(shí),第一條指令 的運(yùn)算還沒(méi)有完成,如果這時(shí)第二條指令就去取操作數(shù),就會(huì)得到錯(cuò)誤的結(jié)果。所以,這時(shí)整條流水線不得不停頓下來(lái),等待第一條指令的完成。這是很討厭的問(wèn) 題,特別是對(duì)于比較長(zhǎng)的流水線,比如20級(jí),這種停頓通常要損失十幾個(gè)時(shí)鐘周期。目前解決這個(gè)問(wèn)題的方法是亂序執(zhí)行。亂序執(zhí)行的原理是在兩條相關(guān)指令中插 入不相關(guān)的指令,使整條流水線順暢。比如上面的例子中,開(kāi)始執(zhí)行第一條指令后直接開(kāi)始執(zhí)行第三條指令(假設(shè)第三條指令不相關(guān)),然
45、后才開(kāi)始執(zhí)行第二條指 令,這樣當(dāng)?shù)诙l指令需要取操作數(shù)時(shí)第一條指令剛好完成,而且第三條指令也快要完成了,整條流水線不會(huì)停頓。當(dāng)然,流水線的阻塞現(xiàn)象還是不能完全避免的, 尤其是當(dāng)相關(guān)指令非常多的時(shí)候。97轉(zhuǎn)移l另一個(gè)大問(wèn)題是條件轉(zhuǎn)移。在上面的例子中,如果第一條指令是一個(gè)條件轉(zhuǎn)移指令,那么系統(tǒng)就會(huì)不清楚下面應(yīng)該執(zhí)行那一條指令?這時(shí)就必須等第一條指令的判斷結(jié)果出來(lái)才能執(zhí)行第二條指令。條件轉(zhuǎn)移所造成的流水線停頓甚至比相關(guān)還要嚴(yán)重的多。所以,現(xiàn)在采用分支預(yù)測(cè)技術(shù)來(lái)處理轉(zhuǎn)移問(wèn)題。雖然我們的程序中充滿著分支,而且哪一條分支都是有可能的,但大多數(shù)情況下總是選擇某一分支。比如一個(gè)循環(huán)的末尾是一個(gè)分支,除了最后一
46、次我們需要跳出循環(huán)外,其他的時(shí)候我們總是選擇繼續(xù)循環(huán)這條分支。根據(jù)這些原理,分支預(yù)測(cè)技術(shù)可以在沒(méi)有得到結(jié)果之前預(yù)測(cè)下一條指令是什么,并執(zhí)行它。 現(xiàn)在的分支預(yù)測(cè)技術(shù)能夠達(dá)到90%以上的正確率,但是,一旦預(yù)測(cè)錯(cuò)誤,CPU仍然不得不清理整條流水線并回到分支點(diǎn)。這將損失大量的時(shí)鐘周期。所以,進(jìn)一步提高分支預(yù)測(cè)的準(zhǔn)確率也是正在研究的一個(gè)課題。98ARM7三級(jí)流水線技術(shù)l ARM7系列處理器中每條指令分取指、譯碼、執(zhí)行三個(gè)階段,分別在不同的功能部件上依次獨(dú)立完成。取指部件完成從存儲(chǔ)器裝載一條指令,通過(guò)譯碼部件產(chǎn)生下一周期數(shù)據(jù)路徑需要的控制信號(hào),完成寄存器的解碼,再送到執(zhí)行單元完成寄存器的讀取、ALU運(yùn)算及
47、運(yùn)算結(jié)果的寫回,需要訪問(wèn)存儲(chǔ)器的指令完成存儲(chǔ)器的訪問(wèn)。流水線上雖然一條指令仍需3個(gè)時(shí)鐘周期來(lái)完成,但通過(guò)多個(gè)部件并行,使得處理器的吞吐率約為每個(gè)周期一條指令,提高了流式指令的處理速度,從而可達(dá)到0.9 MIPSMHz的指令執(zhí)行速度。99三級(jí)流水線運(yùn)行情況分析100三級(jí)流水線運(yùn)行情況分析101三級(jí)流水線運(yùn)行情況分析102三級(jí)流水線運(yùn)行情況分析103ARM9五級(jí)流水線技術(shù)l ARM9系列處理器的流水線分為取指、譯碼、執(zhí)行、訪存、回寫。取指部件完成從指令存儲(chǔ)器取指;譯碼部件讀取寄存器操作數(shù),與三級(jí)流水線中不占有數(shù)據(jù)路徑區(qū)別很大;執(zhí)行部件產(chǎn)生ALU運(yùn)算結(jié)果或產(chǎn)生存儲(chǔ)器地址(對(duì)于存儲(chǔ)器訪問(wèn)指令來(lái)講);訪
48、存部件訪問(wèn)數(shù)據(jù)存儲(chǔ)器;回寫部件完成執(zhí)行結(jié)果寫回寄存器。把三級(jí)流水線中的執(zhí)行單元進(jìn)一步細(xì)化,減少了在每個(gè)時(shí)鐘周期內(nèi)必須完成的工作量,進(jìn)而允許使用較高的時(shí)鐘頻率,且具有分開(kāi)的指令和數(shù)據(jù)存儲(chǔ)器,減少了沖突的發(fā)生,每條指令的平均周期數(shù)明顯減少。104五級(jí)流水線運(yùn)行情況分析105五級(jí)流水線運(yùn)行情況分析106五級(jí)流水線優(yōu)化l要實(shí)現(xiàn)把內(nèi)存地址0 x1000和0 x2000處的數(shù)據(jù)分別拷貝到0 x8000和0 x9000處。0 x1000處的內(nèi)容:1,2,3,4,5,6,7,8,9,100 x2000處的內(nèi)容:H,e,l,l,o,W,o,r,l,d107全部拷貝過(guò)程由兩個(gè)結(jié)構(gòu)相同的循環(huán)各自獨(dú)立完成,分別實(shí)現(xiàn)兩
49、塊數(shù)據(jù)的拷貝,并且兩個(gè)拷貝過(guò)程極為類似,分析其中一個(gè)即可。T1T3是3個(gè)單獨(dú)的時(shí)鐘周期;T4T11是一個(gè)循環(huán),在時(shí)空?qǐng)D中描述了第一次循環(huán)的執(zhí)行情況。在T12的時(shí)候?qū)慙R的同時(shí),開(kāi)始對(duì)循環(huán)的第一條語(yǔ)句進(jìn)行取指,所以總的流水線周期數(shù)為3+1010+29=121。整個(gè)拷貝過(guò)程需要1212+2=244個(gè)時(shí)鐘周期完成。五級(jí)流水線優(yōu)化(續(xù))l 考慮到通過(guò)減少流水線的沖突可以提高流水線的執(zhí)行效率,而流水線的沖突主要來(lái)自寄存器沖突和分支指令,因此對(duì)代碼作如下兩方面調(diào)整:將兩個(gè)循環(huán)合并成一個(gè)循環(huán)能夠充分減少循環(huán)跳轉(zhuǎn)的次數(shù),減少跳轉(zhuǎn)帶來(lái)的流水線停滯;調(diào)整代碼的順序,將帶有與臨近指令不相關(guān)的寄存器插到帶有相關(guān)寄存器
50、的指令之間,能夠充分地避免寄存器沖突導(dǎo)致的流水線阻塞。108調(diào)整之后,T1T5是5個(gè)單獨(dú)的時(shí)鐘周期,T6T13是一個(gè)循環(huán),同樣在T14的時(shí)候BNE指令在寫LR的同時(shí),循環(huán)的第一條指令開(kāi)始取指,所以總的指令周期數(shù)為5+1010+29+2=125。五級(jí)流水線優(yōu)化(續(xù))l 通過(guò)兩段代碼的比較可看出:調(diào)整之前整個(gè)拷貝過(guò)程總共使用了244個(gè)時(shí)鐘周期,調(diào)整了循環(huán)內(nèi)指令的順序后,總共使用了125個(gè)時(shí)鐘周期就完成了同樣的工作,時(shí)鐘周期減少了119個(gè),縮短了119244=488,效率提升十分明顯。l 因此流水線的優(yōu)化問(wèn)題主要應(yīng)從兩方面考慮:通過(guò)合并循環(huán)等方式減少分支指令的個(gè)數(shù),從而減少流水線的浪費(fèi);通過(guò)交換指令
51、的順序,避免寄存器沖突造成流水線停滯。109CM3流水線l Cortex-M3處理器使用一個(gè)3級(jí)流水線。流水線的3個(gè)級(jí)分別是:取指,解碼和執(zhí)行。l 當(dāng)運(yùn)行的指令大多數(shù)都是16位時(shí),你會(huì)發(fā)現(xiàn)處理器會(huì)每隔一個(gè)周期做一次取指。這是因?yàn)镃M3有時(shí)可以一次取出兩條指令來(lái)(一次能取32位),因此在第一條16位指令取來(lái)時(shí),也順帶著把第二條16位指令取來(lái)了。此時(shí)總線接口就可以先歇一個(gè)周期再取指?;蛘呷绻彌_區(qū)是滿的,總線接口干脆就空閑下來(lái)了。有些指令的執(zhí)行需要多個(gè)周期,在這期間流水線就會(huì)暫停。l 當(dāng)執(zhí)行到跳轉(zhuǎn)指令時(shí),需要清洗流水線,處理器會(huì)不得不從跳轉(zhuǎn)目的地重新取指。為了改善這種情況,CM3支持一定數(shù)量的AR
52、Mv7M新指令,可以避免很多微型跳轉(zhuǎn),如第4章講到的IF-THEN語(yǔ)句塊。由于流水線的存在,以及出于對(duì)Thumb代碼兼容的考慮,讀取PC時(shí),會(huì)返回當(dāng)前指令地址+4的值。這個(gè)偏移量總是4,不管是執(zhí)行16位指令還是32位指令,這就保了在Thumb和Thumb2之間的一致性。110CM3流水線(續(xù))l 在處理器內(nèi)核的預(yù)取單元中也有一個(gè)指令緩沖區(qū),它允許后續(xù)的指令在執(zhí)行前先在里面排隊(duì),也能在執(zhí)行未對(duì)齊的32位指令時(shí),避免流水線“斷流”。不過(guò)該緩沖區(qū)并不會(huì)在流水線中添加額外的級(jí)數(shù),因此不會(huì)使跳轉(zhuǎn)導(dǎo)致的性能下降(penalty)更加惡化。111112內(nèi)容 Cortex-M3 匯編指令集 AMBA總線AHB
53、 & APB 流水線技術(shù) 異常和中斷 與ARM7的比較異常類型113編號(hào)編號(hào)類型類型優(yōu)先級(jí)優(yōu)先級(jí)描述描述0 0- - -復(fù)位復(fù)位時(shí)載入向量表的第一項(xiàng)作為主堆棧棧頂?shù)刂?。時(shí)載入向量表的第一項(xiàng)作為主堆棧棧頂?shù)刂贰? 1復(fù)位復(fù)位-3-3復(fù)位復(fù)位。2 2NMINMI-2-2不可不可屏蔽中斷(來(lái)自外部屏蔽中斷(來(lái)自外部NMI輸入腳)。輸入腳)。3 3硬故障硬故障- -1 1當(dāng)當(dāng)故障由于優(yōu)先級(jí)或者是可配置的故障處理程序被禁止的原因而故障由于優(yōu)先級(jí)或者是可配置的故障處理程序被禁止的原因而無(wú)法激活時(shí),所有類型故障都會(huì)以硬故障的方式激活。無(wú)法激活時(shí),所有類型故障都會(huì)以硬故障的方式激活。4 4存儲(chǔ)器管理存
54、儲(chǔ)器管理可編程可編程MPUMPU不匹配,包括訪問(wèn)沖突和不匹配。不匹配,包括訪問(wèn)沖突和不匹配。5 5總線故障總線故障可編程可編程預(yù)預(yù)取指故障、存儲(chǔ)器訪問(wèn)故障和其它地址取指故障、存儲(chǔ)器訪問(wèn)故障和其它地址/存儲(chǔ)器相關(guān)的故障。存儲(chǔ)器相關(guān)的故障。6 6用法故障用法故障可編程可編程由于由于程序錯(cuò)誤導(dǎo)致的異常,通常是使用一條無(wú)效指令,或都是非程序錯(cuò)誤導(dǎo)致的異常,通常是使用一條無(wú)效指令,或都是非法的狀態(tài)轉(zhuǎn)換。法的狀態(tài)轉(zhuǎn)換。7-107-10保留保留- -1111SVCallSVCall可編程可編程執(zhí)行執(zhí)行SVC指令的系統(tǒng)服務(wù)調(diào)用。指令的系統(tǒng)服務(wù)調(diào)用。1212調(diào)試監(jiān)視器調(diào)試監(jiān)視器可編程可編程調(diào)試調(diào)試監(jiān)視器(斷點(diǎn),
55、數(shù)據(jù)觀察點(diǎn),或是外部調(diào)試請(qǐng)求)監(jiān)視器(斷點(diǎn),數(shù)據(jù)觀察點(diǎn),或是外部調(diào)試請(qǐng)求)1313保留保留- -1414PendSVPendSV可編程可編程系統(tǒng)系統(tǒng)服務(wù)的可觸發(fā)(服務(wù)的可觸發(fā)(pendable)請(qǐng)求。)請(qǐng)求。1515SysTickSysTick可編程可編程系統(tǒng)系統(tǒng)節(jié)拍定時(shí)器。節(jié)拍定時(shí)器。中斷類型編號(hào)編號(hào)類型類型優(yōu)先級(jí)優(yōu)先級(jí)描述描述1616IRQ IRQ #0#0可編程可編程外設(shè)外設(shè)中斷中斷 #01717IRQ IRQ #1#1可編程可編程外設(shè)外設(shè)中斷中斷 #1255255IRQ IRQ #239#239可編程可編程外設(shè)外設(shè)中斷中斷 #239114優(yōu)先級(jí)的定義l CM3的優(yōu)先級(jí)配置寄存器允許的最
56、少使用位數(shù)為3個(gè)位,亦即至少要支持8級(jí)優(yōu)先級(jí)l 在圖中,4:0沒(méi)有被實(shí)現(xiàn),所以讀它們總是返回零,寫它們則忽略寫入的值。因此,對(duì)于3個(gè)位的情況,我們能夠使用的8個(gè)優(yōu)先級(jí)為:0 x00(最高),0 x20,0 x40,0 x60,0 x80,0 xA0,0 xC0以及0 xE0。115搶占優(yōu)先級(jí)與子優(yōu)先級(jí)l 為了使搶占機(jī)能變得更可控,CM3還把256級(jí)優(yōu)先級(jí)按位分成高低兩段,分別稱為搶占優(yōu)先級(jí)和子優(yōu)先級(jí),如下所述。NVIC中有一個(gè)寄存器是“應(yīng)用程序中斷及復(fù)位控制寄存器”,它里面有一個(gè)位段名為“優(yōu)先級(jí)組”。該位段的值對(duì)每一個(gè)優(yōu)先級(jí)可配置的異常都有影響把其優(yōu)先級(jí)分為2個(gè)位段:MSB所在的位段(左邊的)
57、對(duì)應(yīng)搶占優(yōu)先級(jí),而LSB所在的位段(右邊的)對(duì)應(yīng)子優(yōu)先級(jí)。l 舉個(gè)例子,如果只使用3個(gè)位來(lái)表達(dá)優(yōu)先級(jí)(7:5),并且優(yōu)先級(jí)組的值是5(從比特5處分組),則得到4級(jí)搶占優(yōu)先級(jí),且在每個(gè)搶占優(yōu)先級(jí)的內(nèi)部有2個(gè)子優(yōu)先級(jí)116向量表l 當(dāng)發(fā)生了異常并且要響應(yīng)它時(shí),CM3需要定位其服務(wù)例程的入口地址。這些入口地址存儲(chǔ)在所謂的“(異常)向量表”中。缺省情況下,CM3認(rèn)為該表位于零地址處,且各向量占用4字節(jié)。因此每個(gè)表項(xiàng)占用4字節(jié)。117向量表(續(xù))l 因?yàn)榈刂?處應(yīng)該存儲(chǔ)引導(dǎo)代碼,所以它通常映射到Flash或者是ROM器件,并且它們的值不得在運(yùn)行時(shí)改變。然而,為了支持動(dòng)態(tài)重分發(fā)中斷,CM3允許向量表重定位
58、從其它地址處開(kāi)始定位各異常向量。這些地址對(duì)應(yīng)的區(qū)域可以是代碼區(qū),但更多是在RAM區(qū)。在RAM區(qū)就可以修改向量的入口地址了。為了實(shí)現(xiàn)這個(gè)功能,NVIC中有一個(gè)寄存器,稱為“向量表偏移量寄存器”(在地址0 xE000_ED08處),通過(guò)修改它的值就能重定位向量表。l 如果需要?jiǎng)討B(tài)地更改向量表,則對(duì)于任何器件來(lái)說(shuō),向量表的起始處都必須包含以下向量:u 主堆棧指針(MSP)的初始值u 復(fù)位向量u NMIu 硬fault服務(wù)例程 后兩者也是必需的,因?yàn)橛锌赡茉谝龑?dǎo)過(guò)程中發(fā)生這兩種異常??梢栽赟RA中開(kāi)出一塊空間用于存儲(chǔ)向量表。在引導(dǎo)期間先填寫好各向量,然后在引導(dǎo)完成后,就可以啟用內(nèi)存中的新向量表,從而實(shí)
59、現(xiàn)向量可動(dòng)態(tài)調(diào)整的能力。118中斷輸入及懸起行為119l當(dāng)中斷輸入腳被assert后,該中斷就被懸起。即使后來(lái)中斷源撤消了中斷請(qǐng)求,已經(jīng)被標(biāo)記成懸起的中斷也被記錄下來(lái)。到了系統(tǒng)中它的優(yōu)先級(jí)最高的時(shí)候,就會(huì)得到響應(yīng)。但是,如果在某個(gè)中斷得到響應(yīng)之前,其懸起狀態(tài)被清除了(例如,在PRIMASK或FAULTMASK置位的時(shí)候軟件清除了懸起狀態(tài)標(biāo)志),則中斷被取消,中斷輸入及懸起行為120中斷輸入及懸起行為121中斷輸入及懸起行為(續(xù))l 當(dāng)某中斷的服務(wù)例程開(kāi)始執(zhí)行時(shí),就稱此中斷進(jìn)入了“活躍”狀態(tài),并且其懸起位會(huì)被硬件自動(dòng)清除,在一個(gè)中斷活躍后,直到其服務(wù)例程執(zhí)行完畢,并且返回后,才能對(duì)該中斷的新請(qǐng)求
60、予以響應(yīng)。當(dāng)然,新請(qǐng)求在得到響應(yīng)時(shí),亦是由硬件自動(dòng)清零其懸起標(biāo)志位。中斷服務(wù)例程也可以在執(zhí)行過(guò)程中把自己對(duì)應(yīng)的中斷重新懸起(使用時(shí)要注意避免進(jìn)入“死循環(huán)”)。122中斷輸入及懸起行為(續(xù))123中斷輸入及懸起行為(續(xù))124中斷輸入及懸起行為(續(xù))125中斷輸入及懸起行為(續(xù))126中斷異常的響應(yīng)序列l(wèi) 當(dāng)CM3開(kāi)始響應(yīng)一個(gè)中斷時(shí),會(huì)在它小小的體內(nèi)奔涌起三股暗流:u入棧: 把8個(gè)寄存器的值壓入棧u取向量:從向量表中找出對(duì)應(yīng)的服務(wù)程序入口地址u選擇堆棧指針MSP/PSP,更新堆棧指針SP,更新連接寄存器LR,更新程序計(jì)數(shù)器PC127中斷異常的響應(yīng)序列(續(xù))128入棧l 響應(yīng)異常的第一個(gè)行動(dòng),就是自動(dòng)保存現(xiàn)場(chǎng)的必要部分:依次把xPSR, P
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代商業(yè)辦公空間的照明藝術(shù)
- 現(xiàn)代辦公設(shè)備與技術(shù)概覽
- 殘障者康復(fù)教育與社區(qū)資源的聯(lián)動(dòng)發(fā)展
- Module3 Unit1 What are they doing?(說(shuō)課稿)-2024-2025學(xué)年外研版(三起)英語(yǔ)四年級(jí)上冊(cè)
- 7 我是班級(jí)值日生(說(shuō)課稿)-2024-2025學(xué)年統(tǒng)編版道德與法治二年級(jí)上冊(cè)
- Unit 3 Its a colourful world!Part B Let's learn(說(shuō)課稿)-2024-2025學(xué)年外研版(三起)(2024)英語(yǔ)三年級(jí)上冊(cè)
- 2023六年級(jí)數(shù)學(xué)上冊(cè) 二 分?jǐn)?shù)乘法第3課時(shí) 分?jǐn)?shù)與整數(shù)相乘說(shuō)課稿 蘇教版
- 5《這些事我來(lái)做》(說(shuō)課稿)-部編版道德與法治四年級(jí)上冊(cè)
- Unit5 My clothes Part A Lets talk (說(shuō)課稿)-2023-2024學(xué)年人教PEP版英語(yǔ)四年級(jí)下冊(cè)001
- 《1 有余數(shù)的除法-第二課時(shí)》(說(shuō)課稿)-2023-2024學(xué)年二年級(jí)下冊(cè)數(shù)學(xué)蘇教版001
- 執(zhí)行總經(jīng)理崗位職責(zé)
- NS3000計(jì)算機(jī)監(jiān)控系統(tǒng)使用手冊(cè)
- 《妊娠期惡心嘔吐及妊娠劇吐管理指南(2024年)》解讀
- 《黑神話:悟空》跨文化傳播策略與路徑研究
- 《古希臘文明》課件
- 居家養(yǎng)老上門服務(wù)投標(biāo)文件
- 長(zhǎng)沙市公安局交通警察支隊(duì)招聘普通雇員筆試真題2023
- 2025年高考語(yǔ)文作文滿分范文6篇
- 零售業(yè)連鎖加盟合同
- 2025高考語(yǔ)文復(fù)習(xí)之60篇古詩(shī)文原文+翻譯+賞析+情景默寫
- 成長(zhǎng)型思維課件
評(píng)論
0/150
提交評(píng)論