ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具_(dá)第1頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具_(dá)第2頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具_(dá)第3頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具_(dá)第4頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具_(dá)第5頁(yè)
已閱讀5頁(yè),還剩117頁(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)介

1、1 123 ARM是一類微處理器,同時(shí)也是一個(gè)公司的名字。ARM公司于1990年11月在英國(guó)劍橋成立(原名Advanced RISC Machine),專門從事基于RISC技術(shù)的芯片設(shè)計(jì)、開發(fā)和授權(quán)。目前,ARM處理器(即采用ARM IP核的處理器)已遍及工業(yè)控制、通信系統(tǒng)、無(wú)線通訊、網(wǎng)絡(luò)系統(tǒng)、消費(fèi)類電子產(chǎn)品、成像和安全產(chǎn)品等各類產(chǎn)品市場(chǎng)。截止到2012年,基于ARM技術(shù)設(shè)計(jì)的處理器已經(jīng)占據(jù)32位RISC微處理器約80%以上的市場(chǎng)份額,ARM技術(shù)正在逐步滲入到我們生活的各方面。4 ARM處理器是第一個(gè)為商業(yè)用途開發(fā)的RISC微處理器。ARM所采用的體系結(jié)構(gòu)對(duì)于傳統(tǒng)的RISC體系結(jié)構(gòu)既有繼承,又

2、有舍棄和發(fā)展,即完全根據(jù)實(shí)際設(shè)計(jì)的需要仔細(xì)研究,沒(méi)有機(jī)械照搬。最初的ARM設(shè)計(jì)最關(guān)心的是必須保持設(shè)計(jì)的簡(jiǎn)單性。ARM的簡(jiǎn)單性在ARM的硬件組織和實(shí)現(xiàn)方面比指令集的結(jié)構(gòu)方面體現(xiàn)的更明顯。但是ARM仍保留一些CISC的特征,并且因此達(dá)到比純粹的RISC更高的代碼密度,使得ARM在開始時(shí)就獲得了其功率效率和較小的核面積的優(yōu)勢(shì)。5 ARM微處理器內(nèi)核中普遍采用了流水線結(jié)構(gòu),隨著ARM內(nèi)核的發(fā)展,其流水線結(jié)構(gòu)越來(lái)越復(fù)雜。常見的ARM處理器內(nèi)核流水線如圖12-1所示。圖12-1 ARM處理器內(nèi)核流水線工作示意圖6 迄今為止,ARM體系結(jié)構(gòu)共定義了8個(gè)版本,版本號(hào)分別為v1v8,從版本v1到v8,ARM體系

3、的指令集功能不斷擴(kuò)大。同時(shí),各版本中還有一些變種,這些變種定義該版本指令集中不同的功能。ARM處理器系列中的各種處理器,實(shí)現(xiàn)技術(shù)各不相同,性能差別很大,應(yīng)用場(chǎng)合也不同,但只要它們支持同一ARM體系版本,基于它們的應(yīng)用軟件將是兼容的。 需要注意,ARM的體系結(jié)構(gòu)版本號(hào)并不是ARM核的版本號(hào)。7 常見的ARM體系架構(gòu)與ARM核的版本對(duì)應(yīng)關(guān)系見表12-1 。 ARM核核 體系結(jié)構(gòu)體系結(jié)構(gòu)ARM1ARMv1ARM2ARMv2ARM6, ARM600, ARM610, ARM7, ARM700, ARM710ARMv3StrongARM, ARM8, ARM810, ARM810 ARMv4ARM9E-

4、S, ARM10TDM1, ARM1020EARMv5ARM1136J(F)-S, ARM1176JZ(F)-S, ARM11MPCoreARMv6ARMCortex-M, ARMCortex-R, ARMCortex-AARMv7表12-1常見的ARM體系架構(gòu)與ARM核的版本對(duì)應(yīng)關(guān)系8 基于ARM的處理器內(nèi)核簡(jiǎn)稱ARM內(nèi)核,內(nèi)核并不是芯片,ARM內(nèi)核與其他部件組合(如存儲(chǔ)器、定時(shí)器和片內(nèi)外設(shè)接口等)在一起才構(gòu)成芯片。圖12-2 ARM芯片內(nèi)部主要模塊示意圖ARM芯片中只有處理器內(nèi)核由ARM公司設(shè)計(jì),其他外圍模塊由獲得ARM公司處理器IP授權(quán)的芯片廠商自行設(shè)計(jì)。芯片廠商針對(duì)不同的應(yīng)用領(lǐng)域,通過(guò)

5、設(shè)計(jì)具有很強(qiáng)針對(duì)性的專用硬件加速器,根據(jù)外設(shè)搭配不同的接口電路等設(shè)計(jì)出適用于專業(yè)領(lǐng)域的SOC芯片,從而實(shí)現(xiàn)基于相同處理器內(nèi)核芯片產(chǎn)品的差異化。9 ARM處理器內(nèi)核不但包括CPU,還包括高速緩存、MMU控制器、嵌入式跟蹤宏單元、TCM接口、總線控制邏輯、AHB接口、協(xié)處理器、中斷控制器等電路模塊。整個(gè)ARM處理器內(nèi)核的核心是CPU。雖然隨著ARM處理器內(nèi)核的升級(jí),其CPU也不斷改進(jìn),但其基本結(jié)構(gòu)主要由32位ALU、31個(gè)32位通用寄存器及6個(gè)狀態(tài)寄存器、32個(gè)8位乘法器、32個(gè)桶形移位寄存器、指令譯碼及控制邏輯、指令流水線和數(shù)據(jù)/地址寄存器組成。10 圖12-3ARM CPU基本組成模型11 A

6、RM處理器是32位處理器,但兼容16位指令集和數(shù)據(jù)類型。從編程的角度看,ARM處理器有以下兩種操作狀態(tài): ARM狀態(tài) 32位,處理器執(zhí)行的是字的ARM指令; Thumb狀態(tài) 16位,處理器執(zhí)行的是半字的Thumb指令。 在程序執(zhí)行過(guò)程中,處理器可以隨時(shí)在這兩種操作狀態(tài)之間切換。值得注意的是,操作狀態(tài)的切換并不影響處理器的工作模式或寄存器的內(nèi)容。ARM處理器復(fù)位后開始執(zhí)行代碼時(shí),應(yīng)該處于ARM狀態(tài)。12.2 ARM編程模型12.2.1 處理器狀態(tài)12 ARM指令集和Thumb指令集均有切換處理器狀態(tài)的指令,并可在兩種操作狀態(tài)之間切換。兩個(gè)狀態(tài)可以按以下方法切換: 進(jìn)入Thumb狀態(tài) 當(dāng)操作數(shù)寄存

7、器的狀態(tài)位(最低位)為1時(shí),執(zhí)行BX指令就可以進(jìn)行Thumb狀態(tài)。如果處理器在Thumb狀態(tài)發(fā)生異常(所有異常處理都在ARM狀態(tài)下執(zhí)行),則當(dāng)異常處理返回時(shí)自動(dòng)切換到Thumb狀態(tài)。 進(jìn)入ARM狀態(tài) 操作數(shù)寄存器的狀態(tài)位(最低位)為0時(shí),執(zhí)行BX指令就可以進(jìn)行ARM狀態(tài)。處理器進(jìn)行異常處理時(shí),把PC的值放入異常模式鏈接寄存器中,從異常向量地址開始執(zhí)行程序,系統(tǒng)自動(dòng)進(jìn)入ARM狀態(tài)。 處理器狀態(tài)的切換13 ARM體系結(jié)構(gòu)支持7種處理器模式:用戶模式、快中斷模式、中斷模式、管理模式、中止模式、未定義模式和系統(tǒng)模式。具體參考表12-2。12.2.2 處理器模式處理器模式處理器模式用途用途備注備注用戶(

8、usr)正常程序工作模式不能直接切換到其它模式快中斷(fiq)處理高速中斷,用于高速數(shù)據(jù)傳輸及通道處理FIQ異常響應(yīng)時(shí)進(jìn)入該模式中斷(irq)用于通用中斷處理IRQ異常響應(yīng)時(shí)進(jìn)入該模式管理(svc)操作系統(tǒng)使用的保護(hù)模式,系統(tǒng)復(fù)位后的默認(rèn)模式系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入該模式中止(abt)用于支持虛擬內(nèi)存和存儲(chǔ)器保護(hù)數(shù)據(jù)或指令預(yù)取中止時(shí)進(jìn)入該模式未定義(und)用于支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)行該模式系統(tǒng)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)等與用戶類似,但具有可以直接切換到其它模式等特權(quán)表12-2 處理器模式及其用途14 除用戶模式外,其它模式為特權(quán)模式。ARM內(nèi)部寄存器和

9、一些片內(nèi)外設(shè)在硬件設(shè)計(jì)上只允許(或可選為只允許)特權(quán)模式下訪問(wèn)。此處,特權(quán)模式可以自由地切換處理器模式,而用戶模式不能直接切換別的模式。 有5種處理器模式稱為異常模式,它們是:快中斷模式、中斷模式、管理模式、中止模式、未定義模式。它們除了可以通過(guò)程序切換進(jìn)入外,也可以由特定的異常進(jìn)入。當(dāng)特定的異常出現(xiàn)時(shí),處理器進(jìn)入相應(yīng)的模式。每種模式都有某些附加的寄存器,以避免異常退出時(shí)用戶模式的狀態(tài)不可靠。 系統(tǒng)模式與用戶模式一樣不能由異常進(jìn)入,且使用與用戶模式完全相同的寄存器。然而系統(tǒng)模式是特權(quán)模式,不受用戶模式的限制。有了系統(tǒng)模式,操作系統(tǒng)要訪問(wèn)用戶模式的寄存器就比較方便。同時(shí),操作系統(tǒng)的一些特權(quán)任務(wù)可

10、以使用這個(gè)模式,以訪問(wèn)一些受控的資源而不必?fù)?dān)心異常出現(xiàn)時(shí)的任務(wù)狀態(tài)變得不可靠。15 ARM處理器共有37個(gè)32位寄存器: 31個(gè)通用寄存器 R0R15、R13_svc、R14_svc、R13_abt、R14_abt、R13_unt、R14_unt、R13_irq、R14_irt和R8_frqR14_frq; 6個(gè)狀態(tài)寄存器 CPSR、SPSR_svc、SPSR_abt、SPSR_unt、SPSR_irq和SPSR_fiq。 這些寄存器并不是在同一時(shí)間全都可以被訪問(wèn),具體哪些寄存器可編程訪問(wèn),取決于處理器狀態(tài)和具體的操作模式。12.2.3 寄存器集16(1)通用寄存器 (2)程序計(jì)數(shù)器(PC)(

11、3)程序狀態(tài)寄存器(PSR)(4)條件碼標(biāo)志位 (5)控制位(6)ARM狀態(tài)寄存器與Thumb狀態(tài)寄存器之間的關(guān)系12.2.3 寄存器集1712.2.3 寄存器集通用寄存器包括R0R15,可以分為兩類:不分組寄存器(R0R7)和分組寄存器(R8R14)。1)不分組寄存器(R0R7)。在處理器的所有模式下,不分組寄存器中的每個(gè)都指向一個(gè)物理寄存器,且未被系統(tǒng)用于特殊用途。因此,在中斷或異常處理中進(jìn)行模式切換時(shí),由于不同的處理器模式均使用相同的物理寄存器,可能會(huì)破壞寄存器中的數(shù)據(jù),進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)引起注意。(1)通用寄存器182)分組寄存器(R8R14)。分組寄存器中的每一次所訪問(wèn)的物理寄存器都與

12、處理器當(dāng)前的模式有關(guān)。若要訪問(wèn)特定的物理寄存器,則要使用規(guī)定的物理寄存器名字后綴。物理寄存器名字形式如下:R13_R14_其中,是寄存器后綴,分別使用usr、svc、fiq、irq、abt和und表示6種模式。19,每個(gè)寄存器對(duì)應(yīng)2個(gè)不同的物理寄存器,當(dāng)使用fiq模式時(shí)訪問(wèn)寄存器R8_fiqR12_fiq;當(dāng)使用除fiq模式外的其他模式時(shí)訪問(wèn)寄存器R8 R12。,每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器。其中的一個(gè)物理寄存器是用戶模式和系統(tǒng)模式公用的,其余5個(gè)分別用于5種異常模式。 寄存器R13通常作為堆棧指針(SP),用于保存當(dāng)前處理器工作模式下堆棧的棧頂?shù)刂?。作為鏈接寄存?LR),用于保存子程

13、序的返回地址。當(dāng)子程序折返回地址保存在堆棧中,R14也可作為通用寄存器。 處理器在不同模式時(shí),允許每種模式都有自已的棧頂和鏈接寄存器。20(2)程序計(jì)數(shù)器(PC) PC作為程序計(jì)數(shù)器,用于保存處理器要取的下一條指令的地址。 R15作為程序計(jì)數(shù)器,用于保存處理器要取的下一條指令的地址。 ARM狀態(tài)下,所有的ARM指令都是32位長(zhǎng)度的,指令以字對(duì)準(zhǔn)保存;Thumb狀態(tài)下,所有的Thumb指令都是16位長(zhǎng)度的,指令以半字對(duì)準(zhǔn)保存。 由于ARM體系采用多級(jí)流水線技術(shù),對(duì)于ARM指令集而言,PC總是指向當(dāng)前指令之后兩條指令的地址,即PC的值為當(dāng)前指令的地址加8。21(3)程序狀態(tài)寄存器(PSR) 程序狀

14、態(tài)寄存包括當(dāng)前程序狀態(tài)寄存器(CPSR)和備份程序狀態(tài)寄存器(SPSR)。 所有處理器模式下都可以訪問(wèn)當(dāng)前程序狀態(tài)寄存器。CPSR包括條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志,以及其他一些相關(guān)的控制和狀態(tài)位。 在每一種異常工作模式下,都有一個(gè)備份狀態(tài)寄存器。當(dāng)異常發(fā)生時(shí),SPSR用于保存CPSR的當(dāng)前值,當(dāng)從異常退出時(shí),可用SPSR來(lái)恢復(fù)CPSR。用戶模式和系統(tǒng)模式不屬于異常模式,因此這兩種模式?jīng)]有SPSR,當(dāng)在這兩種情況下訪問(wèn)SPSR時(shí),結(jié)果是未知的。CPSR和SPSR的格式如圖12-4所示。22圖 12-4 CPSR/SPSR格式23(4)條件碼標(biāo)志位 N、Z、C和V均為條件碼標(biāo)志位。其

15、內(nèi)容可被算術(shù)或邏輯運(yùn)算指令的結(jié)果所改變,并全由條件碼標(biāo)志位狀態(tài)可以決定某條指令是否執(zhí)行。 標(biāo)志N。當(dāng)兩個(gè)用補(bǔ)碼表示的帶符號(hào)數(shù)進(jìn)行運(yùn)算時(shí),N=1表示結(jié)果為負(fù)數(shù);N=0表示運(yùn)算結(jié)果為正數(shù)或零。 標(biāo)志Z。Z=1表示指令運(yùn)算結(jié)果為0;Z=0表示指令運(yùn)算結(jié)果為非零。24 標(biāo)志C。對(duì)于加法運(yùn)算(包括比較指令CMN),C=1表示加法運(yùn)算產(chǎn)生進(jìn)位(即無(wú)符號(hào)數(shù)溢出),C=0表示加法運(yùn)算未產(chǎn)生進(jìn)位;對(duì)于減法運(yùn)算(包括比較指令CMP),C=0表示減法運(yùn)算產(chǎn)生借位(即無(wú)符號(hào)數(shù)溢出),C=1表示減法運(yùn)算未產(chǎn)生借位;對(duì)于包含移位操作的非加/減運(yùn)算指令,C為移出值的最后一位;對(duì)于其他非加/減運(yùn)算指令,C的值通常不改變。 標(biāo)

16、志V。對(duì)于加法/減法指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)位溢出,V=0表示符號(hào)位未溢出;對(duì)于其他的非加/減運(yùn)算指令,V的值通常不改變。25(5) 控制位CPSR的低8位,即I、F、T和M0M4稱為控制位。當(dāng)發(fā)生異常時(shí)這些位可以被改變。當(dāng)處理器運(yùn)行在特權(quán)模式時(shí),這些位也可以由程序修改。中斷禁止位I和F。I=1表示禁止IRQ中斷,F(xiàn)=1表示禁止FIQ中斷。T標(biāo)志位。對(duì)于ARM體系結(jié)構(gòu)v4及以上版本的T系列處理器,T=0表示程序運(yùn)行于ARM狀態(tài),T=1表示程序運(yùn)行于Thumb狀態(tài);對(duì)于ARM體系結(jié)構(gòu)v4及以上版本的非T系列處理器,T=0表示程序運(yùn)行于ARM狀態(tài),T=

17、1表示執(zhí)行下一條指令以引起未定義的指令異常。注意:絕對(duì)不要強(qiáng)制改變CPSR寄存器中的T位。如果這樣做,處理器則會(huì)進(jìn)入一個(gè)無(wú)法預(yù)知的狀態(tài)。26 運(yùn)行模式位M0M4。這些模式位決定處理器的模式。見表12-4。不是所有模式位的組合都定義了有效的處理器模式,因此,請(qǐng)注意不要使用表中沒(méi)有列出的組合。 保留位。CPSR中的其他位為保留位,當(dāng)改變CPSR中的條件碼標(biāo)專位或控制位時(shí),不要改變保留位,在程序中也不要使用保留位來(lái)存儲(chǔ)數(shù)據(jù)。保留位將用于ARM版本的擴(kuò)展。27M4:0處理器模式可訪問(wèn)的Thumb狀態(tài)寄存器可訪問(wèn)的ARM狀態(tài)寄存器10000 用戶R0R7,SP,LR,PC,CPSR R0R14, PC,

18、CPSR10001 快中斷R0R7,SP_fiq,LR_fiq,PC,CPSR,SPSR_fiqR0R7,R8_fiqR14_fiq,PC,CPSR,SPSR_fiq10010 中斷R0R7,SP_fiq,LR_fiq,PC,CPSR,SPSR_fiqR0R7,SP_svc,LR_svc,PC,CPSR,SPSR_svcR0R12,R13_fiq,R14_fiq,PC,CPSR,SPSR_fiq10011管理R0R12,R13_svc,R14_svc,PC,CPSR,SPSR_svc10111中止R0R7,SP_abt,LR_abt,PC,CPSR,SPSR_abtR0R12,R13_abt,

19、R14_abt,PC,CPSR,SPSR_abt11011未定義R0R7,SP_und,LR_und,PC,CPSR,SPSR_undR0R12,R13_und,R14_und,PC,CPSR,SPSR_und11111系統(tǒng)R0R7,SP,LR,PC,CPSR,SPSRR0R14, PC,CPSR表12-4 模式位的含義28(6)ARM狀態(tài)寄存器與Thumb狀態(tài)寄存器之間的關(guān)系Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下的寄存器集的子集。用戶可以訪問(wèn)8個(gè)通用寄存器(R0R7)、PC、SP、LR、SPSR和CPSR。每種特權(quán)模式都有一組SP、LR、SPSR。Thumb狀態(tài)寄存器與ARM狀態(tài)寄存器集有

20、如下的關(guān)系:Thumb狀態(tài)R0R7與ARM狀態(tài)R0R7相同。Thumb狀態(tài)CPSR和SPSR與ARM狀態(tài)CPSR和SPSR相同。Thumb狀態(tài)SP映射到ARM狀態(tài)R13。Thumb狀態(tài)LR映射到ARM狀態(tài)R14。Thumb狀態(tài)PC映射到ARM狀態(tài)PC(R15)。具體關(guān)系如圖12-5所示。29圖12-5 Thumb寄存器在ARM狀態(tài)寄存器上的映射 Thumb狀態(tài)下,寄存器R8R15并不是標(biāo)準(zhǔn)寄存器集的一部分,但用戶可以使用匯編語(yǔ)言程序有限制地訪問(wèn)這些寄存器,將其用作快速的寄存器。使用帶特殊變量的MOV指令,數(shù)據(jù)可以在低寄存器(R0R7)和高寄存器(R8R15)之間進(jìn)行傳送;高寄存器的值可以使用C

21、MP指令進(jìn)行比較或使用ADD指令加上低寄存器的值。 30 ARM處理器支持的數(shù)據(jù)類型有字節(jié) 、半字和字。 字節(jié) 字節(jié)的長(zhǎng)度為8位(bit); 半字 半字的長(zhǎng)度為16位(bit),半字必須以2字節(jié)為邊界對(duì)齊; 字 字的長(zhǎng)度為32位(bit)。字必須以4字節(jié)為邊界對(duì)齊。 這三種數(shù)據(jù)類型都支持無(wú)符號(hào)數(shù)和帶符號(hào)數(shù),當(dāng)任意一種類型描述為unsigned時(shí),N位數(shù)值使用正常的二進(jìn)制格式表示范圍為 的非負(fù)整數(shù);當(dāng)任意一種類型描述為signed時(shí),N位數(shù)值使用2的補(bǔ)碼格式表示范圍為 的整數(shù)。ARM指令的長(zhǎng)度剛好是1個(gè)字(分配為占用4個(gè)字節(jié))。Thumb指令的長(zhǎng)度剛好一個(gè)半字(占用2個(gè)字節(jié))。所有數(shù)據(jù)操作都以字

22、為單位。加載和存儲(chǔ)指令可以以字節(jié)、半字和字進(jìn)行操作,當(dāng)加載字節(jié)或半字時(shí)自動(dòng)實(shí)現(xiàn)零擴(kuò)展或符號(hào)擴(kuò)展。12.2.4 體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型0 21N11221NN3112.2.5 存儲(chǔ)器及存儲(chǔ)器映射I/OARM處理器采用馮諾依曼結(jié)構(gòu),指令和數(shù)據(jù)共用一條32位數(shù)據(jù)總線,只有加載、存儲(chǔ)和交換指令可訪問(wèn)存儲(chǔ)器中的數(shù)據(jù)。ARM公司的規(guī)范僅定義了內(nèi)核與存儲(chǔ)系統(tǒng)之間的信號(hào)及時(shí)序(局部總線),而現(xiàn)實(shí)的芯片一般在外部總線與內(nèi)核的局部總線之間有一個(gè)存儲(chǔ)器管理部件將局部總線的信號(hào)和時(shí)序轉(zhuǎn)換為現(xiàn)實(shí)的外部總線信號(hào)和時(shí)序。因此,外部總信的信號(hào)和時(shí)序與具體的芯片有關(guān),不是ARM的標(biāo)準(zhǔn)。具體到某個(gè)芯片的外部存儲(chǔ)系統(tǒng)的設(shè)計(jì),需

23、要參考其芯片的數(shù)據(jù)手冊(cè)或使用手冊(cè)等資料。1.地址空間 2.存儲(chǔ)器格式 3.指令的預(yù)取和自修改代碼 4.存儲(chǔ)器映射的I/O 321.地址空間 ARM體系結(jié)構(gòu)使用單個(gè)平面的232個(gè)8位字節(jié)地址空間,對(duì)存儲(chǔ)器能支持的最大尋址空間為4G(232)。ARM體系統(tǒng)結(jié)構(gòu)將存儲(chǔ)器看成從0 x00000000地址開始的以字節(jié)為單位的線性組合。每個(gè)字?jǐn)?shù)據(jù)占4個(gè)字節(jié)單位,每個(gè)半字?jǐn)?shù)據(jù)占2個(gè)字節(jié)單位。字節(jié)地址按照無(wú)符號(hào)數(shù)排列,從0到232-1。 地址空間可以看作是包含230個(gè)32位字,地址以字為單位進(jìn)行分配,也就是將地址除以4。地址為A的字包含4個(gè)字節(jié),地址分別為A、A+1、A+2和A+3。 在ARM體系結(jié)構(gòu)v4及以

24、上版本中,地址空間還可被看包含231個(gè)16位半字。地址按照半字進(jìn)行分配。地址為A的半字包含2個(gè)字節(jié),地址分別為A和A+1。332.存儲(chǔ)器格式 地址空間的規(guī)則要求地址A: 位于地址A的字包含的字節(jié)位于地址A、A+1、A+2和A+3。 位于地址A的半字包含的字節(jié)位于地址A、A+1。 位于地址A+2的半字包含的字節(jié)位于地址A+2和A+3。 位于地址A的字包含的字節(jié)位于地址A和A+3。34小端格式(little-ednian) 在小端格式中,一個(gè)字當(dāng)中最低地址的字節(jié)被看作是最低位字節(jié),最高地址的字節(jié)被看作是最高位字節(jié)。因此,存儲(chǔ)器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線,如圖12-6所示。圖12-6 字內(nèi)字節(jié)的小端地址

25、35大端格式(big-endian) 在大端格式中,ARM處理器將最高位字節(jié)保存在最低地址字節(jié),將最低位字節(jié)保存在最高地址字節(jié)。因此,存儲(chǔ)器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線3124,如圖12-7所示。圖12-7 字內(nèi)字節(jié)的大端地址36 一個(gè)具體的的基于ARM的芯片可能只支持小端存儲(chǔ)器系統(tǒng),也可能只支持大端存儲(chǔ)器系統(tǒng),還可能兩者都支持,但默認(rèn)格式通常為小端格式。 ARM指令集不包含任何直接選擇大、小端的指令。但是,一個(gè)同時(shí)支持大、小端的基于ARM的芯片,可以在硬件上配置(一般使用芯片的引腳來(lái)配置)來(lái)匹配存儲(chǔ)器系統(tǒng)所使用的規(guī)則。如果芯片有一個(gè)標(biāo)準(zhǔn)系統(tǒng)控制協(xié)處理器,則系統(tǒng)控制協(xié)處理器的寄存器1的Bit7可用于

26、改變配置輸入。37 如果一個(gè)基于ARM的芯片將存儲(chǔ)系統(tǒng)配置為其中一種存儲(chǔ)器格式(如小端),而實(shí)際連接的存儲(chǔ)器系統(tǒng)配置為相反的格式(如大端),那么只有以字為單位的指令取指、數(shù)據(jù)加載和數(shù)據(jù)存儲(chǔ)能夠可靠實(shí)現(xiàn)。勘察的存儲(chǔ)器訪問(wèn)將出現(xiàn)不可預(yù)測(cè)的結(jié)果。 當(dāng)標(biāo)準(zhǔn)系統(tǒng)控制協(xié)處理器連接到支持大、小端的ARM處理器時(shí),協(xié)處理器寄存器1的Bit7在復(fù)位時(shí)清零。這表示ARM處理器在復(fù)位后立即配置為小端存儲(chǔ)器系統(tǒng)。如果它連接到一個(gè)大端存儲(chǔ)器系統(tǒng),那么復(fù)位處理程序要盡早做的事情之一就是切換到大端存儲(chǔ)器系統(tǒng),并必須在任何可能的字節(jié)或半字?jǐn)?shù)據(jù)訪問(wèn)發(fā)生或Thumb指令執(zhí)行之前執(zhí)行。383.指令的預(yù)取和自修改代碼 許多ARM處理

27、器實(shí)現(xiàn)在前一條指令的執(zhí)行尚未完成時(shí)將指令從存儲(chǔ)器取出。這個(gè)動(dòng)作稱為指令的預(yù)取。指令的預(yù)取并不是實(shí)際執(zhí)行指令。 如有下面兩種典型的情況時(shí),指令就可不被執(zhí)行: 當(dāng)異常發(fā)生時(shí),當(dāng)前指令執(zhí)行完畢,所有預(yù)取的指令都被丟棄,指令的執(zhí)行從異常向量開始。 當(dāng)發(fā)生跳轉(zhuǎn)時(shí),預(yù)取的在分支指令后的指令將被丟棄。 ARM處理器可以自由選擇預(yù)取的指令比當(dāng)前執(zhí)行點(diǎn)提前多少(即半導(dǎo)體廠商在設(shè)計(jì)具體的芯片時(shí)可以自由選擇預(yù)取的指令比當(dāng)前執(zhí)行點(diǎn)提前多少),甚至可以動(dòng)態(tài)改變預(yù)取指令的數(shù)目。最初的ARM處理器實(shí)現(xiàn)在當(dāng)前執(zhí)行的指令之前預(yù)取兩條指令,不過(guò)現(xiàn)在可以選擇多于或少于兩條指令。39 注意:當(dāng)指令讀取PC時(shí),它得到的指令地址比它自身

28、地址落后了兩條地址:對(duì)于ARM指令,得到的地址是它自身地址+8;對(duì)于Thumb指令,得到的地址是它自身地址+4。 最初的ARM處理器實(shí)現(xiàn)在PC讀取的兩指令偏移量和兩指令預(yù)取之間存在關(guān)聯(lián)。但這一關(guān)聯(lián)不是結(jié)構(gòu)上的。一個(gè)預(yù)取不同數(shù)目指令的ARM處理器實(shí)現(xiàn)仍能保證讀取PC所得的地址比它自身地址落后兩條指令。 同自由選擇多少條預(yù)取指令一樣,ARM處理器實(shí)現(xiàn)可選擇沿著哪條可能的執(zhí)行路徑進(jìn)行預(yù)取指。例如,在一條分支指令之后,它可選擇預(yù)取分支指令之后的指令或者是轉(zhuǎn)移目標(biāo)地址的指令。這稱為“轉(zhuǎn)移預(yù)測(cè)”。40自修改代碼 所有形式的指令預(yù)取都有一個(gè)潛在的問(wèn)題,即存儲(chǔ)器中的指令可能在它被預(yù)取之后,被執(zhí)行之前發(fā)生改變。

29、如果發(fā)生這種情況,對(duì)存儲(chǔ)器中的指令進(jìn)行修改通常并不妨礙已取指的指令備份執(zhí)行完畢。41 例如:在下面的代碼序列中,STR指令使用ADD指令的備份取代了它后面的SUB指令: LDR r0, AddInstr STR r0, NextInstr NextInstr SUB r1, r1, #1 AddInstr ADD r1, r1, #1 當(dāng)代碼第一次執(zhí)行時(shí),STR指令之后執(zhí)行的指令通常是SUB指令,因?yàn)镾UB指令在存儲(chǔ)器中的指令發(fā)生改變之前已經(jīng)被預(yù)取了,ADD指令不會(huì)被執(zhí)行,除非第二次執(zhí)行該代碼序列。42ARM處理器不能保證上面所述的方式執(zhí)行,因此: 當(dāng)代碼第一次執(zhí)行時(shí),在STR指令之后有可能立

30、即產(chǎn)生一個(gè)中斷。如果這樣,已經(jīng)預(yù)取的SUB指令將被丟棄。當(dāng)中斷處理程序返回時(shí),位于NextInstr處的指令被再次預(yù)取,而這次則執(zhí)行ADD指令。因此,雖然SUB指令通常最有可能被執(zhí)行,但也有可能執(zhí)行ADD指令。 如果指令被再次執(zhí)行,ARM處理器或存儲(chǔ)器系統(tǒng)允許預(yù)取指令的備份,并使用這些備份而不是重新預(yù)取。如果發(fā)生這種情況,在代碼序列按照第二及以下可能執(zhí)行時(shí),SUB指令可能被執(zhí)行。發(fā)生這種情況的主要原因是存儲(chǔ)器系統(tǒng)包含獨(dú)立的指令和數(shù)據(jù)緩存。但是,也存在其它可能性。例如,一些分支預(yù)測(cè)的硬件保存了分支后的指令。 總之,應(yīng)當(dāng)盡可能避免使用涉及自修改代碼的編程技術(shù)。然而在許多系統(tǒng)中,幾乎不可能完全避免自

31、修改代碼的使用。例如,任何一個(gè)允許將程序裝入存儲(chǔ)器然后執(zhí)行的系統(tǒng)都使用自修改代碼。43指令存儲(chǔ)器屏障(IMB) 每個(gè)ARM處理器實(shí)現(xiàn)都定義了一系列的操作,使自修改代碼序列可以可靠地執(zhí)行。這一串代碼稱為指令存儲(chǔ)器屏障(IMB),它通常同時(shí)取決于ARM處理器的實(shí)現(xiàn)和存儲(chǔ)器系統(tǒng)的實(shí)現(xiàn)。 IMB序列必須在新的指令已經(jīng)保存到存儲(chǔ)器之后而尚未執(zhí)行時(shí)執(zhí)行。例如,在程序被加載之后并且在轉(zhuǎn)移到它的入口之前。任何不以這種方式使用IMB的自修改代碼序列都可能會(huì)執(zhí)行不確定的動(dòng)作。 根據(jù)IMB所執(zhí)行的確定的操作順序取決于ARM處理器和存儲(chǔ)器的實(shí)現(xiàn),建議在軟件設(shè)計(jì)時(shí)使IMB序列作為一個(gè)調(diào)用程序來(lái)替換與系統(tǒng)相關(guān)的模塊,而不

32、是直接插入到需要的地方。這樣易于移植到其它ARM處理器和存儲(chǔ)器系統(tǒng)。44 另外,在許多實(shí)現(xiàn)當(dāng)中,IMB序列包含了只能在特權(quán)模式下使用的操作,例如,標(biāo)準(zhǔn)系統(tǒng)控制協(xié)處理器提供的緩存清零和無(wú)效操作。為了允許用戶模式程序使用IMB序列,推薦將其作為一個(gè)操作系統(tǒng)調(diào)用程序,由SWI指令調(diào)用。在SWI指令使用24位立即數(shù)的系統(tǒng)中指定所要求的系統(tǒng)服務(wù),通過(guò)下面的指令即可請(qǐng)求IMB序列:SWI 0 xF00000這是一個(gè)無(wú)參數(shù)調(diào)用,不返回結(jié)果,應(yīng)當(dāng)使用與帶原型的C函數(shù)調(diào)用相同的調(diào)用約定: void IMB(void);區(qū)別在于使用SWI指令而不是BL指令調(diào)用。45 有些實(shí)現(xiàn)可對(duì)已保存的新指令使用地址范圍的知識(shí)來(lái)

33、減少IMB執(zhí)行的時(shí)間。因此,還可執(zhí)行另外一個(gè)操作系統(tǒng)調(diào)用程序。該調(diào)用程序只根據(jù)指定的地址范圍執(zhí)行IMB。在SWI指令使用24位立即數(shù)的系統(tǒng)中指定所要求的系統(tǒng)服務(wù),通過(guò)下面的指令來(lái)請(qǐng)求: SWI 0 xF00001應(yīng)當(dāng)使用與帶原型的C函數(shù)調(diào)用相似的調(diào)用約定:void IMBRange(unsigned long start_addr, unsigned long end_addr) ;此處地址范圍從start_addr(包含)到end_addr(不包含)。46注意: 當(dāng)使用標(biāo)準(zhǔn)的ARM過(guò)程調(diào)用標(biāo)準(zhǔn)時(shí),start_addr在R0中傳遞,而edd_addr則在R1中傳遞。 對(duì)于某些ARM處理器實(shí)現(xiàn)來(lái)

34、說(shuō),即使使用小地址范圍,IMB執(zhí)行的時(shí)間也可能非常長(zhǎng)(數(shù)千個(gè)時(shí)鐘周期)。對(duì)于自修改代碼的小規(guī)模使用,這樣很可能受到較大損失。因此,建議自修改代碼只用于不可避免或有足夠的執(zhí)行時(shí)間的情況。474.存儲(chǔ)器映射的I/O 執(zhí)行ARM體系統(tǒng)結(jié)構(gòu)I/O功能的標(biāo)準(zhǔn)是使用存儲(chǔ)器映射的I/O。加載或存儲(chǔ)I/O值時(shí),使用提供給I/O功能的特殊存儲(chǔ)器地址。通常,從存儲(chǔ)器映射的I/O地址加載用于輸入,而存儲(chǔ)到存儲(chǔ)器映射的I/O地址則用于輸出。加載和存儲(chǔ)都可用于執(zhí)行控制功能,用于取代它們正常的輸入或輸出功能。 存儲(chǔ)器映射的I/O位置的動(dòng)作通常不同于正常的存儲(chǔ)器位置的動(dòng)作。例如,正常存儲(chǔ)器位置的兩次連續(xù)加載,每次都會(huì)返回相

35、同的值,除非中間插入了保存的操作。對(duì)于存儲(chǔ)器映射的I/O位置,第二次加載返回的值可以不同于第一次返回的值。因?yàn)榈谝淮渭虞d的副作用(例如從緩沖區(qū)移走已加載的值)或是因?yàn)椴迦肓硪粋€(gè)存儲(chǔ)器映射I/O位置的加載和存儲(chǔ)的副作用。48(1)從存儲(chǔ)器映射的I/O取指 在前面章節(jié)中講到,不同ARM處理器的實(shí)現(xiàn)(可以理解為不同的芯片)在存儲(chǔ)器取指時(shí)會(huì)有相當(dāng)大的區(qū)別。因此,建議存儲(chǔ)器映射的I/O位置只用于數(shù)據(jù)的加載和存儲(chǔ),而不用于取指。任何依賴于從存儲(chǔ)器映射I/O位置取指的系統(tǒng)設(shè)計(jì)都可能難于移植到將來(lái)的ARM實(shí)現(xiàn)。49(2)對(duì)存儲(chǔ)器映射I/O的數(shù)據(jù)訪問(wèn) 一個(gè)指令序列在執(zhí)行時(shí),會(huì)在不同的點(diǎn)訪問(wèn)數(shù)據(jù)存儲(chǔ)器,產(chǎn)生加載和

36、存儲(chǔ)訪問(wèn)的時(shí)序。如果這些加載和存儲(chǔ)訪問(wèn)的是正常的存儲(chǔ)器位置,那么它們?cè)谠L問(wèn)相同的存儲(chǔ)器位置時(shí)只是執(zhí)行交互操作。結(jié)果,對(duì)不同存儲(chǔ)器位置的加載和存儲(chǔ)可以按照不同于指令的順序執(zhí)行,但不會(huì)改變最終的結(jié)果。這種改變存儲(chǔ)器訪問(wèn)順序的自由可被存儲(chǔ)器系統(tǒng)用來(lái)提高性能(例如,通過(guò)使用高速緩存和寫緩沖器)。50對(duì)同一存儲(chǔ)器位置的訪問(wèn)還擁有其它可用于提升性能的特性從相同的位置連續(xù)加載(沒(méi)有產(chǎn)生存儲(chǔ))產(chǎn)生相同的結(jié)果。從一個(gè)位置執(zhí)行多加載操作,將返回最后保存到該位置的值。對(duì)某個(gè)數(shù)據(jù)規(guī)格的多次訪問(wèn),有時(shí)可合并成單個(gè)的更大規(guī)模的訪問(wèn)。例如,分別存儲(chǔ)一個(gè)字所包含的兩個(gè)半字可合并成存儲(chǔ)單個(gè)字。51訪問(wèn)存儲(chǔ)器映射的I/O位置時(shí)不

37、能進(jìn)行優(yōu)化,它們的時(shí)間順序絕對(duì)不能改變 如果存儲(chǔ)器字、半字或字節(jié)訪問(wèn)的對(duì)象是存儲(chǔ)器映射的I/O位置,那么一次訪問(wèn)會(huì)產(chǎn)生副作用,使后續(xù)訪問(wèn)改變成一個(gè)不同的地址。如果是這樣,那么不同時(shí)間順序的訪問(wèn)將會(huì)使代碼序列產(chǎn)生不同的最終結(jié)果。因此,當(dāng)訪問(wèn)存儲(chǔ)器映射的I/O位置時(shí)不能進(jìn)行優(yōu)化,它們的時(shí)間順序絕對(duì)不能改變。52存儲(chǔ)器訪問(wèn)的數(shù)據(jù)規(guī)格都不會(huì)改變 對(duì)于存儲(chǔ)器映射的I/O,另外還有很重要的一點(diǎn),那就是每次存儲(chǔ)器訪問(wèn)的數(shù)據(jù)規(guī)格都不會(huì)改變。例如,在訪問(wèn)存儲(chǔ)器映射的I/O時(shí),一個(gè)指定從4個(gè)連續(xù)字節(jié)地址讀出數(shù)據(jù)的代碼序列決不能合并成單個(gè)字的讀取,否則會(huì)使代碼序列的最終執(zhí)行結(jié)果不同于期望的結(jié)果。相似地,將字的訪問(wèn)分

38、解成多個(gè)字節(jié)的訪問(wèn)可能會(huì)導(dǎo)致存儲(chǔ)器映射I/O設(shè)備無(wú)法按照預(yù)期進(jìn)行操作。53訪問(wèn)存儲(chǔ)器映射的I/O時(shí)的要求限制存儲(chǔ)器映射I/O位置的存儲(chǔ)器屬性。例如,在標(biāo)準(zhǔn)存儲(chǔ)器系統(tǒng)結(jié)構(gòu)中,存儲(chǔ)器位置必須是無(wú)高速緩存和無(wú)緩沖區(qū)的。限制訪問(wèn)存儲(chǔ)器映射I/O位置的規(guī)格或?qū)R方式。例如,如果一個(gè)ARM實(shí)現(xiàn)帶有16位外部數(shù)據(jù)總線,它可以禁止對(duì)存儲(chǔ)器映射I/O使用32位訪問(wèn),因?yàn)?2位訪問(wèn)無(wú)法在單個(gè)總線周期內(nèi)執(zhí)行。要求額外的外部硬件。例如,帶16位外部數(shù)據(jù)總線的ARM實(shí)現(xiàn)可以允許對(duì)存儲(chǔ)器映射的I/O使用32位訪問(wèn),但要求外部硬件將兩個(gè)16位總線訪問(wèn)合并成對(duì)I/O設(shè)備的單個(gè)32位訪問(wèn)。54如果數(shù)據(jù)存儲(chǔ)器訪問(wèn)序列包含一些符合

39、要求的訪問(wèn)和一些不符合要求的訪問(wèn),那么: 對(duì)于符合要求的訪問(wèn),其數(shù)據(jù)規(guī)格和數(shù)目都被保護(hù),沒(méi)有互相合并或沒(méi)有與不符合要示的訪問(wèn)以任何方式合并。不符合要求的訪問(wèn)可以互相合并。 符合要求的訪問(wèn)彼此的時(shí)間的順序被保護(hù),但它們相以于那些不符合要求的訪問(wèn)的時(shí)間順序不能保證。5512.2.6 異常只要正常的程序流被暫時(shí)中止,處理器就進(jìn)入異常模式。當(dāng)發(fā)生異常時(shí),處理器在處理異常之前,必須先保存當(dāng)前的狀態(tài)。當(dāng)異常處理完成后,需要將處理器的狀態(tài)恢復(fù)到處理異常之前,之后當(dāng)前程序方可繼續(xù)執(zhí)行。ARM處理器允許多個(gè)異常同時(shí)發(fā)生,它們將會(huì)按固定的優(yōu)先級(jí)進(jìn)行處理。本小節(jié)內(nèi)容:1.ARM支持的異常類型2. 異常優(yōu)化級(jí)與異常嵌

40、套3.異常向量4.異常響應(yīng)和返回過(guò)程5.中斷延遲6.復(fù)位561.ARM支持的異常類型ARM體系結(jié)構(gòu)支持的異常類型有7種,如表12-5所示, 分為如下3類: 指令執(zhí)行引起的直接異常 軟件中斷、未定義指令和指令預(yù)取 中止都屬于這一類; 指令執(zhí)行引起的間接中斷 數(shù)據(jù)中止屬于這一類; 外部產(chǎn)生的與指令流無(wú)關(guān)的異常 復(fù)位、IRQ和FIQ屬于這一類。57表12-5 ARM體系結(jié)構(gòu)支持的異常類型異常類型具體功能復(fù)位(Reset)復(fù)位電平有效時(shí),產(chǎn)生復(fù)位異常,ARM處理器立刻停止執(zhí)行當(dāng)前指令,程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行指令未定義指令(Undefined)當(dāng)ARM處理器或協(xié)處理器遇到不能處理的指令時(shí),產(chǎn)生

41、未定義指令異常??墒褂迷摦惓C(jī)制進(jìn)行軟件仿真擴(kuò)展ARM或Thumb指令集軟件中斷(SWI)該異常由執(zhí)行SWI指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作??墒褂迷摦惓C(jī)制實(shí)現(xiàn)系統(tǒng)功能調(diào)用,用于請(qǐng)求特定的管理功能指令預(yù)取中止(Prefetch Abort)當(dāng)處理器預(yù)取指令的地址不存在或該地址不允許當(dāng)前指令訪問(wèn)時(shí),存儲(chǔ)器會(huì)向處理器發(fā)出中止信號(hào),但當(dāng)預(yù)取的指令被執(zhí)行時(shí),才會(huì)產(chǎn)生指令預(yù)取中止異常。當(dāng)預(yù)取指令未被執(zhí)行,如指令流水線中發(fā)生了跳轉(zhuǎn),則預(yù)取指令異常不會(huì)發(fā)生數(shù)據(jù)中止(Data Abort)當(dāng)處理器數(shù)據(jù)訪問(wèn)指令的地址不存在或該地址不當(dāng)前指令訪問(wèn),則會(huì)產(chǎn)生數(shù)據(jù)中止異常。發(fā)生數(shù)據(jù)中止時(shí),系統(tǒng)的響應(yīng)與指

42、令的類型有關(guān)外部中斷請(qǐng)求(IRQ)當(dāng)處理器的外部中斷請(qǐng)求引腳nIRQ有效時(shí),且CPSR中的1位為0時(shí),產(chǎn)生IRQ異常。系統(tǒng)的外設(shè)可通過(guò)該異常請(qǐng)求中斷服務(wù)快速中斷請(qǐng)求(FIQ)當(dāng)處理器的快速中斷請(qǐng)求引腳nFIQ有效時(shí),且CPSR中的F位為0時(shí),產(chǎn)生FIQ異常。FIQ異常是為了支持?jǐn)?shù)據(jù)傳輸或者通道處理而設(shè)計(jì)的58當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí),系統(tǒng)根據(jù)固定的優(yōu)化級(jí)處理異常的處理次序。異常優(yōu)先級(jí)按下列順序排列了優(yōu)先權(quán),復(fù)位優(yōu)先級(jí)最高,未定義指令和SWI優(yōu)先級(jí)最低。2. 異常優(yōu)化級(jí)與異常嵌套59(1)復(fù)位從確定的狀態(tài)啟動(dòng)處理器,使得所有其他未解決的異常都和當(dāng)前處理器運(yùn)行的狀態(tài)不再有關(guān),因此具有最高優(yōu)先級(jí)。(2)

43、未定義指令和SWI都依靠指令的特殊譯碼產(chǎn)生,由于兩者是互斥的指令編碼,因此不能同時(shí)發(fā)生。60(3)中斷優(yōu)先級(jí)判決最復(fù)雜的情況是FIQ、IRQ和第三個(gè)非復(fù)位的異常同時(shí)發(fā)生時(shí): 由于FIQ比IRQ優(yōu)先級(jí)高并將IRQ屏蔽,所以IRQ被忽略,直到FIQ處理程序明確地將IRQ使用或返回到用戶代碼為止; 如果第三個(gè)異常是數(shù)據(jù)中止,那是因?yàn)檫M(jìn)入數(shù)據(jù)中止異常并未將FIQ屏蔽,所以處理器將在進(jìn)入數(shù)據(jù)中止處理程序后立即進(jìn)入FIQ處理程序。數(shù)據(jù)中止將在FIQ處理程序返回時(shí)對(duì)其進(jìn)行處理; 如果第三個(gè)異常不是數(shù)據(jù)中止,將立即進(jìn)入FIQ處理程序。當(dāng)FIQ和IRQ兩者都完成時(shí),程序?qū)⒎祷氐疆a(chǎn)生第三個(gè)異常的指令,在余下所有的

44、情況下異常將重現(xiàn)并進(jìn)行相應(yīng)的處理。613.異常向量異常向量異常向量異常類型異常類型進(jìn)入模式進(jìn)入模式0 x00000000復(fù)位管理模式0 x00000004未定義指令未定義模式0 x00000008軟件中斷管理模式0 x0000000C指令預(yù)取中止中止模式0 x00000010數(shù)據(jù)中止中止模式0 x00000014保留保留0 x00000018IRQIRQ0 x0000001CFIQFIQ表12-6 ARM異常向量62一般來(lái)說(shuō),在異常向量處將包含一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到異常處理程序。但由于 FIQ占據(jù)最高向量地址,它可以立即執(zhí)行。當(dāng)ARM處理器發(fā)生異常時(shí),程序計(jì)數(shù)器PC被強(qiáng)制設(shè)置為對(duì)應(yīng)的異常向量,從

45、而轉(zhuǎn)到異常處理程序,當(dāng)異常處理程序完成后,返回到主程序繼續(xù)執(zhí)行。63異常發(fā)生后,除了復(fù)位異常立即中止當(dāng)前指令之外,其余異常都是在處理器完成當(dāng)前指令后再執(zhí)行異常處理程序。ARM處理器對(duì)異常中斷的響應(yīng)過(guò)程如下所述:1) 保存處理器當(dāng)前狀態(tài)、中斷屏蔽位以及條件標(biāo)志位。這是通過(guò)將當(dāng)前程序狀態(tài)寄存器CPSR的內(nèi)容保存到將要執(zhí)行的異常中斷對(duì)應(yīng)的SPSR寄存器中實(shí)現(xiàn)的;2) 設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中相應(yīng)的位。包括:設(shè)置CPSR中的位,使處理器進(jìn)入相應(yīng)的模式;設(shè)置CPSR中的位,禁止IRQ中斷,當(dāng)進(jìn)入FIQ模式時(shí),禁止FIQ中斷;3) 將寄存器LR_mode設(shè)置成返回地址;4.異常響應(yīng)和返回過(guò)程644

46、) 將程序計(jì)數(shù)器值(PC)設(shè)置成該異常中斷的異常向量地址,從而跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。 異常處理完成后必須返回到原來(lái)程序處繼續(xù)執(zhí)行,為達(dá)到這一目的,需要執(zhí)行四個(gè)基本操作: 恢復(fù)原來(lái)被保護(hù)的用戶寄存器; 恢復(fù)被中斷的程序的處理器狀態(tài),即將SPSR_mode寄存器內(nèi)容復(fù)制到CPSR中; 返回到發(fā)生異常中斷的指令的下一條指令處執(zhí)行,即將LR_mode寄存器的內(nèi)容復(fù)制到程序計(jì)數(shù)器PC中; 清除CPSR中的中斷禁止標(biāo)志I和F,開放外部中斷和快速中斷。65 (1)最大中斷延遲 當(dāng)FIQ使能時(shí),最壞情況下FIQ的延遲時(shí)間包含:1)Tsynemax(請(qǐng)求通過(guò)同步器的最長(zhǎng)時(shí)間)。Tsynemax為4

47、個(gè)處理器周期(由內(nèi)核決定); 2)Tldm(最長(zhǎng)指令的完成時(shí)間)。最長(zhǎng)的指令是加載包括PC在內(nèi)所有寄存器的LDM指令。Tldm在零等待狀態(tài)系統(tǒng)中的執(zhí)行時(shí)間為20個(gè)處理器周期; 3)Texc(數(shù)據(jù)中止異常進(jìn)入時(shí)間)。Texc為3個(gè)處理器周期; 4)Tfiq(FIQ進(jìn)入時(shí)間)。Tfiq為2個(gè)處理器周期(由內(nèi)核決定)。5.中斷延遲66總的延遲時(shí)間是29個(gè)處理器周期,在系統(tǒng)使用40MHz處理器時(shí)鐘時(shí),略微超過(guò)0.7ms。當(dāng)在時(shí)間結(jié)束后,處理器執(zhí)行在0 x1C處的指令。 (2)最小中斷延遲FIQ或IRQ的最小中斷延遲是請(qǐng)求通過(guò)同步器的時(shí)間加上Tfiq (共6個(gè)處理器周期)。67當(dāng)nRESET信號(hào)被拉低時(shí)

48、(一般外部復(fù)位引腳電平的變化和芯片的其它復(fù)位源會(huì)改變這個(gè)內(nèi)核信號(hào)),內(nèi)核中止正在執(zhí)行的指令,并且地址總線繼續(xù)增加。 當(dāng)nRESET信號(hào)再次變?yōu)楦唠娖綍r(shí),ARM處理器執(zhí)行下列操作: 1) 強(qiáng)制M4:0變?yōu)閎10011(管理模式); 2) 置位CPSR中的I和F位; 3) 清零CPSR中的T位; 4) 強(qiáng)制PC從地址0 x00開始對(duì)下一條指令進(jìn)行取指; 5) 返回到ARM狀態(tài)并恢復(fù)執(zhí)行。 在復(fù)位后,除PC和CPSR之外的所有寄存器的值都不確定。6.復(fù)位68ARM處理器是基于精簡(jiǎn)指令集計(jì)算機(jī)(RISC)原理設(shè)計(jì)的,指令集和相關(guān)譯碼機(jī)制較為簡(jiǎn)單。ARM體系結(jié)構(gòu)具有32位ARM指令集和16位Thumb指

49、令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數(shù)性能上的優(yōu)勢(shì),它是ARM指令集的子集。所有的ARM指令都是可以有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。ARM程序和Thumb程序可相互調(diào)用,相互之間狀態(tài)切換開銷幾乎為零。12.3 ARM編程指令69 尋址方式是根據(jù)指令中給出的地址碼字段來(lái)實(shí)現(xiàn)尋找真實(shí)操作地址的方式。ARM處理器有8種基本尋址方式。 1) 寄存器尋址; 2) 立即尋址; 3) 寄存器移位尋址; 4) 寄存器間接尋址; 5) 基址尋址; 6) 多寄存器直接尋址; 7) 堆棧尋址; 8) 相對(duì)尋址。12.3.1

50、 ARM處理器尋址方式701. 32位ARM指令集(1)分支指令;(2)數(shù)據(jù)處理指令;(3)加載和存儲(chǔ)指令;(4)協(xié)處理指令;(5)雜項(xiàng)指令12.3.2 指令集 ARM指令集提供了兩條產(chǎn)生異常的指令,通過(guò)這兩條指令可以用軟件的方法實(shí)現(xiàn)異常。 軟件中斷指令(SWI); 斷點(diǎn)中斷指令(BKPT)。2. 16位Thumb指令集71(1)分支指令 分支指令又稱轉(zhuǎn)移指令,用于實(shí)現(xiàn)程序流程的轉(zhuǎn)移,這類指令可用來(lái)改變程序的執(zhí)行流程或調(diào)用子程序。在ARM程序中可使用專門的分支指令,也可以通過(guò)直接向程序計(jì)數(shù)器(PC)寫入轉(zhuǎn)移地址值的方法實(shí)現(xiàn)程序流程的轉(zhuǎn)移。 通過(guò)向程序計(jì)數(shù)器(PC)寫入轉(zhuǎn)移地址值,便可以在4GB

51、的地址空間中任意轉(zhuǎn)移;若在轉(zhuǎn)移之前結(jié)合使用ARM的MOV LR, PC等指令,則可保存將來(lái)的返回地址值,從而實(shí)現(xiàn)在4GB地址空間中的子程序調(diào)用。72 分支指令除了允許數(shù)據(jù)處理或加載指令通過(guò)PC來(lái)改變控制流以外,還提供了一個(gè)24位的符號(hào)偏移,可實(shí)現(xiàn)最大32MB向前或向生的地址空間轉(zhuǎn)移。 轉(zhuǎn)移和鏈接(BL)選項(xiàng)在跳轉(zhuǎn)后將指令地址保存在R14(LR)當(dāng)中。這樣通過(guò)將LR復(fù)制得到PC可實(shí)現(xiàn)子程序的返回。另外,有的分支指令可在指令集之間進(jìn)行切換。此時(shí),分支指令執(zhí)行完成后,處理器繼續(xù)執(zhí)行Thumb指令集的指令。這樣就允許ARM代碼調(diào)用Thumb子程序,而ARM子程序也可返回到Thumb調(diào)用程序。Thumb

52、指令集中相似的指令可實(shí)現(xiàn)對(duì)應(yīng)的Thumb ARM的切換。73(2)數(shù)據(jù)處理指令 數(shù)據(jù)處理指令分為數(shù)據(jù)傳送指令、算術(shù)/邏輯運(yùn)算指令、比較指令、乘法指令等幾種類型。數(shù)據(jù)傳送指令用于寄存器之間進(jìn)行數(shù)據(jù)的傳輸。算術(shù)運(yùn)算指令完成基本的加、減運(yùn)算。邏輯運(yùn)算指令完成常用的邏輯運(yùn)算,算術(shù)/邏輯運(yùn)算指令要將運(yùn)算結(jié)果保存在目的寄存器中,并且需要更新CPSR中的標(biāo)志位。比較指令不保存運(yùn)算結(jié)果,只更新CPSR中的標(biāo)志。數(shù)據(jù)傳送指令 算術(shù)/邏輯運(yùn)算指令比較指令 乘法指令74數(shù)據(jù)傳送指令 主要用于將一個(gè)寄存器中的數(shù)據(jù)傳送到另一個(gè)寄存器中,或者將一個(gè)立即數(shù)傳送到寄存器中,這類指令通常用來(lái)對(duì)寄存器初始化。數(shù)據(jù)傳送指令包括數(shù)據(jù)

53、直接傳送指令和數(shù)據(jù)取反傳送指令。75算術(shù)/邏輯運(yùn)算指令 算術(shù)/邏輯運(yùn)算指令一共有12條,它們使用相同的指令格式。它們最多使用兩個(gè)源操作數(shù)來(lái)執(zhí)行算術(shù)或邏輯操作,并將結(jié)果寫入目標(biāo)寄存器。也選擇根據(jù)結(jié)果更新條件代碼標(biāo)志。兩個(gè)源操作數(shù)中,其中一個(gè)一定是寄存器,另一個(gè)有兩種基本形式:立即數(shù)或是寄存器,可選擇移位。如果操作數(shù)是一個(gè)移位寄存器,移位計(jì)數(shù)可以是一個(gè)立即數(shù)或另一個(gè)寄存器的值。可以指定4種移位的類型。每一條算術(shù)/邏輯運(yùn)算指令都可以執(zhí)行算術(shù)/邏輯和移位操作。這樣就可輕松實(shí)現(xiàn)各種不同的分支指令。76比較指令 比較指令通常用于將一個(gè)寄存器與一個(gè)32位的值進(jìn)行減法運(yùn)算,根據(jù)結(jié)果更新CPSR中的標(biāo)志位。對(duì)于

54、比較指令,不需要使用S后綴即可改變標(biāo)志位的值。需要注意的是,其運(yùn)算結(jié)果不保存,因而不影響其他寄存器的內(nèi)容。比較指令更新標(biāo)志位后,其他指令可能通過(guò)條件發(fā)送來(lái)改變程序的執(zhí)行順序。比較指令源操作數(shù)的格式與算術(shù)/邏輯指令相同,包括移位操作的功能。77乘法指令 乘法指令是將一對(duì)寄存器的內(nèi)容相乘,然后根據(jù)指令類型把結(jié)果累加到其他的寄存器。ARM處理器支持的乘法指令與乘加指令共有6條。根據(jù)運(yùn)算結(jié)果可分為32位運(yùn)算和64位運(yùn)算兩類。64位乘法又稱為長(zhǎng)整型乘法指令,由于結(jié)果太長(zhǎng),不能放在一個(gè)32位的寄存器中,所以把結(jié)果存放在兩個(gè)32位的寄存器Rdlo和Rdhi中。Rdlo存放低32位,Rdhi存放高32位。與前

55、述的數(shù)據(jù)處理指令不同,指令中的所有源操作數(shù)和目的寄存器都必須為通用寄存器,不能為立即數(shù)或被移位了的寄存器。同時(shí),目的寄存器Rd和操作數(shù)Rm必須是不同的寄存器。78(3)加載和存儲(chǔ)指令 ARM指令系統(tǒng)中的加載和存儲(chǔ)指令,用于在ARM寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ)指令則將寄存器中的數(shù)據(jù)傳送到存儲(chǔ)器中。處理器對(duì)存儲(chǔ)器的訪問(wèn)只能通過(guò)加載和存儲(chǔ)指令實(shí)現(xiàn)。 ARM指令系統(tǒng)中有3種加載和存儲(chǔ)指令:加載和存儲(chǔ)寄存器指令、加載和存儲(chǔ)多個(gè)寄存器指令和交換寄存器和存儲(chǔ)器指令。加載和存儲(chǔ)寄存器指令在ARM寄存器和存儲(chǔ)器之間提供靈活的單數(shù)據(jù)項(xiàng)傳送方式 。支持的數(shù)據(jù)項(xiàng)類型為字節(jié)

56、(8位)、半字(16位)和字(32位)。79加載和存儲(chǔ)寄存器指令 加載寄存器指令可將一個(gè)32位字、一個(gè)16位半字或一個(gè)8位字節(jié)從存儲(chǔ)器裝入寄存器。字節(jié)和半字在加載時(shí)自動(dòng)實(shí)現(xiàn)零擴(kuò)展和符號(hào)擴(kuò)展。存儲(chǔ)寄存器指令可以將一個(gè)32位字、一個(gè)16位半字或一個(gè)8位字節(jié)從寄存器保存到存儲(chǔ)器。加載和存儲(chǔ)寄存器指令有3種主要的尋址模式,這3種模式都使用指令指定的基址寄存器和偏移量:80 在偏移尋址模式中,將基址寄存器值加上或減去一個(gè)偏移量得到存儲(chǔ)器地址; 在前變址尋址模式中,存儲(chǔ)器地址的構(gòu)成方式與偏移尋址模式相同,但存儲(chǔ)器地址會(huì)回寫到基址寄存器; 在后變址尋址模式中,存儲(chǔ)器地址為基址寄存器的值。基址寄存器的值加上或

57、減去偏移量的結(jié)果寫入基址寄存器。 在每種情況下,偏移量都可以是一個(gè)立即數(shù)或是一個(gè)變址寄存器的值。基于寄存器的偏移量也可使用移位操作來(lái)調(diào)整。81加載和存儲(chǔ)多個(gè)寄存器指令 加載多個(gè)寄存器(LDM)和存儲(chǔ)多個(gè)寄存器(STM)指令可以對(duì)任意數(shù)目的通用寄存器執(zhí)行塊轉(zhuǎn)移。支持下列4種尋址模式:前遞增、后遞增、前遞減、后遞減。基地址由一個(gè)寄存器值指定,它在轉(zhuǎn)移后可選擇更新。由于子程序返回地址和PC值位于通用寄存器當(dāng)中,使用LDM和STM可構(gòu)成非常高效的子程序入口和出口: 子程序入口處的單個(gè)STM指令可將寄存器內(nèi)容和返回地址壓入堆棧,在處理中更新堆棧指針; 子程序出口處的單個(gè)LDM指令可將寄存器內(nèi)容從堆棧恢復(fù)

58、,將返回地址裝入PC并更新堆棧指針;82交換寄存器和存儲(chǔ)器指令 交換指令(SWP)執(zhí)行下列操作: 從寄存器指定的存儲(chǔ)器位置裝入一個(gè)值; 將寄存器內(nèi)容保存到同一個(gè)存儲(chǔ)器位置; 將步驟1裝入的值寫入一個(gè)寄存器。 如果步驟1和3指定同一個(gè)寄存器,那么存儲(chǔ)器和寄存器的內(nèi)容就實(shí)現(xiàn)了互換。交換指令執(zhí)行一個(gè)特殊的、不可分割的總線操作。該操作允許信號(hào)量的原子更新,并支持32位字和8位字節(jié)信號(hào)量。83(4)協(xié)處理器指令 數(shù)據(jù)處理指令。啟動(dòng)一個(gè)協(xié)處理器專用的內(nèi)部操作; 數(shù)據(jù)傳送指令。將數(shù)據(jù)在協(xié)處理器和存儲(chǔ)器之間進(jìn)行傳送。傳送的地址由ARM處理器計(jì)算; 寄存器傳送指令。允許協(xié)處理器傳送到ARM寄存器,或?qū)RM寄存

59、器值傳送到協(xié)處理器。84(5)雜項(xiàng)指令 包括狀態(tài)寄存器分支指令和異常產(chǎn)生指令。 狀態(tài)寄存器分支指令將CPSR或SPSR的內(nèi)容轉(zhuǎn)移到一個(gè)通用寄存器,或者反過(guò)來(lái)將通用寄存器的內(nèi)容寫入CPSR或SPSR寄存器。寫CPSR會(huì): 設(shè)定條件代碼標(biāo)志的值; 設(shè)定中斷使能位的值; 設(shè)定處理器模式85產(chǎn)生異常的指令軟件中斷指令(SWI)。SWI指令導(dǎo)致產(chǎn)生軟件中斷異常,它通常用于向操作系統(tǒng)請(qǐng)求調(diào)用OS定義的服務(wù)。SWI指令導(dǎo)致處理器進(jìn)入管理模式(特權(quán)模式)。這樣一個(gè)非特權(quán)任務(wù)就能對(duì)特權(quán)的功能進(jìn)行訪問(wèn),但是只能以O(shè)S所允許的方式訪問(wèn)。斷點(diǎn)中斷指令(BKPT)。BKPT指令產(chǎn)生軟件斷點(diǎn)中斷,用于調(diào)試程序。862.

60、16位Thumb指令集分支指令數(shù)據(jù)處理指令 加載和存儲(chǔ)指令 異常產(chǎn)生指令 Thumb在32位結(jié)構(gòu)上實(shí)現(xiàn)了16位的指令集,這樣可提供比16位結(jié)構(gòu)更高的性能和比32位結(jié)構(gòu)更高的代碼密度。Thumb指令集不是一個(gè)完整的指令集,它僅僅是最通用的ARM指令的子集,不能期望處理器只執(zhí)行Thumb指令而不支持ARM指令。Thumb指令長(zhǎng)度為16位,每條指令都對(duì)應(yīng)一條32位ARM指令。87分支指令與ARM分支指令不同,Thumb分支指令B、BX和BL中的偏移域沒(méi)有固定的位數(shù);不過(guò)讀者不必關(guān)心它,匯編程序會(huì)自動(dòng)處理。其中指令B是Thumb指令中惟一條件執(zhí)行的指令。轉(zhuǎn)移和連接(BL)選項(xiàng)在跳轉(zhuǎn)后將指令地址保存在R

溫馨提示

  • 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)論