ARM7體系結(jié)構(gòu)概述課件_第1頁
ARM7體系結(jié)構(gòu)概述課件_第2頁
ARM7體系結(jié)構(gòu)概述課件_第3頁
ARM7體系結(jié)構(gòu)概述課件_第4頁
ARM7體系結(jié)構(gòu)概述課件_第5頁
已閱讀5頁,還剩181頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2.1ARM簡介ARM體系結(jié)構(gòu)ARM處理器為RISC芯片,其簡單的結(jié)構(gòu)使ARM內(nèi)核非常小,這使得器件的功耗也非常低。它具有經(jīng)典RISC的特點:寄存器:具有更多的通用寄存器;裝載/保存結(jié)構(gòu):處理器操作只針對寄存器的內(nèi)容,而不直接對存儲器進行操作;流水線:將指令處理過程分為多步,提高效率;指令長度:統(tǒng)一長度的指令域,簡化指令譯碼。2.1ARM簡介ARM體系結(jié)構(gòu)ARM處理12.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點,使其非常適用于嵌入式系統(tǒng):低功耗:對于電池供電的設(shè)備,功耗無疑是重點;高代碼密度:小的代碼量可以減小存儲成本;小面積:芯片內(nèi)可以集成更多的外設(shè),使系統(tǒng)硬件更緊湊簡潔;方便的硬件調(diào)試技術(shù):降低開發(fā)難度和成本。2.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點,使22.1ARM簡介各ARM體系結(jié)構(gòu)版本ARM體系結(jié)構(gòu)從最初開發(fā)到現(xiàn)在有了巨大的改進,并仍在完善和發(fā)展。為了清楚的表達每個ARM應用實例所使用的指令集,ARM公司定義了6種主要的ARM指令集體系結(jié)構(gòu)版本,以版本號V1~V6表示。其中V1~V3已經(jīng)停止使用,常用的ARM7為V4版本。2.1ARM簡介各ARM體系結(jié)構(gòu)版本AR32.1ARM簡介各ARM體系結(jié)構(gòu)版本——V4

不在為了與以前的版本兼容而支持26位體系結(jié)構(gòu),并明確了哪些指令會引起未定義指令異常發(fā)生,它相對V3版本作了以下的改進:增加半字加載/存儲指令;字節(jié)和半字的加載和符號擴展指令;具有可以轉(zhuǎn)換到Thumb狀態(tài)的指令;增加使用用戶模式寄存器的系統(tǒng)模式。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V442.1ARM簡介各ARM體系結(jié)構(gòu)版本——V5

在V4版本的基礎(chǔ)上,對現(xiàn)在指令的定義進行了必要的修正,對V4版本的體系結(jié)構(gòu)進行了擴展并并增加了指令,具體如下:改進了ARM/Thumb狀態(tài)之間的切換效率;允許非T變量和T變量一樣,使用相同的代碼生成技術(shù);增加計數(shù)前導零指令和軟件斷點指令;對乘法指令如何設(shè)置標志作了嚴格的定義。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V552.1ARM簡介ARM處理器核簡介ARM公司開發(fā)了很多系列的ARM處理器核,目前最新的系列已經(jīng)是ARM11了,而ARM6核以及更早的系列已經(jīng)很罕見了。目前應用比較廣泛的系列是:ARM7ARM9ARM9EARM10Cortex-M3XscaleARM112.1ARM簡介ARM處理器核簡介ARM62.1ARM簡介ARM處理器核簡介——ARM7

該系列包括ARM7TDMI、ARM7TDMI-S、帶有高速緩存處理器宏單元的ARM720T和擴充了Jazelle的ARM7EJ-S。該系列處理器提供Thumb16位壓縮指令集和EmbededICE軟件調(diào)試方式,適用于更大規(guī)模的SoC設(shè)計中。

ARM7系列廣泛應用于多媒體和嵌入式設(shè)備,包括Internet設(shè)備、網(wǎng)絡(luò)和調(diào)制解調(diào)器設(shè)備,以及移動電話、PDA等無線設(shè)備。2.1ARM簡介ARM處理器核簡介——ARM772.1ARM簡介ARM處理器核簡介——ARM9

該系列包括ARM9TDMI、ARM920T、ARM926和帶有高速緩存處理器宏單元的ARM940T。除了兼容ARM7系列,而且能夠更加靈活的設(shè)計。

PHILIPS最近推出的LPC3180就是基于ARM926的微處理器,即將推出的開發(fā)套件SmartARM3180支持Linux2.4、WinCE4.2,還有PC104等工控機系列產(chǎn)品。

ARM9系列主要應用于引擎管理、儀器儀表、安全系統(tǒng)和機頂盒等領(lǐng)域。2.1ARM簡介ARM處理器核簡介——ARM982.1ARM簡介ARM處理器核簡介——Cortex-M3

該系列主要針對MCU市場,改進了代碼密度,減少了中斷延遲,并有更低的功耗,支持Thumb-2指令集。開發(fā)套件:KeilRealView(包含ULINK仿真器),支持ARM7、ARM9以及Cortex-M3,ADS將停止支持Cortex-M3,預計市場上第一顆基于Cortex-M3的MCU將于第四季度上市。2.1ARM簡介ARM處理器核簡介——Cortex-M39第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器102.2ARM7TDMI簡介ARM7TDMI支持32位尋址范圍,并彌補了ARM6不能在低于5V電源電壓下工作的不足。ARM7TDMI的后綴意義為:支持高密度16位的Thumb指令集;支持片上調(diào)試;支持64位乘法;支持EmbededICE觀察硬件;ARM7TDMI的可綜合(synthesizable)版本(軟核),對應用工程師來說其編程模型與ARM7TDMI一致;ARM7TDMI-S2.2ARM7TDMI簡介ARM7TDM112.2ARM7TDMI三級流水線正在執(zhí)行的指令正在譯碼的指令正在預取的指令內(nèi)核流水線LDR R0,AddInstrSTR R0,NextInstrSUBR1,R1,#1...ADDR1,R1,#1(1)(2)(4)(3)源程序2.2ARM7TDMI三級流水線正在執(zhí)行的指令正在譯碼的12第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器132.7內(nèi)部寄存器R14寄存器與異常發(fā)生

異常發(fā)生時,程序要跳轉(zhuǎn)至異常服務程序,對返回地址的處理與子程序調(diào)用類似,都是由硬件完成的。區(qū)別在于有些異常有一個小常量的偏移。2.7內(nèi)部寄存器R14寄存器與異常發(fā)生異14程序計數(shù)器R15(PC)

寄存器R15為程序計數(shù)器(PC),它指向正在取指的地址??梢哉J為它是一個通用寄存器,但是對于它的使用有許多與指令相關(guān)的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結(jié)果將是不可預測的。程序計數(shù)器R15(PC)寄存器R15為程序計數(shù)152.7內(nèi)部寄存器讀R15的限制

正常操作時,從R15讀取的值是處理器正在取指的地址,即當前正在執(zhí)行指令的地址加上8個字節(jié)(兩條ARM指令的長度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。內(nèi)核流水線

取指

譯碼

執(zhí)行MOVADD……源程序PC(R15)PCPC-4PC-82.7內(nèi)部寄存器讀R15的限制正常操作時16MOVR0,PC

ADDSUB…2.7內(nèi)部寄存器讀R15的限制內(nèi)核流水線取指譯碼執(zhí)行SUBADDMOV程序代碼PC-8PC-4PC地址注意:執(zhí)行一條PC讀取指令時,讀取的值并不是該行指令的地址值。MOVR0,PC2.7內(nèi)部寄存器讀R15的限制內(nèi)核170x4000 ADDPC,PC,#40x4004 …0x4008 …0x400C …

思考與練習?

假設(shè)CPU正在運行以下的程序,并正在執(zhí)0x4000處的指令(它的作用是將PC值加4后寫入PC),請問指令執(zhí)行后PC值是什么?正被執(zhí)行正被譯碼PC指向指令執(zhí)行結(jié)果PC=PC+40x4000 ADDPC,PC,#4思考182.7內(nèi)部寄存器讀R15的限制

當使用STR或STM指令保存R15時,會有一個例外。這些指令可能將當前指令地址加8字節(jié)或加12字節(jié)保存(將來可能還有其它數(shù)字)。偏移量是8還是12取決于具體的ARM芯片,但是對于一個確定的芯片,這個值是一個常量。所以最好避免使用STR和STM指令來保存R15,如果很難做到,那么應當在程序中計算出該芯片的偏移量。2.7內(nèi)部寄存器讀R15的限制當使用ST192.7內(nèi)部寄存器讀R15的限制計算偏移量程序代碼:SUB R1,PC,#4 ;R1=下面STR指令的地址STR PC,[R0] ;保存STR指令地址+偏移量LDR R0,[R0] ;然后重裝SUB R0,R0,R1 ;計算偏移量2.7內(nèi)部寄存器讀R15的限制計算偏移量程序代碼:SUB202.7內(nèi)部寄存器寫R15的限制

正常操作時,寫入R15的值被當作一個指令地址,程序從這個地址處繼續(xù)執(zhí)行(相當于執(zhí)行一次無條件跳轉(zhuǎn))。2.7內(nèi)部寄存器寫R15的限制正常操作時212.7內(nèi)部寄存器寫R15的限制

由于ARM指令以字為邊界,因此寫入R15的值最低兩位通常為0b00。具體的規(guī)則取決于內(nèi)核結(jié)構(gòu)的版本:在ARM結(jié)構(gòu)V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉(zhuǎn)地址由指令的實際目標地址(寫入R15的值)和0xFFFFFFFC相與得到;在ARM結(jié)構(gòu)V4版及以上版本中,寫入R15的值的最低兩位為0,如果不是,結(jié)果將不可預測。2.7內(nèi)部寄存器寫R15的限制由于ARM22程序狀態(tài)寄存器CPSR

寄存器CPSR為程序狀態(tài)寄存器,在異常模式中,另外一個寄存器“程序狀態(tài)保存寄存器(SPSR)”可以被訪問。每種異常都有自己的SPSR,在因為異常事件而進入異常時它保存CPSR的當前值,異常退出時可通過它恢復CPSR。詳細描述參看2.8小節(jié)。程序狀態(tài)寄存器CPSR寄存器CPSR為程序狀態(tài)232.7內(nèi)部寄存器Thumb狀態(tài)寄存器Thumb狀態(tài)寄存器集是ARM狀態(tài)集的子集,程序員可以直接訪問的寄存器為:8個通用寄存器R0~R7;程序計數(shù)器(PC);堆棧指針(SP);鏈接寄存器(LR);有條件訪問程序狀態(tài)寄存器(CPSR)。2.7內(nèi)部寄存器Thumb狀態(tài)寄存器Th24Thumb狀態(tài)各模式下的寄存器CPSRCPSR狀態(tài)寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別注意:括號內(nèi)為ATPCS中寄存器的命名,可以使用RN匯編偽指令將寄存器定義多個名字。其中ADS1.2的匯編程序直接支持這些名稱,但注意a1~a4,v1~v4必須用小寫。Thumb狀態(tài)各模式下的寄存器CPSRCPSR狀態(tài)寄存器R125Thumb狀態(tài)下的通用寄存器CPSRCPSR狀態(tài)寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別R7R6R5R4R3R2R1R0

在匯編語言中寄存器R0~R7為保存數(shù)據(jù)或地址值的通用寄存器。對于任何處理器模式,它們中的每一個都對應于相同的32位物理寄存器。它們是完全通用的寄存器,不會被體系結(jié)構(gòu)作為特殊的用途,并且可用于任何使用通用寄存器的指令。Thumb狀態(tài)下的通用寄存器CPSRCPSR狀態(tài)寄存器R1526Thumb狀態(tài)下的堆棧指針寄存器(SP)CPSRCPSR狀態(tài)寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別

堆棧指針SP對應ARM狀態(tài)的寄存器R13。每個異常模式都有其自身的SP分組版本,SP通常指向各異常模式所專用的堆棧。

注意:在發(fā)生異常時,處理器自動進入ARM狀態(tài)。R13_fiqR13_irqR13_undR13_abtR13_svcR13Thumb狀態(tài)下的堆棧指針寄存器(SP)CPSRCPSR狀態(tài)27Thumb狀態(tài)下的鏈接寄存器R14(LR)CPSRCPSR狀態(tài)寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別

鏈接寄存器LR對應ARM狀態(tài)寄存器R14,在結(jié)構(gòu)上有兩個特殊功能,詳見“ARM狀態(tài)下的鏈接寄存器LR”。

注意:在發(fā)生異常時,處理器自動進入ARM狀態(tài)。R14_fiqR14_irqR14_undR14_abtR14_svcR14Thumb狀態(tài)下的鏈接寄存器R14(LR)CPSRCPSR狀282.7內(nèi)部寄存器ARM狀態(tài)和Thumb狀態(tài)之間寄存器的關(guān)系Thumb狀態(tài)寄存器與ARM狀態(tài)寄存器有如下的關(guān)系:Thumb狀態(tài)R0~R7與ARM狀態(tài)R0~R7相同;Thumb狀態(tài)CPSR與ARM狀態(tài)CPSR相同;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)。2.7內(nèi)部寄存器ARM狀態(tài)和Thumb狀態(tài)之間寄存器的關(guān)29Thumb狀態(tài)寄存器在Arm狀態(tài)寄存器上的映射低寄存器高寄存器

R1

R2

R3

R4

R5

T

humb

R6

R7

(

C

PSR

)

R1

R2

R3

R4

R5

A

R

M

R6

R7

R8

(

C

PSR

)

R9

R10

R11

R12

R0

R0

狀態(tài)

狀態(tài)堆棧指針(SP)

連接寄存器(LR)

程序計數(shù)器(PC)

當前程序狀態(tài)寄存器

堆棧指針(R13)

連接寄存器(R14)

程序計數(shù)器(R15)

當前程序狀態(tài)寄存器

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R0

堆棧指針(R13)

連接寄存器(R14)

程序計數(shù)器(R15)

Thumb狀態(tài)寄存器在Arm狀態(tài)寄存器上的映射低寄存器高寄存302.7內(nèi)部寄存器在Thumb狀態(tài)中訪問高寄存器

在Thumb狀態(tài)中,高寄存器(R8~R15)不是標準寄存器集的一部分。匯編語言程序員對它們的訪問受到限制,但可以將它們用于快速暫存??梢允褂肕OV、CMP和ADD指令對高寄存器操作,詳見第4章。2.7內(nèi)部寄存器在Thumb狀態(tài)中訪問高寄存器31第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器322.8程序狀態(tài)寄存器簡介ARM7TDMI內(nèi)核包含1個CPSR和5個供異常處理程序使用的SPSR。CPSR反映了當前處理器的狀態(tài),其包含:4個條件代碼標志(負(N)、零(Z)、進位(C)和溢出(V));2個中斷禁止位,分別控制一種類型的中斷;

5個對當前處理器模式進行編碼的位;1個用于指示當前執(zhí)行指令(ARM還是Thumb)的位。2.8程序狀態(tài)寄存器簡介ARM7TDM33NZCV——IM0M1M2M3M4TF—...3130292827268765432102.8程序狀態(tài)寄存器簡介條件代碼標志保留控制位溢出標志進位或借位擴展零負或小于IRQ禁止FIQ禁止狀態(tài)位模式位NZCVIM0M1M2M3M4TFCPSR寄存器的格式NZCV——IM0M1M2M3M4TF—...31342.8程序狀態(tài)寄存器簡介

每個異常模式還帶有一個程序狀態(tài)保存寄存器(SPSR),它用于保存在異常事件發(fā)生之前的CPSR。CPSR和SPSR通過特殊指令進行訪問。詳細信息請參閱第3章。注意:如果通過程序修改CPSR寄存器中的模式位進入異常模式,那么硬件將不會把CPSR保存至SPSR中。2.8程序狀態(tài)寄存器簡介每個異常模式還352.8程序狀態(tài)寄存器條件代碼標志

大多數(shù)“數(shù)值處理指令”可以選擇是否影響條件代碼標志位。通常如果指令帶S后綴,則該指令的執(zhí)行會影響條件代碼標志;但有一些指令的執(zhí)行總是會影響條件代碼標志。

N、Z、C和V位都是條件代碼標志。通過算術(shù)操作、邏輯操作、MSR或者LDM指令可以對這些位進行設(shè)置。所有ARM指令都可按條件來執(zhí)行,而Thumb指令中只有分支指令可按條件執(zhí)行。2.8程序狀態(tài)寄存器條件代碼標志大多數(shù)“362.8程序狀態(tài)寄存器條件代碼標志各標志位的含義如下:N運算結(jié)果的最高位反映在該標志位。對于有符號二進制補碼,結(jié)果為負數(shù)時N=1,結(jié)果為正數(shù)或零時N=0;Z指令結(jié)果為0時Z=1(通常表示比較結(jié)果“相等”),否則Z=0;2.8程序狀態(tài)寄存器條件代碼標志各標志位的含義如下:372.8程序狀態(tài)寄存器條件代碼標志各標志位的含義如下:C當進行加法運算(包括CMN指令),并且最高位產(chǎn)生進位時C=1,否則C=0。當進行減法運算(包括CMP指令),并且最高位產(chǎn)生借位時C=0,否則C=1。對于結(jié)合移位操作的非加法/減法指令,C為從最高位最后移出的值,其它指令C通常不變;V當進行加法/減法運算,并且發(fā)生有符號溢出時V=1,否則V=0,其它指令V通常不變。2.8程序狀態(tài)寄存器條件代碼標志各標志位的含義如下:382.8程序狀態(tài)寄存器控制位CPSR的最低8位為控制位,當發(fā)生異常時,這些位被硬件改變。當處理器處于一個特權(quán)模式時,可用軟件操作這些位。它們分別是:中斷禁止位;T位;模式位。2.8程序狀態(tài)寄存器控制位CPSR的最392.8程序狀態(tài)寄存器控制位中斷禁止位包括I和F位:當I位置位時,IRQ中斷被禁止;當F位置位時,F(xiàn)IQ中斷被禁止。T位反映了正在操作的狀態(tài):當T位置位時,處理器正在Thumb狀態(tài)下運行;當T位清零時,處理器正在ARM狀態(tài)下運行。2.8程序狀態(tài)寄存器控制位中斷禁止位包括I和F位:402.8程序狀態(tài)寄存器控制位模式位包括M4、M3、M2、M1和M0,這些位決定處理器的操作模式。注意:不是所有模式位的組合都定義了有效的處理器模式,如果使用了錯誤的設(shè)置,將引起一個無法恢復的錯誤。2.8程序狀態(tài)寄存器控制位模式位包括M4、M3、M2、M41CPSR模式位設(shè)置表CPSR模式位設(shè)置表422.8程序狀態(tài)寄存器保留位CPSR中的保留位被保留將來使用。為了提高程序的可移植性,當改變CPSR標志和控制位時,請不要改變這些保留位。另外,請確保您程序的運行不受保留位的值影響,因為將來的處理器可能會將這些位設(shè)置為1或者0。2.8程序狀態(tài)寄存器保留位CPSR中的保43第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器442.9異常簡介

只要正常的程序流被暫時中止,處理器就進入異常模式。例如響應一個來自外設(shè)的中斷。在處理異常之前,ARM7TDMI內(nèi)核保存當前的處理器狀態(tài),這樣當處理程序結(jié)束時可以恢復執(zhí)行原來的程序。如果同時發(fā)生兩個或更多異常,那么將按照固定的順序來處理異常,詳見“異常優(yōu)先級”部分。2.9異常簡介只要正常的程序流被暫時中止452.9異常異常的入口和出口處理

如果異常處理程序已經(jīng)把返回地址拷貝到堆棧,那么可以使用一條多寄存器傳送指令來恢復用戶寄存器并實現(xiàn)返回。SUBLR,LR,#4 ;計算返回地址STMFDSP!,{R0-R3,LR} ;保存使用到的寄存器...LDMFDSP!,{R0-R3,PC}^ ;中斷返回中斷處理代碼的開始部分和退出部分2.9異常異常的入口和出口處理如果異常處理程序46

如果異常處理程序已經(jīng)把返回地址拷貝到堆棧,那么可以使用一條多寄存器傳送指令來恢復用戶寄存器并實現(xiàn)返回。中斷處理代碼的開始部分和退出部分2.9異常異常的入口和出口處理SUBLR,LR,#4 ;計算返回地址STMFDSP!,{R0-R3,LR} ;保存使用到的寄存器...LDMFDSP!,{R0-R3,PC}^ ;中斷返回注意:中斷返回指令的寄存器列表(其中必須包括PC)后的“^”符號表示這是一條特殊形式的指令。這條指令在從存儲器中裝載PC的同時(PC是最后恢復的),CPSR也得到恢復。這里使用的堆棧指針SP(R13)是屬于異常模式的寄存器,每個異常模式有自己的堆棧指針。這個堆棧指針應必須在系統(tǒng)啟動時初始化。如果異常處理程序已經(jīng)把返回地址拷貝到堆棧,那么可以472.9異常進入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會作以下工作:1.在適當?shù)腖R中保存下一條指令的地址,當異常入口來自:ARM狀態(tài),那么ARM7TDMI將下一條指令地址復制到LR中;為ARM或Thumb狀態(tài),那么ARM7TDMI將當前指令地址加4或加8(取決于異常的類型)復制到LR中;異常處理器程序不必確定狀態(tài)。2.9異常進入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會作482.9異常進入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會作以下工作:2.將CPSR復制到適當?shù)腟PSR中;3.將CPSR模式位強制設(shè)置為與異常類型相對應的值;4.強制PC從相關(guān)的異常向量處取指。2.9異常進入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會作49ARM7TDMI內(nèi)核在中斷異常時置位中斷禁止標志,這樣可以防止不受控制的異常嵌套。注:異常總是在ARM狀態(tài)中進行處理。當處理器處于Thumb狀態(tài)時發(fā)生了異常,在異常向量地址裝入PC時,會自動切換到ARM狀態(tài)。2.9異常進入異常ARM7TDMI內(nèi)核在中斷異常時置位中斷禁止50當異常結(jié)束時,異常處理程序必須:1.將LR中的值減去偏移量后存入PC,偏移量根據(jù)異常的類型而有所不同;2.將SPSR的值復制回CPSR;3.清零在入口置位的中斷禁止標志。注:恢復CPSR的動作會將T、F和I位自動恢復為異常發(fā)生前的值。2.9異常退出異常當異常結(jié)束時,異常處理程序必須:2.9異常退出異常51程序AIRQ服務程序系統(tǒng)模式IRQ模式程序寄存器組圖示進入異常過程1.程序在系統(tǒng)模式下運行用戶程序,假定當前處理器狀態(tài)為Thumb狀態(tài)、允許IRQ中斷;2.用戶程序運行時發(fā)生IRQ中斷,硬件完成以下動作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV置位I位(禁止IRQ中斷)清零T位(進入ARM狀態(tài))設(shè)置MOD位,切換處理器模式至IRQ模式將下一條指令的地址存入IRQ模式的LR寄存器將CPSR寄存器內(nèi)容存入IRQ模式的SPSR寄存器將跳轉(zhuǎn)地址存入PC,實現(xiàn)跳轉(zhuǎn)IRQ0?1...????BackAddrJumpAddrJumpSYS1?0...????“?”表示對該位不關(guān)心程序AIRQ服務程序系統(tǒng)模式IRQ模式程序寄存器組圖示進入異52在異常處理結(jié)束后,異常處理程序完成以下動作:程序AIRQ服務程序系統(tǒng)模式IRQ模式程序寄存器組圖示退出異常過程LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV將SPSR寄存器的值復制回CPSR寄存器;將LR寄存的值減去一個常量后復制到PC寄存器,跳轉(zhuǎn)到被中斷的用戶程序。IRQ0?1...????BackAddrJumpAddrreturnSYS1?0...????SYS1?0...????BackAddr-4Jump“?”表示對該位不關(guān)心在異常處理結(jié)束后,異常處理程序完成以下動作:程序AIRQ服務53FIQ和IRQ中斷請求由ARM內(nèi)核的nFIQ和nIRQ信號線輸入,當信號線上出現(xiàn)有效觸發(fā)電平時,產(chǎn)生相應的FIQ或IRQ中斷,ARM核進入相應的異常模式。2.9異常FIQ和IRQ中斷請求FIQ和IRQ中斷請求由ARM內(nèi)核的nFIQ54

快速中斷請求(FIQ)適用于對一個突發(fā)事件的快速響應,這得益于在ARM狀態(tài)中,快中斷模式有8個專用的寄存器可用來滿足寄存器保護的需要(這可以加速上下文切換的速度)。2.9異??焖僦袛嗾埱?/p>

與其它模式相比,它有更多的自有寄存器,可以減少程序中堆棧的操作,提高處理速度??焖僦袛嗾埱?FIQ)適用于對一個突發(fā)事件的55

不管異常入口是來自ARM狀態(tài)還是Thumb狀態(tài),F(xiàn)IQ處理程序都會通過執(zhí)行下面的指令從中斷返回:SUBSPC,R14_fiq,#4

在一個特權(quán)模式中,可以通過置位CPSR中的F位來禁止FIQ異常。2.9異??焖僦袛嗾埱蟛还墚惓H肟谑莵碜訟RM狀態(tài)還是Thumb狀56

中斷請求(IRQ)異常是一個由nIRQ輸入端的低電平所產(chǎn)生的正常中斷(在具體的芯片中,nIRQ由片內(nèi)外設(shè)拉低,nIRQ是內(nèi)核的一個信號,對用戶不可見)。IRQ的優(yōu)先級低于FIQ。對于FIQ序列它是被屏蔽的。任何時候在一個特權(quán)模式下,都可通過置位CPSR中的I位來禁止IRQ。不管異常入口是來自ARM狀態(tài)還是Thumb狀態(tài),F(xiàn)IQ處理程序都會通過執(zhí)行下面的指令從中斷返回:SUBSPC,R14_irq,#42.9異常中斷請求中斷請求(IRQ)異常是一個由nIRQ輸入端57指令A指令B指令C……正常程序流代碼2.9異常IRQ與FIQ的返回地址處理中斷發(fā)生時正在執(zhí)行的指令中斷發(fā)生時PC指向的指令void__irqINT_Express(){

服務代碼}//

SUBSpc,r14,#4C語言中斷服務程序指令A指令B指令C……正常程序流代碼2.9異常IRQ與F58

中止發(fā)生在對存儲器的訪問不能完成時。例如試圖訪問一個保留地址或未分配區(qū)域的地址,ARM處理器將產(chǎn)生中止異常。中止包含兩種類型:預取中止發(fā)生在指令預取過程中數(shù)據(jù)中止發(fā)生在對數(shù)據(jù)訪問時2.9異常中止中止發(fā)生在對存儲器的訪問不能完成時。例如試圖59例如:LPC2000微控制器會發(fā)生中止異常的區(qū)域:FlashSRAMBootBlockVPB地址空間AHB1.特定的ARM器件所沒有的存儲器映射區(qū)域;2.AHB外設(shè)空間中未分配的區(qū)域;3.VPB外設(shè)空間中未分配的區(qū)域。2.9異常中止231例如:FlashSRAMBootBlockVPB地址空間A60

當發(fā)生預取中止時,ARM7TDMI內(nèi)核將預取的指令標記為無效,但在指令到達流水線的執(zhí)行階段時才進入異常。如果指令在流水線中因為發(fā)生分支而沒有被執(zhí)行,中止將不會發(fā)生。在處理中止的原因之后,不管處于哪種處理器操作狀態(tài),處理程序都會執(zhí)行下面的指令恢復PC和CPSR并重試被中止的指令:

SUBSPC,R14_abt,#42.9異常中止——預取指中止當發(fā)生預取中止時,ARM7TDMI內(nèi)核將預取61指令流水線指令C指令B指令A存儲器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A取指譯碼執(zhí)行存儲器程序存儲器第N次取指2.9異常中止——預取指中止指令流水線指令C指令B指令A存儲器無效區(qū)域取指譯碼執(zhí)行指令C62第N+1次取指指令流水線指令C指令B指令A存儲器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A無效指令指令C指令B取指譯碼執(zhí)行存儲器程序存儲器2.9異常中止——預取指中止第N+1次取指指令流水線指令C指令B指令A存儲器無效區(qū)域取指63第N+2次取指指令流水線指令C指令B指令A存儲器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A無效指令指令C指令B取指譯碼執(zhí)行無效指令無效指令指令C存儲器程序存儲器2.9異常中止——預取指中止第N+2次取指指令流水線指令C指令B指令A存儲器無效區(qū)域取指64指令流水線指令C指令B指令A存儲器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A無效指令指令C指令B取指譯碼執(zhí)行無效指令無效指令指令C無效指令無效指令無效指令存儲器程序存儲器

第N+3次取指,此時流水線的執(zhí)行級執(zhí)行了無效指令,發(fā)生預取指中止。如果指令C為跳轉(zhuǎn)指令則可以避免預取指中止的發(fā)生。2.9異常中止——預取指中止指令流水線指令C指令B指令A存儲器無效區(qū)域取指譯碼執(zhí)行指令C65

當發(fā)生數(shù)據(jù)中止后,根據(jù)產(chǎn)生數(shù)據(jù)中止的指令類型作出不同的處理。2.9異常中止——數(shù)據(jù)中止

在修復產(chǎn)生中止的原因后,不管處于哪種處理器操作狀態(tài),處理程序都必須執(zhí)行下面的返回指令:

SUBSPC,R14_abt,#8當發(fā)生數(shù)據(jù)中止后,根據(jù)產(chǎn)生數(shù)據(jù)中止的指令類型66

使用軟件中斷(SWI)指令可以進入管理模式,通常用于請求一個特定的管理函數(shù)。SWI處理程序通過執(zhí)行下面的指令返回:MOVSPC,R14_svc

這個動作恢復了PC和CPSR并返回到SWI之后的指令。SWI處理程序讀取操作碼以提取SWI函數(shù)編號。2.9異常軟件中斷指令使用軟件中斷(SWI)指令可以進入管理模67用戶程序服務程序用戶模式管理模式程序SWI指令return2.9異常軟件中斷指令Jump實現(xiàn)操作系統(tǒng)的系統(tǒng)調(diào)用11.執(zhí)行用戶程序中的軟件中斷指令,產(chǎn)生軟件中斷異常,通常用于系統(tǒng)調(diào)用;2.執(zhí)行異常處理程序,并返回。2用戶程序服務程序用戶模式管理模式程序SWI指令return268

當ARM7TDMI處理器遇到一條自己和系統(tǒng)內(nèi)任何協(xié)處理器都無法處理的指令時,ARM7TDMI內(nèi)核執(zhí)行未定義指令陷阱。軟件可使用這一機制通過模擬未定義的協(xié)處理器指令來擴展ARM指令集。注:ARM7TDMI處理器完全遵循ARM結(jié)構(gòu)v4T,可以捕獲所有分類未被定義的指令位格式。2.9異常未定義的指令當ARM7TDMI處理器遇到一條自己和系692.9異常未定義的指令用戶程序服務程序用戶模式未定義模式程序未定義指令returnJump解釋無法執(zhí)行的指令,并完成其功能11.執(zhí)行用戶程序時遇到無法執(zhí)行的指令,產(chǎn)生未定義指令異常;3.異常處理程序執(zhí)行結(jié)束后返回。32.在服務程序中取出無法執(zhí)行指令,完成其功能;22.9異常未定義的指令用戶程序服務程序用戶模式未定義模式70

在模擬處理了失敗的指令后,陷阱程序執(zhí)行下面的指令:MOVSPC,R14_und

這個動作恢復了PC和CPSR并返回到未定義指令之后的指令。2.9異常未定義的指令在模擬處理了失敗的指令后,陷阱程序執(zhí)行下面的指令:71異常向量注:表中的I和F表示不對該位有影響,保留原來的值。異常向量注:表中的I和F表示不對該位有影響,保留原來的值。72CODE32AREAvectors,CODE,READONLYENTRYResetLDRPC,ResetAddrLDRPC,UndefinedAddr...DCD0xb9205f80LDRPC,[PC,#-0xff0]LDRPC,FIQ_AddrResetAddrDCDResetInitUndefinedAddrDCDUndefined...NouseDCD0IRQ_AddrDCDIRQ_HandlerFIQ_AddrDCDFIQ_Handler異常向量表:CODE32異常向量表:73CODE32AREAvectors,CODE,READONLYENTRYResetLDRPC,ResetAddrLDRPC,UndefinedAddr...DCD0xb9205f80LDRPC,[PC,#-0xff0]LDRPC,FIQ_AddrResetAddrDCDResetInitUndefinedAddrDCDUndefined...NouseDCD0IRQ_AddrDCDIRQ_HandlerFIQ_AddrDCDFIQ_Handler異常向量表:取出跳轉(zhuǎn)地址后向服務程序跳轉(zhuǎn)CODE32AREAvectors,CODE,READONLYENTRYResetLDRPC,ResetAddrLDRPC,UndefinedAddr...DCD0xb9205f80LDRPC,[PC,#-0xff0]LDRPC,FIQ_AddrResetAddrDCDResetInitUndefinedAddrDCDUndefined...NouseDCD0IRQ_AddrDCDIRQ_HandlerFIQ_AddrDCDFIQ_Handler異常向量表:ResetInit

復位服務程序Undefine

未定義服務程序IRQ_Handler

IRQ中斷服務程序FIQ_HandlerFIQ中斷服務程序……CODE32異常向量表:取出跳轉(zhuǎn)地址后向服務74

當多個異常同時發(fā)生時,一個固定的優(yōu)先級系統(tǒng)決定它們被處理的順序:2.9異常異常優(yōu)先級優(yōu)先級降低當多個異常同時發(fā)生時,一個固定的優(yōu)先級系75注意:未定義的指令和SWI異?;コ狻R驗橥粭l指令不能既是未定義的,又能產(chǎn)生有效的軟件中斷;當FIQ使能,并且FIQ和數(shù)據(jù)中止異常同時發(fā)生時,ARM7TDMI內(nèi)核首先進入數(shù)據(jù)中止處理程序,然后立即跳轉(zhuǎn)到FIQ向量。在FIQ處理結(jié)束后返回到數(shù)據(jù)中止處理程序。數(shù)據(jù)中止的優(yōu)先級必須高于FIQ以確保數(shù)據(jù)轉(zhuǎn)移錯誤不會被漏過。2.9異常異常優(yōu)先級注意:2.9異常異常優(yōu)先級76第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器772.11復位復位

當nRESET信號被拉低時(一般外部復位引腳電平的變化和芯片的其它復位源會改變這個內(nèi)核信號),ARM7TDMI處理器放棄正在執(zhí)行的指令。

在復位后,除PC和CPSR之外的所有寄存器的值都不確定。2.11復位復位當nRESET信號被拉低782.11復位復位

當nRESET信號再次變?yōu)楦唠娖綍r,ARM處理器執(zhí)行下列操作:1.強制M[4:0]變?yōu)閎10011(管理模式);2.置位CPSR中的I和F位;3.清零CPSR中的T位;4.強制PC從地址0x00開始對下一條指令進行取指。2.11復位復位當nRESET信號再次變79第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器802.12存儲器及存儲器映射I/O簡介ARM7TDMI處理器采用馮·諾依曼(VonNeumann)結(jié)構(gòu),指令和數(shù)據(jù)共用一條32位數(shù)據(jù)總線。只有裝載、保存和交換指令可訪問存儲器中的數(shù)據(jù)。2.12存儲器及存儲器映射I/O簡介AR812.12存儲器及存儲器映射I/O簡介ARM7的規(guī)范僅定義了處理器核與存儲系統(tǒng)之間的信號及時序(局部總線),而現(xiàn)實的芯片一般在外部總線與處理器核的局部總線之間有一個存儲器管理部件將局部總線的信號和時序轉(zhuǎn)換為現(xiàn)實的外部總線信號和時序。因此,外部總線的信號和時序與具體的芯片相關(guān),不是ARM7的標準。具體到某個芯片的外部存儲系統(tǒng)的設(shè)計需要參考其芯片的數(shù)據(jù)手冊或使用手冊等資料。2.12存儲器及存儲器映射I/O簡介AR82ARM7內(nèi)核存儲器控制器存儲器2.12存儲器及存儲器映射I/O簡介ARM7定義了局部總線的接口時序各芯片廠商制定了自己的接口時序ARM7局部總線一般在兩者之間加入存儲器控制器ARM7存儲器存儲器2.12存儲器及存儲器映射I/O簡介83存儲器系統(tǒng)有兩種映射機制:小端存儲器系統(tǒng):在小端格式中,數(shù)據(jù)的高字節(jié)存放在高地址中。因此存儲器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線7~0。大端存儲器系統(tǒng):在大端格式中,數(shù)據(jù)的高字節(jié)存放在低地址中。因此存儲器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線31~24。0x87654321字數(shù)據(jù)的大小端存儲方式2.12存儲器及存儲器映射I/O存儲器格式0x78高地址低地址0x560x340x12大端模式0x12高地址低地址0x340x560x78小端模式存儲器系統(tǒng)有兩種映射機制:0x87654321字數(shù)據(jù)的大小端84

一個基于ARM內(nèi)核的芯片可以只支持大端模式或小端模式,也可以兩者都支持。在ARM指令集中不包含任何直接選擇大小端的指令,但是一個同時支持大小端模式的ARM芯片可以通過硬件配置(一般使用芯片的引腳來配置)來匹配存儲器系統(tǒng)所使用的規(guī)則。2.12存儲器及存儲器映射I/O存儲器格式注意:如果實際的存儲器格式與芯片的存儲器格式不符時,只有以字為單位的數(shù)據(jù)存取才正確,否則將出現(xiàn)不可預期的結(jié)果。一個基于ARM內(nèi)核的芯片可以只支持大端模式或85ARM結(jié)構(gòu)通常希望所有的存儲器訪問都合理的對齊。具體來說就是字訪問的地址通常是字對齊的,而半字訪問使用的地址是半字對齊的。不按這種方式對齊的存儲器訪問稱為非對齊的存儲器訪問。將一個非字(半字)對齊的地址寫入ARM(Thumb)狀態(tài)的R15寄存器,將引起非對齊的指令取指。在一個非字(半字)對齊的地址讀寫一個字(半字),將引起非對齊的數(shù)據(jù)訪問:2.12存儲器及存儲器映射I/O非對齊的存儲器訪問ARM結(jié)構(gòu)通常希望所有的存儲器訪問都合理的對86

基于ARM內(nèi)核的芯片具有許多的外設(shè),這些外設(shè)訪問的標準方法是使用存儲器映射的I/O,為外設(shè)的每個寄存器都分配一個地址。通常,從這些地址裝載數(shù)據(jù)用于讀入,向這些地址保存數(shù)據(jù)用于輸出。有些地址的裝載和保存用于外設(shè)的控制功能,而不是輸入或輸出功能。2.12存儲器及存儲器映射I/O存儲器映射的I/O注意:存儲器映射的I/O位置的操作不同于正常的存儲器位置的操作。通常,存儲器映射的I/O位置沒有高速緩存和無緩沖區(qū)?;贏RM內(nèi)核的芯片具有許多的外設(shè),這些外設(shè)872.12存儲器及存儲器映射I/O存儲器映射的I/O存儲器區(qū)memory外設(shè)區(qū)域地址空間0x000000000xE0000000ARM核操作外設(shè)操作存儲器存儲器控制器2.12存儲器及存儲器映射I/O存儲器映射的I/O存儲器882.12存儲器及存儲器映射I/O使用C語言如何訪問存儲器和外設(shè)<main.c>…uint32IOStatus;IOStatus=IO0PIN;…<LPC2200.h>...#defineIO0PIN(*((volatileunsignedlong*)0xE0028000))...2.12存儲器及存儲器映射I/O使用C語言如何訪問存儲器89電腦打鈴器硬件框圖CPULPC2132鍵盤輸入輸出接口2005年11月1

11:00

星期六

下次動作:1-2

11:10液晶顯示任務1鍵盤檢測任務4輸出控制任務3信息顯示任務2鍵盤處理電腦打鈴器硬件框圖CPU鍵輸2005年11月111:090用戶模式USR系統(tǒng)模式SYS管理模式SVCIRQ模式IRQFIQ模式FIQ中止模式未定義abt/undThumb狀態(tài)ARM狀態(tài)任務1按鍵檢測任務2按鍵處理任務3信息顯示任務4輸出控制IRQ2按鍵中斷IRQ3秒中斷系統(tǒng)調(diào)用1關(guān)閉IRQ系統(tǒng)調(diào)用2打開IRQ系統(tǒng)調(diào)用……系統(tǒng)調(diào)用n任務切換IRQ1系統(tǒng)節(jié)拍FIQ1掉電處理While(1)電腦打鈴器程序分布示意圖其它代碼操作系統(tǒng)內(nèi)核用戶模式系統(tǒng)模式管理模式IRQ模式FIQ模式中止模式Thum91

思考與練習?1.我們已經(jīng)學習了ARM的模式和狀態(tài)等知識,請考慮如何將原有的程序移植到ARM上運行,模式和狀態(tài)要如何選擇?思考與練習?1.我們已經(jīng)學習了ARM的模式和狀態(tài)等知識,請92ARM7體系結(jié)構(gòu)概述課件932.1ARM簡介ARM體系結(jié)構(gòu)ARM處理器為RISC芯片,其簡單的結(jié)構(gòu)使ARM內(nèi)核非常小,這使得器件的功耗也非常低。它具有經(jīng)典RISC的特點:寄存器:具有更多的通用寄存器;裝載/保存結(jié)構(gòu):處理器操作只針對寄存器的內(nèi)容,而不直接對存儲器進行操作;流水線:將指令處理過程分為多步,提高效率;指令長度:統(tǒng)一長度的指令域,簡化指令譯碼。2.1ARM簡介ARM體系結(jié)構(gòu)ARM處理942.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點,使其非常適用于嵌入式系統(tǒng):低功耗:對于電池供電的設(shè)備,功耗無疑是重點;高代碼密度:小的代碼量可以減小存儲成本;小面積:芯片內(nèi)可以集成更多的外設(shè),使系統(tǒng)硬件更緊湊簡潔;方便的硬件調(diào)試技術(shù):降低開發(fā)難度和成本。2.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點,使952.1ARM簡介各ARM體系結(jié)構(gòu)版本ARM體系結(jié)構(gòu)從最初開發(fā)到現(xiàn)在有了巨大的改進,并仍在完善和發(fā)展。為了清楚的表達每個ARM應用實例所使用的指令集,ARM公司定義了6種主要的ARM指令集體系結(jié)構(gòu)版本,以版本號V1~V6表示。其中V1~V3已經(jīng)停止使用,常用的ARM7為V4版本。2.1ARM簡介各ARM體系結(jié)構(gòu)版本AR962.1ARM簡介各ARM體系結(jié)構(gòu)版本——V4

不在為了與以前的版本兼容而支持26位體系結(jié)構(gòu),并明確了哪些指令會引起未定義指令異常發(fā)生,它相對V3版本作了以下的改進:增加半字加載/存儲指令;字節(jié)和半字的加載和符號擴展指令;具有可以轉(zhuǎn)換到Thumb狀態(tài)的指令;增加使用用戶模式寄存器的系統(tǒng)模式。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V4972.1ARM簡介各ARM體系結(jié)構(gòu)版本——V5

在V4版本的基礎(chǔ)上,對現(xiàn)在指令的定義進行了必要的修正,對V4版本的體系結(jié)構(gòu)進行了擴展并并增加了指令,具體如下:改進了ARM/Thumb狀態(tài)之間的切換效率;允許非T變量和T變量一樣,使用相同的代碼生成技術(shù);增加計數(shù)前導零指令和軟件斷點指令;對乘法指令如何設(shè)置標志作了嚴格的定義。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V5982.1ARM簡介ARM處理器核簡介ARM公司開發(fā)了很多系列的ARM處理器核,目前最新的系列已經(jīng)是ARM11了,而ARM6核以及更早的系列已經(jīng)很罕見了。目前應用比較廣泛的系列是:ARM7ARM9ARM9EARM10Cortex-M3XscaleARM112.1ARM簡介ARM處理器核簡介ARM992.1ARM簡介ARM處理器核簡介——ARM7

該系列包括ARM7TDMI、ARM7TDMI-S、帶有高速緩存處理器宏單元的ARM720T和擴充了Jazelle的ARM7EJ-S。該系列處理器提供Thumb16位壓縮指令集和EmbededICE軟件調(diào)試方式,適用于更大規(guī)模的SoC設(shè)計中。

ARM7系列廣泛應用于多媒體和嵌入式設(shè)備,包括Internet設(shè)備、網(wǎng)絡(luò)和調(diào)制解調(diào)器設(shè)備,以及移動電話、PDA等無線設(shè)備。2.1ARM簡介ARM處理器核簡介——ARM71002.1ARM簡介ARM處理器核簡介——ARM9

該系列包括ARM9TDMI、ARM920T、ARM926和帶有高速緩存處理器宏單元的ARM940T。除了兼容ARM7系列,而且能夠更加靈活的設(shè)計。

PHILIPS最近推出的LPC3180就是基于ARM926的微處理器,即將推出的開發(fā)套件SmartARM3180支持Linux2.4、WinCE4.2,還有PC104等工控機系列產(chǎn)品。

ARM9系列主要應用于引擎管理、儀器儀表、安全系統(tǒng)和機頂盒等領(lǐng)域。2.1ARM簡介ARM處理器核簡介——ARM91012.1ARM簡介ARM處理器核簡介——Cortex-M3

該系列主要針對MCU市場,改進了代碼密度,減少了中斷延遲,并有更低的功耗,支持Thumb-2指令集。開發(fā)套件:KeilRealView(包含ULINK仿真器),支持ARM7、ARM9以及Cortex-M3,ADS將停止支持Cortex-M3,預計市場上第一顆基于Cortex-M3的MCU將于第四季度上市。2.1ARM簡介ARM處理器核簡介——Cortex-M3102第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器1032.2ARM7TDMI簡介ARM7TDMI支持32位尋址范圍,并彌補了ARM6不能在低于5V電源電壓下工作的不足。ARM7TDMI的后綴意義為:支持高密度16位的Thumb指令集;支持片上調(diào)試;支持64位乘法;支持EmbededICE觀察硬件;ARM7TDMI的可綜合(synthesizable)版本(軟核),對應用工程師來說其編程模型與ARM7TDMI一致;ARM7TDMI-S2.2ARM7TDMI簡介ARM7TDM1042.2ARM7TDMI三級流水線正在執(zhí)行的指令正在譯碼的指令正在預取的指令內(nèi)核流水線LDR R0,AddInstrSTR R0,NextInstrSUBR1,R1,#1...ADDR1,R1,#1(1)(2)(4)(3)源程序2.2ARM7TDMI三級流水線正在執(zhí)行的指令正在譯碼的105第2章目錄1.簡介2.ARM7TDMI3.ARM7TDMI的模塊和內(nèi)部框圖4.體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型5.處理器狀態(tài)6.處理器模式7.內(nèi)部寄存器8.程序狀態(tài)寄存器9.異常10.中斷延遲11.復位12.存儲器及存儲器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器1062.7內(nèi)部寄存器R14寄存器與異常發(fā)生

異常發(fā)生時,程序要跳轉(zhuǎn)至異常服務程序,對返回地址的處理與子程序調(diào)用類似,都是由硬件完成的。區(qū)別在于有些異常有一個小常量的偏移。2.7內(nèi)部寄存器R14寄存器與異常發(fā)生異107程序計數(shù)器R15(PC)

寄存器R15為程序計數(shù)器(PC),它指向正在取指的地址。可以認為它是一個通用寄存器,但是對于它的使用有許多與指令相關(guān)的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結(jié)果將是不可預測的。程序計數(shù)器R15(PC)寄存器R15為程序計數(shù)1082.7內(nèi)部寄存器讀R15的限制

正常操作時,從R15讀取的值是處理器正在取指的地址,即當前正在執(zhí)行指令的地址加上8個字節(jié)(兩條ARM指令的長度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。內(nèi)核流水線

取指

譯碼

執(zhí)行MOVADD……源程序PC(R15)PCPC-4PC-82.7內(nèi)部寄存器讀R15的限制正常操作時109MOVR0,PC

ADDSUB…2.7內(nèi)部寄存器讀R15的限制內(nèi)核流水線取指譯碼執(zhí)行SUBADDMOV程序代碼PC-8PC-4PC地址注意:執(zhí)行一條PC讀取指令時,讀取的值并不是該行指令的地址值。MOVR0,PC2.7內(nèi)部寄存器讀R15的限制內(nèi)核1100x4000 ADDPC,PC,#40x4004 …0x4008 …0x400C …

思考與練習?

假設(shè)CPU正在運行以下的程序,并正在執(zhí)0x4000處的指令(它的作用是將PC值加4后寫入PC),請問指令執(zhí)行后PC值是什么?正被執(zhí)行正被譯碼PC指向指令執(zhí)行結(jié)果PC=PC+40x4000 ADDPC,PC,#4思考1112.7內(nèi)部寄存器讀R15的限制

當使用STR或STM指令保存R15時,會有一個例外。這些指令可能將當前指令地址加8字節(jié)或加12字節(jié)保存(將來可能還有其它數(shù)字)。偏移量是8還是12取決于具體的ARM芯片,但是對于一個確定的芯片,這個值是一個常量。所以最好避免使用STR和STM指令來保存R15,如果很難做到,那么應當在程序中計算出該芯片的偏移量。2.7內(nèi)部寄存器讀R15的限制當使用ST1122.7內(nèi)部寄存器讀R15的限制計算偏移量程序代碼:SUB R1,PC,#4 ;R1=下面STR指令的地址STR PC,[R0] ;保存STR指令地址+偏移量LDR R0,[R0] ;然后重裝SUB R0,R0,R1 ;計算偏移量2.7內(nèi)部寄存器讀R15的限制計算偏移量程序代碼:SUB1132.7內(nèi)部寄存器寫R15的限制

正常操作時,寫入R15的值被當作一個指令地址,程序從這個地址處繼續(xù)執(zhí)行(相當于執(zhí)行一次無條件跳轉(zhuǎn))。2.7內(nèi)部寄存器寫R15的限制正常操作時1142.7內(nèi)部寄存器寫R15的限制

由于ARM指令以字為邊界,因此寫入R15的值最低兩位通常為0b00。具體的規(guī)則取決于內(nèi)核結(jié)構(gòu)的版本:在ARM結(jié)構(gòu)V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉(zhuǎn)地址由指令的實際目標地址(寫入R15的值)和0xFFFFFFFC相與得到;在ARM結(jié)構(gòu)V4版及以上版本中,寫入R15的值的最低兩位為0,如果不是,結(jié)果將不可預測。2.7內(nèi)部寄存器寫R15的限制由于ARM115程序狀態(tài)寄存器CPSR

寄存器CPSR為程序狀態(tài)寄存器,在異常模式中,另外一個寄存器“程序狀態(tài)保存寄存器(SPSR)”可以被訪問。每種異常都有自己的SPSR,在因為異常事件而進入異常時它保存CPSR的當前值,異常退出時可通過它恢復CPSR。詳細描述參看2.8小節(jié)。程序狀態(tài)寄存器CPSR寄存器CPSR為程序狀態(tài)1162.7內(nèi)部寄存器Thumb狀態(tài)寄存器Thumb狀態(tài)寄存器集是ARM狀態(tài)集的子集,程序員可以直接訪問的寄存器為:8個通用寄存器R0~R7;程序計數(shù)器(PC);堆棧指針(SP);鏈接寄存器(LR);有條件訪問程序狀態(tài)寄存器(CPSR)。2.7內(nèi)部寄存器Thumb狀態(tài)寄存器Th117Thumb狀態(tài)各模式下的寄存器CPSRCPSR狀態(tài)寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別注意:括號內(nèi)為ATPCS中寄存器的命名,可以使用RN匯編偽指令將寄存器定義多個名字。其中ADS1.2的匯編程序直接支持這些名稱,但注意a1~a4,v1~v4必須用小寫。Thumb狀態(tài)各模式下的寄存器CPSRCPSR狀態(tài)寄存器R1118Thumb狀態(tài)下的通用寄存器CPSRCPSR狀態(tài)寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別R7R6R5R4R3R2R1R0

在匯編語言中寄存器R0~R7為保存數(shù)據(jù)或地址值的通用寄存器。對于任何處理器模式,它們中的每一個都對應于相同的32位物理寄存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論