EFM32 Cortex參考手冊_第1頁
EFM32 Cortex參考手冊_第2頁
EFM32 Cortex參考手冊_第3頁
EFM32 Cortex參考手冊_第4頁
EFM32 Cortex參考手冊_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、EFM32 Cortex-M3參考手冊1. 簡介1.1 關(guān)于此文檔本文檔提供了使用EFM32微處理器ARM Cortex-M3內(nèi)核所需的信息。EFM32設(shè)備內(nèi)的具體實(shí)現(xiàn)細(xì)節(jié)可以參考手冊和特定的設(shè)備數(shù)據(jù)表。此文檔適應(yīng)于單片機(jī)軟件和硬件工程師,包括對ARM設(shè)備沒有相關(guān)經(jīng)驗(yàn)的人員。1.2 關(guān)于EFM32 Cortex-M3處理器和核心外圍設(shè)備EFM32 Cortex-M3處理器是一個(gè)高性能的32位處理器,是為微處理器市場而設(shè)計(jì)的。它為開發(fā)人員提供了顯著便利,包括:l 優(yōu)秀的處理性能和快速中斷處理l 加強(qiáng)型系統(tǒng)與靈活的斷點(diǎn)調(diào)試和跟蹤能力l 高效的處理器內(nèi)核,系統(tǒng)和存儲l 超低功耗集成的睡眠模式l 平臺

2、安全和存儲保護(hù)單元(僅部分設(shè)備可用)。Cortex-M3處理器是建立在一個(gè)高性能的處理器內(nèi)核,三級管道哈佛架構(gòu),使它成為嵌入式應(yīng)用程序的理想選擇。處理器通過一個(gè)高效的指令集提供特殊工作效率,廣泛的優(yōu)化設(shè)計(jì),提供高端處理硬件包括單循環(huán)32 x32乘法和專用硬件門。為了便于低成開發(fā)本產(chǎn)品,Cortex-M3處理器采用緊耦合組件系統(tǒng),降低處理器復(fù)雜度,同時(shí)顯著改善中斷處理和系統(tǒng)調(diào)試的能力。Cortex-M3處理器采用一個(gè)版本Thumb指令集,確保高密度代碼,減少程序需求內(nèi)存。Cortex-M3指令集提供了一個(gè)新型32位架構(gòu),擁有良好性能。是高密度代碼的8位/16位微處理器。Cortex-M3處理器集

3、成了一個(gè)可配置的嵌套中斷控制器,提供行業(yè)領(lǐng)先的中斷性能。NVIC包括屏敝中斷,并提供多達(dá)8個(gè)中斷優(yōu)先級級別。處理器核心集成度高,NVIC提供快速執(zhí)行中斷服務(wù)程序,極大地減少了中斷延遲。這是通過寄存器的硬疊加實(shí)現(xiàn)的。擁有多重裝載和存儲多重操作能力。中斷處理程序不需要任何匯編存根,以消除任何代碼的ISR上的開銷。Tail-chaining優(yōu)化也顯著減少了從一個(gè)ISR切換到另一個(gè)ISR上的開銷。降低功耗優(yōu)化設(shè)計(jì),NVIC集成與睡眠模式,包括深度睡眠功能,能使整個(gè)裝置迅速關(guān)機(jī)。1.2.1 系統(tǒng)級接口Cortex-M3處理器采用AMBA技術(shù)提供了多個(gè)高速接口,訪問內(nèi)存時(shí)延降低。它支持非對齊數(shù)據(jù)訪問和原子

4、位操作,實(shí)現(xiàn)加快外圍控制,系統(tǒng)自旋鎖和線程安全的布爾數(shù)據(jù)處理。某些EFM32設(shè)備的Cortex-M3處理器含有一個(gè)內(nèi)存保護(hù)單元,它提供更好的內(nèi)存控制,使應(yīng)用程序能夠?qū)崿F(xiàn)安全特權(quán)級別,將逐個(gè)任務(wù)處理中的代碼、數(shù)據(jù)和堆棧分離。這樣的需求在許多嵌入式應(yīng)用程序,如自動化領(lǐng)域成為關(guān)鍵。只有在某些EFM32設(shè)備具備內(nèi)存保護(hù)單元。1.2.2 集成配置調(diào)試Cortex-M3處理器實(shí)現(xiàn)了一個(gè)完整的硬件調(diào)試解決方案。通過2號引腳的串行線調(diào)試端口,提供了處理器和內(nèi)存的高系統(tǒng)可見性,是微處理器和其他小封裝設(shè)備的理想選擇。為了跟蹤系統(tǒng)處理器集成,設(shè)計(jì)了一個(gè)數(shù)據(jù)監(jiān)測點(diǎn)和一個(gè)分析單位??紤]到簡化系統(tǒng)和整個(gè)系統(tǒng)分析的性價(jià)比,

5、串線查看器可以導(dǎo)出軟件生成的消息流,數(shù)據(jù)跟蹤,通過單個(gè)引腳分析信息。嵌入式跟蹤宏單元提供無與倫比的指令跟蹤,捕獲范圍遠(yuǎn)遠(yuǎn)小于傳統(tǒng)跟蹤單元。只有在某些EFM32設(shè)備具備ETM單元。1.2.3 Cortex-M3處理器特點(diǎn)和優(yōu)點(diǎn)匯總l 緊密集成的系統(tǒng)外圍設(shè)備減少體積和開發(fā)成本l Thumb指令集結(jié)合高密度代碼和32位性能l ROM系統(tǒng)code-patch更新能力l 系統(tǒng)組件電源控制優(yōu)化l 集成的低功耗睡眠模式l 快速執(zhí)行代碼能降低處理器時(shí)鐘或增加睡眠模式時(shí)間l 硬件部門和快速的運(yùn)算l 對于時(shí)間要求嚴(yán)格的應(yīng)用程序,中斷處理性能高l 對安全性要求苛刻的應(yīng)用程序有內(nèi)存保護(hù)單元。(只有在某些設(shè)備)l 擴(kuò)展

6、調(diào)試和跟蹤功能:串行線調(diào)試和串行線跟蹤需要的引腳減少1.2.4 Cortex-M3核心外圍設(shè)備嵌套矢量中斷控制器:矢量中斷控制器是嵌入式中斷控制器,它支持低延時(shí)中斷處理。系統(tǒng)控制塊:系統(tǒng)控制塊是處理器的程序員模型接口。它提供了系統(tǒng)實(shí)現(xiàn)信息和系統(tǒng)控制,包括配置、控制和報(bào)告系統(tǒng)異常。系統(tǒng)計(jì)時(shí)器:系統(tǒng)定時(shí)器,SysTick是24位倒計(jì)時(shí)計(jì)時(shí)器。用作實(shí)時(shí)操作系統(tǒng)ticl定時(shí)器或作為一個(gè)簡單的計(jì)數(shù)器。內(nèi)存保護(hù)單元:內(nèi)存保護(hù)單元,通過定義不同內(nèi)存區(qū)域的內(nèi)存屬性提高系統(tǒng)可靠性。它提供了多達(dá)8個(gè)不同區(qū)域和預(yù)定義的備選區(qū)域。僅在某些EFM32設(shè)備有內(nèi)存保護(hù)單元。1.2.5 EFM32 Cortex-M3配置不同

7、的EFM32系列的ARM Cortex-M3外圍設(shè)備包含不同的子集。表1.1顯示了不同EFM32系列中包括哪些特性。2. Cortex-M3處理器2.1 程序員模型2.1.1 處理器軟件執(zhí)行模式和特權(quán)級別線程模式:用于執(zhí)行應(yīng)用軟件。處理器復(fù)位后進(jìn)入線程模式。處理程序模式:用于處理異常。處理器完成異常處理后返回線程模式。在線程模式下,當(dāng)軟件處于特權(quán)或非特權(quán)模式是,控制寄存器工作。在處理程序模式下,軟件總是按特權(quán)模式執(zhí)行。只有特權(quán)軟件可以寫控制寄存器以修改執(zhí)行線程模式權(quán)限級別。非特權(quán)的軟件可以使用SVC指令請求將控制權(quán)轉(zhuǎn)移至特權(quán)軟件。2.1.2 堆棧處理器使用一個(gè)完整小端堆棧。這意味著堆棧指針指示

8、最后存放在內(nèi)存數(shù)據(jù)的地址。當(dāng)處理器將新的數(shù)據(jù)壓入堆棧,修改堆棧指針,然后寫入新的內(nèi)存地址。處理器實(shí)現(xiàn)了兩個(gè)堆棧,主堆棧和處理堆棧。詳見2.1.3.2節(jié)。在線程模式下,控制寄存器控制處理器使用主堆棧還是使用處理堆棧。詳見2.1.3.7節(jié)。在處理程序模式下,處理器總是使用主要的堆棧。處理器操作的選項(xiàng)如下:2.1.3 核心寄存器2.1.3.1 通用寄存器R0-R12是32位用于數(shù)據(jù)操作通用寄存器。2.1.3.2 堆棧指針R13是堆棧指針寄存器。線程模式下,控制寄存器指示堆棧指針的第一比特位用作:l 0 主要堆棧指針,這是重置值。l 1 進(jìn)程堆棧指針復(fù)位后,處理器從地址0 x00000000處載入MS

9、P的值。2.1.3.3 鏈接寄存器R14用作鏈接寄存器。它存儲子程序的返回信息,函數(shù)調(diào)用和異常處理。在復(fù)位時(shí),處理器從0 xFFFFFFFF地址處載入LR的值。2.1.3.4 程序計(jì)數(shù)器R15用作程序計(jì)數(shù)器。它包含當(dāng)前程序的地址。Bit0的值總是0,因?yàn)橹噶畹刂繁仨毎胱謱R。復(fù)位時(shí),處理器從地址0 x00000004處載入PC的復(fù)位向量。2.1.3.5 程序狀態(tài)寄存器程序狀態(tài)寄存器包括:l 應(yīng)用程序狀態(tài)寄存器l 中斷程序狀態(tài)寄存器l 執(zhí)行程序狀態(tài)寄存器2.1.3.5.1 應(yīng)用程序狀態(tài)寄存器APSR包含上一條指令執(zhí)行后,當(dāng)前狀態(tài)條件標(biāo)志。它的屬性詳見寄存器匯總表2.2。這些位代表著:2.1.3.

10、5.2 中斷程序狀態(tài)寄存器IPSR包含當(dāng)前中斷服務(wù)例程的異常類型。其屬性詳見寄存器匯總在表2.2。其比特位分配如下:2.1.3.5.3 執(zhí)行程序狀態(tài)寄存器EPSR包含Thumb狀態(tài)位,每個(gè)的執(zhí)行狀態(tài)位為:l if - then指令l 多重中斷或多重存儲指令的可持續(xù)中斷指令2.1.3.5.4 可持續(xù)中斷指令當(dāng)執(zhí)行LDM或STM指令時(shí)發(fā)生中斷,處理器做出如下動作:l 停止加載多個(gè)指令操作或暫時(shí)存儲多個(gè)指令操作l 將下一個(gè)寄存器的操作數(shù)存到EPSR15:12位中斷服務(wù)完成后,處理器做出如下動作:l 返回到寄存器15:12位指出的位置l 重新多個(gè)指令或存儲指令的執(zhí)行當(dāng)EPSR保存ICI執(zhí)行狀態(tài),bit

11、s26:25.11:10值為零。2.1.3.5.5 if-then模塊if-then模塊包括緊跟16位IT指令的四條指令。模塊每條指令有條件執(zhí)行。指令的條件都是一樣的,或者可以從另一些指令轉(zhuǎn)換過來。參看3.9.3獲取更多信息。2.1.3.6 異常標(biāo)志寄存器異常標(biāo)志寄存器禁止處理器處理異常。禁用那些可能會影響時(shí)鐘關(guān)鍵任務(wù)的異常。訪問異常標(biāo)志寄存器的指令是MSR和MRS指令,或用CPS指令改變PRIMASK或FAULTMASK的值。2.1.3.6.1 優(yōu)先級屏蔽寄存器PRIMASK寄存器通過配置優(yōu)先級防止激活所有的異常。2.1.3.6.2 錯(cuò)誤屏蔽寄存器錯(cuò)誤標(biāo)志寄存器防止所有異常被激活,非標(biāo)志中斷

12、除外。2.1.3.6.3 主要優(yōu)先級屏蔽寄存器BASEPRI寄存器定義了異常處理的最低優(yōu)先級。當(dāng)BASEPRI設(shè)置為非零值,它可以防止與BASEPRI相同或更低的優(yōu)先級值的異常被激活。其屬性詳見寄存器匯總表2.2。各位分配如下:2.1.3 控制寄存器控制寄存器控制堆棧的使用以及當(dāng)處理器處于線程模式軟件執(zhí)行的特權(quán)級別。其屬性見寄存器匯總表2.2。各位的分配如下:處理程序模式通常使用MSP,所以在處理器模式下,處理器忽略向控制寄存器明確寫入活動堆棧指針。異常通過進(jìn)入和返回機(jī)制更新控制寄存器。在操作系統(tǒng)環(huán)境下,線程模式下線程運(yùn)行使用處理堆棧,內(nèi)核和異常處理程序使用主堆棧。2.1.4 異常和中斷Cor

13、tex-M3處理器支持中斷和系統(tǒng)異常。處理器和嵌套矢量中斷控制器優(yōu)先考慮并處理所有的異常。一個(gè)異常改變軟件控制的正常流動。處理器使用處理程序模式來處理所有的異常,復(fù)位除外。2.1.5 數(shù)據(jù)類型處理器支持?jǐn)?shù)據(jù)類型如下:l 32位字l 16位半字l 8位字節(jié)l 支持64位數(shù)據(jù)傳輸指令l 管理所有數(shù)據(jù)內(nèi)存訪問,低位優(yōu)先。2.1.6 Cortex微處理器軟件接口標(biāo)準(zhǔn)對于Cortex-M3微處理器系統(tǒng),Cortex微控制器軟件接口標(biāo)準(zhǔn)定義如下:一個(gè)共同的方法:l 訪問外圍寄存器l 定義異常向量名稱如下:l 核心外設(shè)的寄存器l 核心異常向量l RTOS內(nèi)核設(shè)備獨(dú)立的接口,包括一個(gè)調(diào)試頻道。CMSIS包括C

14、ortex-M3處理器核心的外圍設(shè)備的地址和數(shù)據(jù)結(jié)構(gòu)定義。它還包括可選的中間件組件接口,包括一個(gè)TCP/IP堆棧和一個(gè)Flash文件系統(tǒng)。CMSIS通過啟用模板代碼的重用和CMSIS兼容的各種中間件供應(yīng)商軟件組件簡化軟件開發(fā)。軟件供應(yīng)商可以擴(kuò)展CMSIS包括外圍定義和外圍設(shè)備的訪問功能。本文檔包括CMSIS定義的寄存器的名稱,并給出簡短的處理器內(nèi)核和核心外圍設(shè)備CMSIS功能描述。2.2 內(nèi)存模型本節(jié)描述處理器內(nèi)存映射,內(nèi)存訪問的行為和條帶特性。處理器有一個(gè)固定的內(nèi)存映射,提供多達(dá)4GB的可尋址內(nèi)存。內(nèi)存映射如下:2.2.1 內(nèi)存區(qū)域、類型和屬性內(nèi)存映射和微處理器的程序設(shè)計(jì)將內(nèi)存映射到區(qū)域。每

15、個(gè)區(qū)域都有定義的內(nèi)存類型,并且一些區(qū)域有附加的內(nèi)存屬性。內(nèi)存類型和屬性決定訪問區(qū)域的行為。內(nèi)存類型如下:正常:處理器可以安排讀取順序以提高效率或執(zhí)行隨機(jī)讀取。設(shè)備:處理器根據(jù)相關(guān)設(shè)備預(yù)定義訪問順序或強(qiáng)制內(nèi)存順序。強(qiáng)制模式:處理器根據(jù)所有相關(guān)設(shè)備安排訪問順序。永遠(yuǎn)執(zhí)行:這意味著處理器阻止指令訪問。任何試圖從一個(gè)XN區(qū)域取一條指令將導(dǎo)致內(nèi)存管理錯(cuò)誤異常。2.2.2 內(nèi)存訪問的內(nèi)存系統(tǒng)排序?qū)τ趦?nèi)存訪問指令的大多數(shù)內(nèi)存訪問,存儲系統(tǒng)不保證訪問的順序與程序的指令順序完全匹配,這并不影響指令序列的行為。通常,正確的程序執(zhí)行取決于程序中兩次內(nèi)存訪問的順序。在內(nèi)存訪問指令中必須插入一個(gè)內(nèi)存分割指令。詳見2.2

16、.4單元。然而,存儲系統(tǒng)確實(shí)需要保證某些設(shè)備的訪問順序和強(qiáng)制內(nèi)存訪問。對于兩個(gè)內(nèi)存訪問指令A(yù)1和A2,在程序順序中,A發(fā)生在A2之前,內(nèi)存訪問順序如下: 2.2.3 內(nèi)存訪問的行為內(nèi)存映射中,訪問各個(gè)每個(gè)區(qū)域的方法如下:2.2.4 內(nèi)存訪問的軟件排序程序流中的指令順序并不總能保證相應(yīng)的內(nèi)存訪問順序。這是因?yàn)椋簂 處理器可重新定義一些內(nèi)存訪問以提高效率,這并不影響指令序列的行為。l 處理器有多個(gè)總線接口l 內(nèi)存映射中,內(nèi)存或設(shè)備有不同的等待狀態(tài)l 一些內(nèi)存訪問是緩沖或隨機(jī)的2.2.2單元簡要介紹幾個(gè)例子,關(guān)于存儲系統(tǒng)如何保證訪問順序。當(dāng)內(nèi)存訪問的順序很重要時(shí),軟件必須包括內(nèi)存分割指令用來強(qiáng)制訪問

17、順序。處理器提供了以下幾種內(nèi)存分割指令:DMB:數(shù)據(jù)內(nèi)存分割指令確保很好地完成之前的連續(xù)續(xù)內(nèi)存事務(wù)。DSB:數(shù)據(jù)同步分割指令確保很好地完成內(nèi)存事務(wù)后續(xù)的指令執(zhí)行。ISB:指令同步分割確保完成的內(nèi)存事物被后續(xù)指令認(rèn)可的效果。內(nèi)存分割指令的使,例如:MPU編程:l 使用DSB指令確保在上下文切換時(shí)微處理器立即出現(xiàn)的效果。l 使用ISB指令確保微處理器編程區(qū)域新的設(shè)置立即生效的,如果使用分支或調(diào)用訪問微控制器配置代碼,如果微控制器配置使用異常機(jī)制輸入代碼,那么ISB指令不是必需的。l 變量表。如果程序改變變量表中的一個(gè)條目,使用相應(yīng)的異常,就用DMB指令進(jìn)行操作。這將保證異常發(fā)生后,后立即啟用處理器

18、新的異常向量。l 自適應(yīng)代碼。如果一個(gè)程序包含自適應(yīng)代碼,使用ISB指令立即修改的代碼程序。這樣可以確保后續(xù)指令執(zhí)行更新后的程序。l 內(nèi)存映射轉(zhuǎn)換。如果系統(tǒng)包含一個(gè)內(nèi)存映射轉(zhuǎn)換機(jī)制,使用DSB指令切換程序中的內(nèi)存映射。這樣可以確保后續(xù)指令時(shí)執(zhí)行使用更新后的內(nèi)存映射。l 動態(tài)異常優(yōu)先級變化。當(dāng)一個(gè)異常等待或活動時(shí),異常優(yōu)先級發(fā)生改變,使用DSB指令。這樣可以確保DSB指令完成后,更改生效。l 在多主機(jī)系統(tǒng)使用一個(gè)信號量。如果系統(tǒng)包含多個(gè)主控總線,例如,如果系統(tǒng)中已經(jīng)存在一個(gè)處理器,每個(gè)處理器在信號指令完成后必須使用DMB指令,以確保其他總線主控知道內(nèi)存事物的順序執(zhí)行。2.2.5 Bit-band

19、ingbit-band區(qū)域?qū)it-band別名地區(qū)每個(gè)字映射成bit-band地區(qū)的一位。 bit-band區(qū)域占據(jù)內(nèi)存存儲器和外圍地區(qū)最低1MB空間。內(nèi)存映射區(qū)域?qū)蓚€(gè)32MB別名映射到兩1MB bit-band區(qū)域:訪問32MB SRAM別名映射到1MB SRAM bit-band區(qū)域,如表2.12所示下面的公式表明,別名區(qū)域怎樣映射到bit-band區(qū)域:bit_word_offser = (byte_offset x 32) + (bit_number x 4)bit_word_addr = bit_band_base + bit_word_offset其中:l bit_word_o

20、ffser是bit-band內(nèi)存區(qū)域目標(biāo)點(diǎn)的位置。l bit_word_addr是別名映射到目標(biāo)位的字的地址。l bit_band_base是別名區(qū)域的起始地址。l byte_offset是bit-band區(qū)域的字節(jié)數(shù)。l bit_number是比特的位置,目標(biāo)為的0到7。2.2.5.1 直接訪問一個(gè)別名區(qū)域向別名區(qū)域?qū)懭胍粋€(gè)字會更新bit-band區(qū)域的位。寫入字的Bit0的值決定bit-band區(qū)域的的目標(biāo)位。如果寫入字Bit0的值為1,則bit-band值為1,如果寫入字Bit0的值為0,則bit-band值為0。別名區(qū)域字Bit31:1位對于bit-band沒有影響。寫0 x01寫0

21、xff具有相同的效果。寫0 x00寫0 x0e是一樣的。讀別名區(qū)域的一個(gè)字:l 0x00000000表明目標(biāo)位bit-band地區(qū)設(shè)置為0l 0x00000001表明bit-band地區(qū)目標(biāo)位設(shè)置為12.2.5.2 直接訪問一個(gè)bit-band地區(qū)2.2.3單元描述了直接訪問bit-band地區(qū)字節(jié)、半字或字的行為。2.2.6 內(nèi)存字節(jié)順序處理器將內(nèi)存視為從0字節(jié)編號按升序的線性集合。例如,字節(jié)0-3存放第一個(gè)存儲字,字節(jié)4-7存放第二個(gè)存儲字。2.2.6.1單元描述的數(shù)據(jù)都存儲在內(nèi)存中。2.2.6.1 低位優(yōu)先格式EFM32使用小端格式,處理器先存儲字的最低有效字節(jié)的序號最小的字節(jié),最后存放

22、要最高編號的最高字節(jié)。例如:2.2.7 同步原語Cortex-M3指令集包括雙同步原語。提供一個(gè)非阻塞的機(jī)制,可以使一個(gè)線程或進(jìn)程獲得獨(dú)家訪問內(nèi)存。軟件可以使用它們來實(shí)現(xiàn)讀修改內(nèi)存更新序列,或者作為一個(gè)信號量機(jī)制。一對同步原語遵從:Load-Exclusive指令:用于讀取一個(gè)內(nèi)存位置的值,請求獨(dú)占訪問這個(gè)位置。Store-Exclusive指令:用于試圖寫入相同的內(nèi)存位置,返回一個(gè)狀態(tài)位到寄存器。如果該位為:l 0 表明線程或進(jìn)程獲得獨(dú)家訪問內(nèi)存,寫成功l 1 表明線程或進(jìn)程并未獲得獨(dú)占訪問內(nèi)存,沒有寫一對Load-Exclusive和Store-Exclusive指令:l 字指令LDREX

23、和STREXl 半字指令LDREH STREHl 字節(jié)指令LDREXB和STREXB軟件必須使用Load-Exclusive指令和相應(yīng)的Store-Exclusive指令。實(shí)現(xiàn)內(nèi)存位置讀-修改-寫,軟件必須:1.使用Load-Exclusive指令讀取位置的值。2.根據(jù)需要更新值。3.使用一個(gè)Store-Exclusive指令在內(nèi)存位置寫入新的值,并測試返回的狀態(tài)位。如果這個(gè)位是:l 0 讀-修改-寫成功完成l 1 沒有執(zhí)行寫操作。這表明步驟1返回的值可能超時(shí)了。軟件必須重新執(zhí)行讀-修改-寫序列。軟件可以使用同步原語實(shí)現(xiàn)如下信號量:1.使用Load-Exclusive指令從信號讀取地址檢查信號

24、是否空閑。2.如果信號空閑,使用一個(gè)Store-Exclusive指令向信號量的地址寫聲明值。3.如果步驟2返回的狀態(tài)位表明Store-Exclusive指令成功執(zhí)行,軟件就聲明這個(gè)信號量。但是,如果Store-Exclusive指令執(zhí)行失敗,軟件執(zhí)行步驟1后,另一個(gè)進(jìn)程可能已經(jīng)聲稱這個(gè)信號量。cortex-M3包含一個(gè)獨(dú)占訪問監(jiān)控器,表明處理器是否執(zhí)行Load-Exclusive指令。處理器將其獨(dú)占訪問標(biāo)記,如果:l 它執(zhí)行一個(gè)CLREX指令l 它執(zhí)行一個(gè)Store-Exclusive指令,無論是否寫成功l 發(fā)生異常,這意味著處理器可以解決不同線程之間的信號沖突。2.2.8 同步原語的編程提

25、示ANSI C不能直接生成獨(dú)占訪問指令。一些C編譯器可以生成這些指令的內(nèi)部功能:實(shí)際的獨(dú)占訪問指令生成依賴于指針傳遞給內(nèi)部函數(shù)的數(shù)據(jù)類型。例如,下面的C代碼生成需要LDREXB操作:_ldrex(volatile char * ) 0xFF);2.3 異常模型本節(jié)描述異常模式。2.3.1 異常狀態(tài)異常是下列狀態(tài)之一:不活躍:異常不活躍不等待。等待:異常等待處理器服務(wù)?;钴S:處理器正在處理一個(gè)異常,還沒有完成?;钴S和等待:處理器正在處理異常,并且還有一個(gè)同一來源的異常正在等待。2.3.2 異常類型異常類型有:復(fù)位:系統(tǒng)啟動或熱復(fù)位時(shí)調(diào)用復(fù)位。異常模型將復(fù)位視為一個(gè)特殊形式的異常。在復(fù)位聲明時(shí),處

26、理器的停止操作,可能在一條指令執(zhí)行時(shí)的任意階段。復(fù)位結(jié)束時(shí),從復(fù)位向量表進(jìn)入的地址執(zhí)行重啟。在Thread模式重啟作為線程特權(quán)執(zhí)行。NMI:EFM32設(shè)備中,不可屏蔽中斷只能由軟件引起。這是除了復(fù)位外最高優(yōu)先級的異常。它是永久使能的,優(yōu)先級為-2。NMI不能是:l 被其他異常屏蔽或阻止激活l 搶占復(fù)位以外的任何異常硬故障:硬故障在異常處理中發(fā)生錯(cuò)誤的一種異常?;蚴且?yàn)橐粋€(gè)異常不能被其他任何異常機(jī)制管理。硬故障固定優(yōu)先級為1,這意味著它具有可配置優(yōu)先級并且比任何異常具有更高的優(yōu)先級。內(nèi)存管理錯(cuò)誤:內(nèi)存管理錯(cuò)誤是一種異常,是由于內(nèi)存保護(hù)相關(guān)的故障。在指令和數(shù)據(jù)存儲的事務(wù)中,微處理器或固定內(nèi)存保護(hù)約

27、束導(dǎo)致了這個(gè)錯(cuò)誤。這個(gè)故障是用來中止執(zhí)行指令訪問禁止的內(nèi)存區(qū)域,即使在微處理器禁用的情況下。總線故障:總線故障是一種異常,是由于與內(nèi)存相關(guān)錯(cuò)誤指令或數(shù)據(jù)存儲事務(wù)導(dǎo)致的,也可能是存儲系統(tǒng)中總線檢測的錯(cuò)誤導(dǎo)致的。使用錯(cuò)誤:使用錯(cuò)誤是一種發(fā)生在相關(guān)指令執(zhí)行錯(cuò)誤的一種異常。它包括:l 未定義指令l 一種非對齊訪問l 指令執(zhí)行無效狀態(tài)l 異常返回一個(gè)錯(cuò)誤。SVCall:SVCall是由SVC指令引發(fā)的一種異常。在一個(gè)操作系統(tǒng)環(huán)境中,應(yīng)用程序可以使用SVC指令訪問操作系統(tǒng)內(nèi)核函數(shù)和設(shè)備驅(qū)動程序。PendSV:PendSV是一個(gè)中斷驅(qū)動的系統(tǒng)級服務(wù)請求。在操作系統(tǒng)環(huán)境下,當(dāng)沒有其他異?;钴S時(shí),使用PendS

28、V上下文切換。SysTick:SysTick異常是系統(tǒng)定時(shí)器達(dá)到零的一種異常。軟件還可以生成一個(gè)SysTick異常。在一個(gè)操作系統(tǒng)環(huán)境中,處理器可以使用這個(gè)異常作為系統(tǒng)時(shí)鐘。中斷(IRQ):中斷或IRQ,是由外圍異常信號,或由軟件生成請求產(chǎn)生的一種異常信號。所有的中斷都是異步中斷指令執(zhí)行。在系統(tǒng)中,外圍設(shè)備使用中斷與處理器通信。2.3.3 異常處理程序處理器處理異常使用:中斷服務(wù)程序:中斷IRQ0到IRQ(n - 1)是設(shè)備中斷數(shù)量給出的,表1.1給出由ISRs處理的異常。錯(cuò)誤處理程序:硬故障,內(nèi)存管理錯(cuò)誤,使用錯(cuò)誤,總線故障都是由故障處理程序處理的錯(cuò)誤異常。系統(tǒng)處理程序:NMI,PendSV

29、,SVCall,SysTick都是由系統(tǒng)處理程序處理的系統(tǒng)異常。2.3.4 向量表向量表包含堆棧指針的復(fù)位值和啟動的地址,對于所有異常處理程序也稱為異常向量。圖2.2顯示了異常向量表中向量的順序。每個(gè)向量的最低有效位必須1,表明異常處理程序使用Thumb代碼。參數(shù)n表示設(shè)備的中斷次數(shù),由表1.1給出。2.3.5 異常優(yōu)先級如表2.15所示,所有的異常都有一個(gè)相關(guān)的優(yōu)先級:l 一個(gè)低優(yōu)先級的值指示一個(gè)更高的優(yōu)先級l 所有異常中可配置的優(yōu)先級為除了復(fù)位,硬故障和NMI如果軟件沒有配置任何優(yōu)先級,那么所有的異常有一個(gè)可配置的優(yōu)先級,優(yōu)先級為0。例如,將一個(gè)更高的優(yōu)先級值分配給IRQ0,將一個(gè)較低的優(yōu)

30、先級值分配給IRQ1,意味著IRQ1的優(yōu)先級高于IRQ0。如果IRQ1和IRQ0都聲明,IRQ1在IRQ0之前處理。如果多個(gè)等待的異常具有相同的優(yōu)先級,最低標(biāo)號的等待異常優(yōu)先。例如,如果IRQ0和IRQ1都在等待,它們有相同的優(yōu)先級,那么IRQ0在IRQ1之前處理。當(dāng)處理器執(zhí)行異常處理程序時(shí),如果一個(gè)高優(yōu)先級的異常發(fā)生,異常處理程序被搶占。如果發(fā)生的異常和異常處理程序具有相同的優(yōu)先級,不管異常的數(shù)量,處理程序不被搶占。但是,新的中斷的等待狀態(tài)改變。2.3.6 中斷優(yōu)先級分組為了增加中斷系統(tǒng)的優(yōu)先級控制,NVIC支持優(yōu)先級分組。這每個(gè)中斷優(yōu)先級寄存器條目分為兩個(gè)部分:l 上層領(lǐng)域定義組的優(yōu)先級l

31、 下層領(lǐng)域定義組內(nèi)的更高優(yōu)先級只有組的優(yōu)先級才能決定中斷異常搶占。當(dāng)處理器執(zhí)行一個(gè)中斷異常處理程序,同一組的相同優(yōu)先級的另一個(gè)中斷不搶占處理器。如果多個(gè)等待中斷有相同的組優(yōu)先級,subpriority字段決定了它們的處理順序。如果多個(gè)等待中斷有相同的組優(yōu)先級和subpriority,最低IRQ編號的中斷優(yōu)先處理。2.3.7 異常項(xiàng)和返回異常處理的描述使用以下條款:搶占:當(dāng)處理器執(zhí)行和異常處理程序,一個(gè)異常的優(yōu)先級高于正在被處理的異常,則它可以搶占異常處理程序。有關(guān)更多信息,請參見2.3.6。返回:發(fā)生在異常處理程序完成后,以及:l 沒有等待異常或優(yōu)先級不夠l 異常處理程序完成之后沒有處理延遲到

32、來的異常Tail-chaining:這種機(jī)制加速異常服務(wù)。完成異常處理程序后,如果有一個(gè)等待異常滿足異常項(xiàng),跳過堆棧并控制轉(zhuǎn)移到新的異常處理程序。延時(shí)到達(dá):這種機(jī)制加速搶占。如果一個(gè)高優(yōu)先級的異常發(fā)生在存儲之前異常狀態(tài),處理器切換處理高優(yōu)先級的異常,并初始化的向量以獲取異常。狀態(tài)保存不受延時(shí)異常影響,因?yàn)楫惓顟B(tài)保存是相同的。因此狀態(tài)保存持續(xù)不間斷。處理器可以接受一個(gè)遲到的異常,直到處理器的原始異常的異常處理程序的第一個(gè)指令進(jìn)入執(zhí)行階段。當(dāng)異常處理程序處理延時(shí)異常返回時(shí),通常tail-chaining規(guī)則適用。2.3.7.1異常項(xiàng)一個(gè)等待的異常有足夠優(yōu)先級時(shí),異常項(xiàng)發(fā)生?;蛘撸簂 處理器處于線

33、程模式l 新的異常比正在處理的異常具有更高的優(yōu)先級,在這種情況下,新的異常搶占原來的異常。當(dāng)一個(gè)異常就搶占另一個(gè)異常,此異常是嵌套。足夠的優(yōu)先級是指異常的優(yōu)先級比屏蔽寄存器規(guī)定的優(yōu)先級要高。詳見2.1.3.6節(jié)。當(dāng)異常的優(yōu)先級低于規(guī)定時(shí),處于等待狀態(tài),處理器不進(jìn)行處理。如果處理器受理,除非這個(gè)異常是tail-chained或延時(shí)到達(dá)的異常,處理器將信息存入當(dāng)前堆棧。這個(gè)操作稱為疊加,八數(shù)據(jù)字的結(jié)構(gòu)稱為堆棧幀。堆棧幀包含以下信息:l R0-R3, R12l Return addressl PSRl LR疊加之后,堆棧指針指出堆棧幀的最低地址。除非堆棧線條被禁用,堆棧幀是一致雙字地址。如果STKA

34、LIGN控制寄存器的配置設(shè)置為1時(shí),堆棧對齊調(diào)整在疊加期間執(zhí)行。堆棧幀包括返回地址。這是下一個(gè)中斷程序的指令的地址。這個(gè)值在異常返回恢復(fù)到PC,中斷程序重新執(zhí)行。在平行疊加操作,處理器執(zhí)行一個(gè)向量獲取讀取異常處理程序從向量表起始地址。當(dāng)完成疊加,處理器開始執(zhí)行異常處理程序。同時(shí),處理器向LR寄存器寫EXC_RETURN的值。這表明堆棧幀對應(yīng)的堆棧指針以及在異常項(xiàng)發(fā)生前處理器處于什么操作模式。在異常中,如果沒有更高優(yōu)先級的異常發(fā)生,處理器開始執(zhí)行這個(gè)異常的異常處理程序,不改變前面的等待異常的狀態(tài)。這是延時(shí)的情況。2.3.7.2 異常返回異常返回發(fā)生在處理器處于處理程序模式,執(zhí)行以下幾種指令之一,

35、加載EXC_RETURN的值到PC。l 出棧指令包含PCl 任何寄存器的BX指令l 一個(gè)以PC為目的LDR或LDM指令在異常項(xiàng)中,加載到LR是EXC_RETURN的值。當(dāng)處理器完成異常處理程序時(shí),異常機(jī)制依賴于這個(gè)值來檢測。這個(gè)值的最低四位提供返回堆棧信息和處理器模式。表2.16顯示了EXC_RETURN3:0的值和異常返回行為的描述。處理器將EXC_RETURN的31:4位設(shè)置為0xFFFFFFFF。當(dāng)這個(gè)值加載到PC表明處理器完成異常處理,并且處理器初始化異常返回序列。2.4 錯(cuò)誤處理錯(cuò)誤是異常的一個(gè)子集,見2.3節(jié)。下列情況將產(chǎn)生一個(gè)錯(cuò)誤:總線錯(cuò)誤:l 指令取出或向量表加載l 數(shù)據(jù)訪問l

36、 一個(gè)內(nèi)部檢測到錯(cuò)誤,如未定義指令或試圖改變BX狀態(tài)的指令l 試圖在內(nèi)存標(biāo)記為不可執(zhí)行區(qū)域去執(zhí)行一條指令l 特權(quán)故障或由于違反或企圖訪問非管理區(qū)域?qū)е碌奈⑻幚砥麇e(cuò)誤2.4.1 錯(cuò)誤類型表2.17顯示錯(cuò)誤的類型,對應(yīng)的處理程序和相應(yīng)的錯(cuò)誤狀態(tài)寄存器,以及顯示錯(cuò)誤發(fā)生的寄存器位。有關(guān)更多信息,請參見單元4.3.11錯(cuò)誤狀態(tài)寄存器。2.4.2 錯(cuò)誤升級和硬件錯(cuò)誤所有錯(cuò)誤異常,除了硬件錯(cuò)誤,都有可配置異常優(yōu)先級,詳見到4.3.9節(jié)。軟件可以禁用這些錯(cuò)誤處理程序的執(zhí)行。通常,異常優(yōu)先級加上異常屏蔽寄存器的值,決定了處理器是否進(jìn)入錯(cuò)誤處理程序,以及錯(cuò)誤處理程序是否能搶占另一個(gè)錯(cuò)誤處理程序。如2.3節(jié)所述。

37、在某些情況下,一個(gè)具有可配置優(yōu)先級的錯(cuò)誤被當(dāng)作一個(gè)硬故障。這就是所謂的優(yōu)先升級,錯(cuò)誤被描述為升級的硬錯(cuò)誤。升級硬件錯(cuò)誤發(fā)生在:l 錯(cuò)誤處理程序被服務(wù)時(shí)會導(dǎo)致同樣錯(cuò)誤。這個(gè)升級硬故障是因?yàn)橐粋€(gè)錯(cuò)誤處理程序不能搶占本身,因?yàn)樗仨毦哂信c當(dāng)前優(yōu)先級相同的優(yōu)先級l 錯(cuò)誤處理程序會導(dǎo)致錯(cuò)誤或低優(yōu)先級相同。這是因?yàn)樾碌墓收系奶幚沓绦虿荒軗屨籍?dāng)前執(zhí)行的錯(cuò)誤處理程序l 一個(gè)異常處理程序的優(yōu)先級相同或低于當(dāng)前執(zhí)行的異常會導(dǎo)致錯(cuò)誤l 錯(cuò)誤發(fā)生,但處理程序不啟用總線錯(cuò)誤處理程序進(jìn)棧時(shí),發(fā)生總線錯(cuò)誤,總線錯(cuò)誤不升級為硬件錯(cuò)誤。這意味著是一個(gè)堆棧損壞導(dǎo)致故障,故障處理程序執(zhí)行失敗。錯(cuò)誤處理程序操作,但堆棧內(nèi)容損壞。2.

38、4.3 錯(cuò)誤狀態(tài)寄存器和錯(cuò)誤地址寄存器錯(cuò)誤狀態(tài)寄存器指示故障的原因??偩€錯(cuò)誤和內(nèi)存管理錯(cuò)誤,錯(cuò)誤地址寄存器表示操作地址訪問導(dǎo)致的故障,如表2.18所示。2.4.4 死鎖當(dāng)執(zhí)行NMI或錯(cuò)誤處理程序時(shí)發(fā)生錯(cuò)誤,處理器進(jìn)入死鎖狀態(tài)。當(dāng)處理器處于死鎖狀態(tài)時(shí),它不執(zhí)行任何指令。處理器處于鎖住狀態(tài),直到:l 復(fù)位l NMI發(fā)生2.5 電源管理Cortex-M3處理器睡眠模式降低功耗:l 睡眠模式停止處理器時(shí)鐘l 深度睡眠模式停止高頻振蕩器和HFPERCLK/HFCORECLK以及閃存。深度睡眠模式SLEEPDEEP的SCR位用來選擇啟用哪種睡眠模式,參見4.3.7節(jié)。關(guān)于睡眠的行為模式的更多信息參見設(shè)備參

39、考手冊的ENMU文檔。本節(jié)描述進(jìn)入睡眠模式機(jī)制,并從睡眠模式中醒來的條件。2.5.1 進(jìn)入睡眠模式本節(jié)描述軟件可以使處理器進(jìn)入睡眠模式的機(jī)制。系統(tǒng)可以生成虛假喚醒事件。例如,調(diào)試操作喚醒處理器。因此,軟件必須處理這個(gè)事件后使處理器回到睡眠模式。程序可能用一個(gè)空閑循環(huán)使處理器回到睡眠模式。2.5.1.1 等待中斷等待中斷指令,WEI,使直接進(jìn)入睡眠模式。當(dāng)處理器執(zhí)行WFI指令時(shí),停止執(zhí)行指令,進(jìn)入睡眠模式。有關(guān)更多信息,參見3.10.12節(jié)。2.5.1.2 等待事件等待事件指令,WFE,使用one-bit事件寄存器的值進(jìn)入睡眠模式。處理器執(zhí)行WFE指令時(shí),它會檢查這個(gè)寄存器:l 如果寄存器是0,

40、處理器停止執(zhí)行指令并進(jìn)入睡眠模式l 如果寄存器是1,處理器清除寄存器為0,繼續(xù)執(zhí)行指令并不進(jìn)入睡眠模式如果事件寄存器值為1,表明WFE指令執(zhí)行時(shí),處理器禁止進(jìn)入睡眠模式。通常情況下,這是因?yàn)樘幚砥饔幸粋€(gè)SEV指令執(zhí)行,詳見3.10.9節(jié)。軟件不能直接訪問這個(gè)寄存器。2.5.1.3 Sleep-on-exit如果SLEEPONEXIT的SCR位設(shè)置為1,當(dāng)處理器完成異常處理程序返回線程的執(zhí)行模式時(shí),就立即進(jìn)入睡眠模式。使用此機(jī)制的應(yīng)用程序只需發(fā)生異常時(shí)處理器運(yùn)行。2.5.2 從睡眠模式喚醒處理器喚醒的條件取決于導(dǎo)致它進(jìn)入睡眠模式的機(jī)制。2.5.2.1 從WFI或sleep-on-exit 2.5

41、.2.1喚醒通常情況下,處理器只有當(dāng)它檢測到一個(gè)異常有足夠的進(jìn)入異常項(xiàng)的優(yōu)先級,就會喚醒。一些嵌入式系統(tǒng),處理器喚醒后,在執(zhí)行一個(gè)中斷處理程序之前,可能需要執(zhí)行系統(tǒng)恢復(fù)任務(wù)。為此將PRIMASK位設(shè)置為1,將FAULTMASK位為0。如果一個(gè)中斷到來,并且它的優(yōu)先級高于當(dāng)前異常的優(yōu)先級,處理器喚醒后不執(zhí)行中斷處理程序,直到處理器PRIMASK設(shè)置為零。關(guān)于PRIMASK和FAULTMASK的更多信息,詳見2.1.3.6節(jié)。2.5.2.2 從WFE喚醒處理器被喚醒,如果:l 它檢測到一個(gè)異常有導(dǎo)致異常條目的足夠優(yōu)先級l 在多處理器系統(tǒng)中,系統(tǒng)中的另一個(gè)處理器執(zhí)行一個(gè)SEV指令此外,如果SEVON

42、PEND的SCR位設(shè)置為1時(shí),任何新的等待中斷觸發(fā)一個(gè)事件就會喚醒處理器,即使中斷禁用或產(chǎn)生異常項(xiàng)的優(yōu)先不足。有關(guān)SCR的更多信息參見4.3.7節(jié)。2.5.3 喚醒中斷控制器喚醒中斷控制器可以檢測一個(gè)中斷,使處理器從深度睡眠模式中喚醒的外圍部分。只有當(dāng)DEEPSLEEP的SCR位設(shè)置為1時(shí),WIC使能,詳見4.3.7節(jié)。WIC不可編程,沒有任何寄存器或用戶界面。它是完全由硬件信號操作的。當(dāng)WIC使能,處理器進(jìn)入深度睡眠模式時(shí),系統(tǒng)中的電源管理單元可以將Cortex-M3處理器大部分?jǐn)嚯?。對于停止SysTick計(jì)時(shí)器有副作用。WIC接收一個(gè)中斷時(shí),在處理中斷之前,需要大量的時(shí)鐘周期喚醒處理器恢復(fù)

43、它的狀態(tài)。這意味著深度睡眠模式的中斷時(shí)延增加。2.5.4 電源管理編程提示ANSI C不能直接生成WFI和WFE指令。CMSIS提供了這些指令的下列固有功能:Void_WFE(void) / Wait for EventVoid_WFI(void) / Wait for Interrupt 3 Cortex-M3指令集3.1 指令集總結(jié)處理器實(shí)現(xiàn)了Thumb指令集的一個(gè)版本,表3.1列出它所支持的指令。3.2 指令功能ANSI不能直接訪問一些Cortex-M3指令。本節(jié)描述的內(nèi)部功能,它可以生成這些指令,由CMIS或C編譯器提供。如果一個(gè)C編譯器不支持適當(dāng)?shù)墓逃泄δ?,你可能不得不使用?nèi)聯(lián)匯編程

44、序訪問一些指令。CMSIS提供了以下內(nèi)部函數(shù)來生成ANSI不能直接訪問指令:3.3 指令的描述本節(jié)將介紹使用指令的更多信息。3.3.1 操作數(shù)一條指令操作數(shù)可以是一個(gè)ARM寄存器,一個(gè)常數(shù),或另一個(gè)instruction specific的參數(shù)。指令作為操作數(shù)時(shí),經(jīng)常在目的地寄存器存儲結(jié)果。指令有一個(gè)目的寄存器時(shí),它通常是在操作數(shù)中指定的。在某些指令中操作數(shù)是靈活的,它們可以是一個(gè)寄存器或一個(gè)常數(shù)。詳見3.3.3節(jié)。3.3.2 使用PC或SP限制是否可以使用程序計(jì)數(shù)器或堆棧指針寄存器作為操作數(shù)的目的地址,許多指令有限制。有關(guān)更多信息,請參見說明書。3.3.3 靈活的第二個(gè)操作數(shù)許多通用的數(shù)據(jù)處

45、理指令有靈活的第二個(gè)操作數(shù)。本節(jié)描述Operand2的每條指令的語法。Operand2可以是:l Section 3.3.3.1l Section 3.3.3.23.3.3.1 常量指定一個(gè)Operand2常數(shù)的形式:#constant常量可以是:l 任意常數(shù),將32#比特字左移8#比特的值l 0x00XY00XY任何常數(shù)的形式l 0xXY00XY00任何常數(shù)的形式l 0xXYXYXYXY任何常數(shù)的形式此外,指令數(shù)量很小時(shí),常數(shù)可以去更大范圍的值。這些都是在單獨(dú)指令描述中的提到過。Operand2常量用在MOVS,MVNS,ANDS,ORRS,EORS,BICS,TEQ或TST這些指令中,更新

46、常量的進(jìn)位標(biāo)記位bit31。如果常數(shù)大于255,可以由一個(gè)8位值移位得到。如果Operand2是其他常數(shù),這些指令不影響進(jìn)位標(biāo)記。3.3.3.1.1 指令替換匯編程序可以產(chǎn)生一個(gè)等價(jià)的指令,以防指定一個(gè)不允許的常數(shù)。例如,一個(gè)匯編程序可能用CMP Rd,#0xffffffff等指令替換CMN Rd,#0x2。3.3.3.2 寄存器轉(zhuǎn)移選項(xiàng)您指定Operand2寄存器的形式:Rm , shift其中:Rm:是寄存器的第二個(gè)操作數(shù)的數(shù)據(jù)轉(zhuǎn)移:是一個(gè)用于Rm的可選轉(zhuǎn)移。是下列之一:l ASR #n 算術(shù)右移n位,1 # n # 32l LSL #n 邏輯左移位n位,1 # n # 31l LSR #

47、n 邏輯右移位n位,1 # n # 32l ROR # n 向右旋轉(zhuǎn)n位,1 # n # 31l RRX 向右旋轉(zhuǎn)一位,帶擴(kuò)展l - 缺省,沒有發(fā)生轉(zhuǎn)變,相當(dāng)于LSL # 0如果省略的轉(zhuǎn)移,或指定LSL #0,指令使用Rm的值。如果你指定一個(gè)轉(zhuǎn)移,這個(gè)轉(zhuǎn)移用Rm的值,以及使用指令產(chǎn)生的32位值。然而,寄存器Rm的內(nèi)容保持不變。指定寄存器轉(zhuǎn)移時(shí),也更新某些指令進(jìn)位標(biāo)記。3.3.4 移位操作寄存器移位操作將寄存器中的比特位向左或向右移動指定數(shù)量位,改變長度。寄存器的轉(zhuǎn)變實(shí)現(xiàn)有以下幾種情況:l 由ASR,LSR,LSL和RRX指令直接執(zhí)行,并將結(jié)果寫入目的寄存器l 在Operand2的計(jì)算過程中,指

48、定第二個(gè)操作數(shù)的指令作為一個(gè)寄存器移位,詳見3.3.3節(jié)。結(jié)果也用于指令實(shí)現(xiàn)移位長度決定于移位類型和轉(zhuǎn)移指令,詳見單獨(dú)指令描述或3.3.3節(jié)。如果移位長度為0,不發(fā)生移位。寄存器移位操作影響進(jìn)位標(biāo)志,除非指定的移位長度為0。以下描述各種操作以及它們是如何影響進(jìn)位標(biāo)記。Rm寄存器包含移位的值,n是移位的長度。3.3.4.1 ASR算術(shù)右移將Rm寄存器的左邊32-n的n位移動到右邊。將原始31位復(fù)制到寄存器左#n的結(jié)果。參見圖3.1。您可以使用ASR # n操作寄存器中的值Rm除以2n,結(jié)果指向負(fù)無窮。當(dāng)指令是ASR #n或者ASR #n用于Operand2中的MOVS,MVNS,ANDS,ORR

49、S,ORNS,BICS,TEQ或TST指令時(shí),移位最后位進(jìn)位標(biāo)志更新,有些Rm寄存器是bitn-1位。3.3.4.2 LSR邏輯右移,將寄存器Rm左邊32-n位移到右邊n的地方,右邊32 - n位的結(jié)果。設(shè)置的左#手n位結(jié)果為0。參見圖3.2。您可以使用LSR # n操作寄存器中的值Rm除以2n,如果該值被認(rèn)為是一個(gè)無符號整數(shù)。LSR指令或者當(dāng)LSR # n用于Operand2指令MOVS,MVNS,ANDS,ORRS,ORNS,EORS,BICS,TEQ,TST,更新移位最后位的進(jìn)位標(biāo)記,有些Rm寄存器是bitn-1位。3.3.4.3 LSL邏輯左移將n位移動右邊32-n位寄存器Rm,到左邊

50、32-n位的結(jié)果。設(shè)置右邊n位的值為0。參見圖3.3。您可以使用LSL # n操作寄存器中的值Rm乘以2 n,如果該值被認(rèn)為是一個(gè)無符號整數(shù)或二進(jìn)制補(bǔ)碼帶符號整數(shù)。溢出可能發(fā)生沒有警告。使用LSLS指令,或者當(dāng)LSL用于Operand2的MOVS,MVNS,ANDS,ORRS,ORNS,EORS,BICS,TEQ,TST指令,寄存器Rm的bit32-n的進(jìn)位標(biāo)志更新。使用LSL # 0時(shí),這些指令不影響進(jìn)位標(biāo)記。3.3.4.4 ROR循環(huán)右移n位,移動寄存器Rm左邊32-n的n位到32-n的右邊。將寄存器右邊n位移到左邊。參見圖3.4。使用ROR指令,或ROR # n用于Operand2的MO

51、VS,MVNS,ANDS,ORRS,ORNS,EORS,BICS,TEQ,TST指令,寄存器Rm的bitn-1進(jìn)位標(biāo)志更新。3.3.4.5 RRX擴(kuò)展的循環(huán)右移將Rm寄存器的位向右移動1bit。它將進(jìn)位標(biāo)志復(fù)制到結(jié)果bit31。參見圖3.5。使用RRXS指令或者當(dāng)RRX用于Operand2的MOVS,MVNS,ANDS,ORRS,ORNS,EORS,BICS,TEQ,TST指令時(shí),Rm寄存器進(jìn)位標(biāo)志bit0更新。3.3.5 地址對齊一個(gè)對齊的訪問是這樣操作的,字對齊地址用于一個(gè)字,雙字或多個(gè)字的訪問。半字對齊地址用于半字訪問。字節(jié)訪問總是對齊的。Cortex-M3處理器只支持以下指令的對齊訪問

52、:l LDR, LDRTl LDRH, LDRHTl LDRSH, LDRSHTl STR, STRTl STRH, STRHT其他所有裝載和存儲指令如果他們執(zhí)行未對齊訪問生成使用故障異常,因此他們的訪問必須地址對齊。關(guān)于錯(cuò)誤的更多信息請參見2.4。非對齊訪問通常慢于對齊訪問。此外,一些內(nèi)存區(qū)域可能不支持非對齊訪問。因此,ARM建議程序員確保訪問是對齊的。為了避免非對齊的意外訪問,對所有對齊訪問,在配置和控制寄存器使用UNALIGN_TRP位構(gòu)造陷阱,詳見4.3.8節(jié)。3.3.6 與PC相關(guān)的術(shù)語與PC相關(guān)的術(shù)語是代表一條指令的地址或文字?jǐn)?shù)據(jù)的標(biāo)志。它代表指令的PC值或位移量的大小。匯編程序從

53、標(biāo)簽和當(dāng)前指令的地址計(jì)算所需的偏移量。如果偏移量太大,匯編程序產(chǎn)生一個(gè)錯(cuò)誤。3.3.7 條件執(zhí)行大多數(shù)數(shù)據(jù)處理指令可以根據(jù)操作的結(jié)果更新應(yīng)用程序狀態(tài)寄存器的狀態(tài)標(biāo)志,參見2.1.3.5.1節(jié)。有些指令更新所有標(biāo)志,有些只更新一部分。如果一個(gè)標(biāo)志沒有更新,那么保留了原始值。詳見標(biāo)志對指令的影響描述。你可以有條件地執(zhí)行一條指令,基于在另一個(gè)指令中設(shè)置的狀態(tài)標(biāo)志,或者:l 指令執(zhí)行后立即更新標(biāo)志位l 任意數(shù)量的干預(yù)指令沒有更新標(biāo)志位條件執(zhí)行可以通過使用條件分支或通過添加后綴條件代碼指令。見表3.4的后綴列表添加到指令使其有條件的說明。條件代碼后綴使處理器測試基于一個(gè)條件的標(biāo)記。如果條件指令的條件測試

54、失敗,那么指令:l 不執(zhí)行l(wèi) 不向目的寄存器寫任何值l 不影響任何標(biāo)志位l 不產(chǎn)生任何異常條件指令,除了條件分支機(jī)構(gòu),必須包含在一個(gè)if - then指令塊中。有關(guān)更多信息,請參見3.9.3節(jié),使用IT指令的限制。如果在條件指令之外有IT指令塊,匯編程序會自動插入IT指令。使用CBZ和CBNZ指令比較寄存器的零值以及分支上的結(jié)果。本節(jié)描述了:l Section 3.3.7.1l Section 3.3.7.23.3.7.1 狀態(tài)標(biāo)志APSR包含以下條件標(biāo)志:N 設(shè)置為1時(shí),操作的結(jié)果是負(fù)數(shù),否則清除為0。Z 設(shè)置為1時(shí),操作的結(jié)果為零,否則清除為0。C 設(shè)置為1時(shí),操作產(chǎn)生進(jìn)位,否則清除為0。

55、V 設(shè)置為1時(shí),操作產(chǎn)生溢出,否則清除為0。進(jìn)位發(fā)生在:l 如果添加的結(jié)果大于或等于2 32l 如果減法的結(jié)果是正數(shù)或零l 作為邏輯指令內(nèi)聯(lián)移位操作的結(jié)果如果進(jìn)行加減或比較的結(jié)果大于或等于2 31或小于- 2 31,溢出發(fā)生。3.3.7.2 條件碼后綴帶有條件選項(xiàng)的指令可以有條件地執(zhí)行,一個(gè)可選的條件語法描述為cond。條件指令執(zhí)行前需要IT指令。如果條件碼標(biāo)志APSR滿足指定的條件,條件指令只執(zhí)行一次。表3.4顯示了條件代碼使用。您可以使用條件執(zhí)行的IT指令,減少代碼中的分支指令。表3.4還顯示了代碼后綴和N,Z,C和V標(biāo)志位的關(guān)系。3.3.8 指令寬度選擇有很多指令可以根據(jù)特定的操作數(shù)和目的寄存器生成一個(gè)16位編碼或32位編碼。這些指令,您可以通過指令寬度后綴強(qiáng)制

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論