版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2.1ARM簡介ARM體系結(jié)構(gòu)ARM處理器為RISC芯片,其簡單的結(jié)構(gòu)使ARM內(nèi)核非常小,這使得器件的功耗也非常低。它具有經(jīng)典RISC的特點(diǎn):寄存器:具有更多的通用寄存器;裝載/保存結(jié)構(gòu):處理器操作只針對(duì)寄存器的內(nèi)容,而不直接對(duì)存儲(chǔ)器進(jìn)行操作;流水線:將指令處理過程分為多步,提高效率;指令長度:統(tǒng)一長度的指令域,簡化指令譯碼。2.1ARM簡介ARM體系結(jié)構(gòu)ARM處理12.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點(diǎn),使其非常適用于嵌入式系統(tǒng):低功耗:對(duì)于電池供電的設(shè)備,功耗無疑是重點(diǎn);高代碼密度:小的代碼量可以減小存儲(chǔ)成本;小面積:芯片內(nèi)可以集成更多的外設(shè),使系統(tǒng)硬件更緊湊簡潔;方便的硬件調(diào)試技術(shù):降低開發(fā)難度和成本。2.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點(diǎn),使22.1ARM簡介各ARM體系結(jié)構(gòu)版本ARM體系結(jié)構(gòu)從最初開發(fā)到現(xiàn)在有了巨大的改進(jìn),并仍在完善和發(fā)展。為了清楚的表達(dá)每個(gè)ARM應(yīng)用實(shí)例所使用的指令集,ARM公司定義了6種主要的ARM指令集體系結(jié)構(gòu)版本,以版本號(hào)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),并明確了哪些指令會(huì)引起未定義指令異常發(fā)生,它相對(duì)V3版本作了以下的改進(jìn):增加半字加載/存儲(chǔ)指令;字節(jié)和半字的加載和符號(hào)擴(kuò)展指令;具有可以轉(zhuǎn)換到Thumb狀態(tài)的指令;增加使用用戶模式寄存器的系統(tǒng)模式。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V442.1ARM簡介各ARM體系結(jié)構(gòu)版本——V5
在V4版本的基礎(chǔ)上,對(duì)現(xiàn)在指令的定義進(jìn)行了必要的修正,對(duì)V4版本的體系結(jié)構(gòu)進(jìn)行了擴(kuò)展并并增加了指令,具體如下:改進(jìn)了ARM/Thumb狀態(tài)之間的切換效率;允許非T變量和T變量一樣,使用相同的代碼生成技術(shù);增加計(jì)數(shù)前導(dǎo)零指令和軟件斷點(diǎn)指令;對(duì)乘法指令如何設(shè)置標(biāo)志作了嚴(yán)格的定義。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V552.1ARM簡介ARM處理器核簡介ARM公司開發(fā)了很多系列的ARM處理器核,目前最新的系列已經(jīng)是ARM11了,而ARM6核以及更早的系列已經(jīng)很罕見了。目前應(yīng)用比較廣泛的系列是:ARM7ARM9ARM9EARM10Cortex-M3XscaleARM112.1ARM簡介ARM處理器核簡介ARM62.1ARM簡介ARM處理器核簡介——ARM7
該系列包括ARM7TDMI、ARM7TDMI-S、帶有高速緩存處理器宏單元的ARM720T和擴(kuò)充了Jazelle的ARM7EJ-S。該系列處理器提供Thumb16位壓縮指令集和EmbededICE軟件調(diào)試方式,適用于更大規(guī)模的SoC設(shè)計(jì)中。
ARM7系列廣泛應(yīng)用于多媒體和嵌入式設(shè)備,包括Internet設(shè)備、網(wǎng)絡(luò)和調(diào)制解調(diào)器設(shè)備,以及移動(dòng)電話、PDA等無線設(shè)備。2.1ARM簡介ARM處理器核簡介——ARM772.1ARM簡介ARM處理器核簡介——ARM9
該系列包括ARM9TDMI、ARM920T、ARM926和帶有高速緩存處理器宏單元的ARM940T。除了兼容ARM7系列,而且能夠更加靈活的設(shè)計(jì)。
PHILIPS最近推出的LPC3180就是基于ARM926的微處理器,即將推出的開發(fā)套件SmartARM3180支持Linux2.4、WinCE4.2,還有PC104等工控機(jī)系列產(chǎn)品。
ARM9系列主要應(yīng)用于引擎管理、儀器儀表、安全系統(tǒng)和機(jī)頂盒等領(lǐng)域。2.1ARM簡介ARM處理器核簡介——ARM982.1ARM簡介ARM處理器核簡介——Cortex-M3
該系列主要針對(duì)MCU市場,改進(jìn)了代碼密度,減少了中斷延遲,并有更低的功耗,支持Thumb-2指令集。開發(fā)套件:KeilRealView(包含ULINK仿真器),支持ARM7、ARM9以及Cortex-M3,ADS將停止支持Cortex-M3,預(yù)計(jì)市場上第一顆基于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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器102.2ARM7TDMI簡介ARM7TDMI支持32位尋址范圍,并彌補(bǔ)了ARM6不能在低于5V電源電壓下工作的不足。ARM7TDMI的后綴意義為:支持高密度16位的Thumb指令集;支持片上調(diào)試;支持64位乘法;支持EmbededICE觀察硬件;ARM7TDMI的可綜合(synthesizable)版本(軟核),對(duì)應(yīng)用工程師來說其編程模型與ARM7TDMI一致;ARM7TDMI-S2.2ARM7TDMI簡介ARM7TDM112.2ARM7TDMI三級(jí)流水線正在執(zhí)行的指令正在譯碼的指令正在預(yù)取的指令內(nèi)核流水線LDR R0,AddInstrSTR R0,NextInstrSUBR1,R1,#1...ADDR1,R1,#1(1)(2)(4)(3)源程序2.2ARM7TDMI三級(jí)流水線正在執(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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器132.7內(nèi)部寄存器R14寄存器與異常發(fā)生
異常發(fā)生時(shí),程序要跳轉(zhuǎn)至異常服務(wù)程序,對(duì)返回地址的處理與子程序調(diào)用類似,都是由硬件完成的。區(qū)別在于有些異常有一個(gè)小常量的偏移。2.7內(nèi)部寄存器R14寄存器與異常發(fā)生異14程序計(jì)數(shù)器R15(PC)
寄存器R15為程序計(jì)數(shù)器(PC),它指向正在取指的地址??梢哉J(rèn)為它是一個(gè)通用寄存器,但是對(duì)于它的使用有許多與指令相關(guān)的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結(jié)果將是不可預(yù)測的。程序計(jì)數(shù)器R15(PC)寄存器R15為程序計(jì)數(shù)152.7內(nèi)部寄存器讀R15的限制
正常操作時(shí),從R15讀取的值是處理器正在取指的地址,即當(dāng)前正在執(zhí)行指令的地址加上8個(gè)字節(jié)(兩條ARM指令的長度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。內(nèi)核流水線
取指
譯碼
執(zhí)行MOVADD……源程序PC(R15)PCPC-4PC-82.7內(nèi)部寄存器讀R15的限制正常操作時(shí)16MOVR0,PC
ADDSUB…2.7內(nèi)部寄存器讀R15的限制內(nèi)核流水線取指譯碼執(zhí)行SUBADDMOV程序代碼PC-8PC-4PC地址注意:執(zhí)行一條PC讀取指令時(shí),讀取的值并不是該行指令的地址值。MOVR0,PC2.7內(nèi)部寄存器讀R15的限制內(nèi)核170x4000 ADDPC,PC,#40x4004 …0x4008 …0x400C …
思考與練習(xí)?
假設(shè)CPU正在運(yùn)行以下的程序,并正在執(zhí)0x4000處的指令(它的作用是將PC值加4后寫入PC),請(qǐng)問指令執(zhí)行后PC值是什么?正被執(zhí)行正被譯碼PC指向指令執(zhí)行結(jié)果PC=PC+40x4000 ADDPC,PC,#4思考182.7內(nèi)部寄存器讀R15的限制
當(dāng)使用STR或STM指令保存R15時(shí),會(huì)有一個(gè)例外。這些指令可能將當(dāng)前指令地址加8字節(jié)或加12字節(jié)保存(將來可能還有其它數(shù)字)。偏移量是8還是12取決于具體的ARM芯片,但是對(duì)于一個(gè)確定的芯片,這個(gè)值是一個(gè)常量。所以最好避免使用STR和STM指令來保存R15,如果很難做到,那么應(yīng)當(dāng)在程序中計(jì)算出該芯片的偏移量。2.7內(nèi)部寄存器讀R15的限制當(dāng)使用ST192.7內(nèi)部寄存器讀R15的限制計(jì)算偏移量程序代碼:SUB R1,PC,#4 ;R1=下面STR指令的地址STR PC,[R0] ;保存STR指令地址+偏移量LDR R0,[R0] ;然后重裝SUB R0,R0,R1 ;計(jì)算偏移量2.7內(nèi)部寄存器讀R15的限制計(jì)算偏移量程序代碼:SUB202.7內(nèi)部寄存器寫R15的限制
正常操作時(shí),寫入R15的值被當(dāng)作一個(gè)指令地址,程序從這個(gè)地址處繼續(xù)執(zhí)行(相當(dāng)于執(zhí)行一次無條件跳轉(zhuǎn))。2.7內(nèi)部寄存器寫R15的限制正常操作時(shí)212.7內(nèi)部寄存器寫R15的限制
由于ARM指令以字為邊界,因此寫入R15的值最低兩位通常為0b00。具體的規(guī)則取決于內(nèi)核結(jié)構(gòu)的版本:在ARM結(jié)構(gòu)V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉(zhuǎn)地址由指令的實(shí)際目標(biāo)地址(寫入R15的值)和0xFFFFFFFC相與得到;在ARM結(jié)構(gòu)V4版及以上版本中,寫入R15的值的最低兩位為0,如果不是,結(jié)果將不可預(yù)測。2.7內(nèi)部寄存器寫R15的限制由于ARM22程序狀態(tài)寄存器CPSR
寄存器CPSR為程序狀態(tài)寄存器,在異常模式中,另外一個(gè)寄存器“程序狀態(tài)保存寄存器(SPSR)”可以被訪問。每種異常都有自己的SPSR,在因?yàn)楫惓J录M(jìn)入異常時(shí)它保存CPSR的當(dāng)前值,異常退出時(shí)可通過它恢復(fù)CPSR。詳細(xì)描述參看2.8小節(jié)。程序狀態(tài)寄存器CPSR寄存器CPSR為程序狀態(tài)232.7內(nèi)部寄存器Thumb狀態(tài)寄存器Thumb狀態(tài)寄存器集是ARM狀態(tài)集的子集,程序員可以直接訪問的寄存器為:8個(gè)通用寄存器R0~R7;程序計(jì)數(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)通用寄存器和程序計(jì)數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實(shí)際訪問的寄存器寄存器在匯編中的名稱寄存器類別注意:括號(hào)內(nèi)為ATPCS中寄存器的命名,可以使用RN匯編偽指令將寄存器定義多個(gè)名字。其中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)通用寄存器和程序計(jì)數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實(shí)際訪問的寄存器寄存器在匯編中的名稱寄存器類別R7R6R5R4R3R2R1R0
在匯編語言中寄存器R0~R7為保存數(shù)據(jù)或地址值的通用寄存器。對(duì)于任何處理器模式,它們中的每一個(gè)都對(duì)應(yīng)于相同的32位物理寄存器。它們是完全通用的寄存器,不會(huì)被體系結(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)通用寄存器和程序計(jì)數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實(shí)際訪問的寄存器寄存器在匯編中的名稱寄存器類別
堆棧指針SP對(duì)應(yīng)ARM狀態(tài)的寄存器R13。每個(gè)異常模式都有其自身的SP分組版本,SP通常指向各異常模式所專用的堆棧。
注意:在發(fā)生異常時(shí),處理器自動(dòng)進(jìn)入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)通用寄存器和程序計(jì)數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實(shí)際訪問的寄存器寄存器在匯編中的名稱寄存器類別
鏈接寄存器LR對(duì)應(yīng)ARM狀態(tài)寄存器R14,在結(jié)構(gòu)上有兩個(gè)特殊功能,詳見“ARM狀態(tài)下的鏈接寄存器LR”。
注意:在發(fā)生異常時(shí),處理器自動(dòng)進(jìn)入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)
程序計(jì)數(shù)器(PC)
當(dāng)前程序狀態(tài)寄存器
堆棧指針(R13)
連接寄存器(R14)
程序計(jì)數(shù)器(R15)
當(dāng)前程序狀態(tài)寄存器
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R0
堆棧指針(R13)
連接寄存器(R14)
程序計(jì)數(shù)器(R15)
Thumb狀態(tài)寄存器在Arm狀態(tài)寄存器上的映射低寄存器高寄存302.7內(nèi)部寄存器在Thumb狀態(tài)中訪問高寄存器
在Thumb狀態(tài)中,高寄存器(R8~R15)不是標(biāo)準(zhǔn)寄存器集的一部分。匯編語言程序員對(duì)它們的訪問受到限制,但可以將它們用于快速暫存??梢允褂肕OV、CMP和ADD指令對(duì)高寄存器操作,詳見第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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器322.8程序狀態(tài)寄存器簡介ARM7TDMI內(nèi)核包含1個(gè)CPSR和5個(gè)供異常處理程序使用的SPSR。CPSR反映了當(dāng)前處理器的狀態(tài),其包含:4個(gè)條件代碼標(biāo)志(負(fù)(N)、零(Z)、進(jìn)位(C)和溢出(V));2個(gè)中斷禁止位,分別控制一種類型的中斷;
5個(gè)對(duì)當(dāng)前處理器模式進(jìn)行編碼的位;1個(gè)用于指示當(dāng)前執(zhí)行指令(ARM還是Thumb)的位。2.8程序狀態(tài)寄存器簡介ARM7TDM33NZCV——IM0M1M2M3M4TF—...3130292827268765432102.8程序狀態(tài)寄存器簡介條件代碼標(biāo)志保留控制位溢出標(biāo)志進(jìn)位或借位擴(kuò)展零負(fù)或小于IRQ禁止FIQ禁止?fàn)顟B(tài)位模式位NZCVIM0M1M2M3M4TFCPSR寄存器的格式NZCV——IM0M1M2M3M4TF—...31342.8程序狀態(tài)寄存器簡介
每個(gè)異常模式還帶有一個(gè)程序狀態(tài)保存寄存器(SPSR),它用于保存在異常事件發(fā)生之前的CPSR。CPSR和SPSR通過特殊指令進(jìn)行訪問。詳細(xì)信息請(qǐng)參閱第3章。注意:如果通過程序修改CPSR寄存器中的模式位進(jìn)入異常模式,那么硬件將不會(huì)把CPSR保存至SPSR中。2.8程序狀態(tài)寄存器簡介每個(gè)異常模式還352.8程序狀態(tài)寄存器條件代碼標(biāo)志
大多數(shù)“數(shù)值處理指令”可以選擇是否影響條件代碼標(biāo)志位。通常如果指令帶S后綴,則該指令的執(zhí)行會(huì)影響條件代碼標(biāo)志;但有一些指令的執(zhí)行總是會(huì)影響條件代碼標(biāo)志。
N、Z、C和V位都是條件代碼標(biāo)志。通過算術(shù)操作、邏輯操作、MSR或者LDM指令可以對(duì)這些位進(jìn)行設(shè)置。所有ARM指令都可按條件來執(zhí)行,而Thumb指令中只有分支指令可按條件執(zhí)行。2.8程序狀態(tài)寄存器條件代碼標(biāo)志大多數(shù)“362.8程序狀態(tài)寄存器條件代碼標(biāo)志各標(biāo)志位的含義如下:N運(yùn)算結(jié)果的最高位反映在該標(biāo)志位。對(duì)于有符號(hào)二進(jìn)制補(bǔ)碼,結(jié)果為負(fù)數(shù)時(shí)N=1,結(jié)果為正數(shù)或零時(shí)N=0;Z指令結(jié)果為0時(shí)Z=1(通常表示比較結(jié)果“相等”),否則Z=0;2.8程序狀態(tài)寄存器條件代碼標(biāo)志各標(biāo)志位的含義如下:372.8程序狀態(tài)寄存器條件代碼標(biāo)志各標(biāo)志位的含義如下:C當(dāng)進(jìn)行加法運(yùn)算(包括CMN指令),并且最高位產(chǎn)生進(jìn)位時(shí)C=1,否則C=0。當(dāng)進(jìn)行減法運(yùn)算(包括CMP指令),并且最高位產(chǎn)生借位時(shí)C=0,否則C=1。對(duì)于結(jié)合移位操作的非加法/減法指令,C為從最高位最后移出的值,其它指令C通常不變;V當(dāng)進(jìn)行加法/減法運(yùn)算,并且發(fā)生有符號(hào)溢出時(shí)V=1,否則V=0,其它指令V通常不變。2.8程序狀態(tài)寄存器條件代碼標(biāo)志各標(biāo)志位的含義如下:382.8程序狀態(tài)寄存器控制位CPSR的最低8位為控制位,當(dāng)發(fā)生異常時(shí),這些位被硬件改變。當(dāng)處理器處于一個(gè)特權(quán)模式時(shí),可用軟件操作這些位。它們分別是:中斷禁止位;T位;模式位。2.8程序狀態(tài)寄存器控制位CPSR的最392.8程序狀態(tài)寄存器控制位中斷禁止位包括I和F位:當(dāng)I位置位時(shí),IRQ中斷被禁止;當(dāng)F位置位時(shí),F(xiàn)IQ中斷被禁止。T位反映了正在操作的狀態(tài):當(dāng)T位置位時(shí),處理器正在Thumb狀態(tài)下運(yùn)行;當(dāng)T位清零時(shí),處理器正在ARM狀態(tài)下運(yùn)行。2.8程序狀態(tài)寄存器控制位中斷禁止位包括I和F位:402.8程序狀態(tài)寄存器控制位模式位包括M4、M3、M2、M1和M0,這些位決定處理器的操作模式。注意:不是所有模式位的組合都定義了有效的處理器模式,如果使用了錯(cuò)誤的設(shè)置,將引起一個(gè)無法恢復(fù)的錯(cuò)誤。2.8程序狀態(tài)寄存器控制位模式位包括M4、M3、M2、M41CPSR模式位設(shè)置表CPSR模式位設(shè)置表422.8程序狀態(tài)寄存器保留位CPSR中的保留位被保留將來使用。為了提高程序的可移植性,當(dāng)改變CPSR標(biāo)志和控制位時(shí),請(qǐng)不要改變這些保留位。另外,請(qǐng)確保您程序的運(yùn)行不受保留位的值影響,因?yàn)閷淼奶幚砥骺赡軙?huì)將這些位設(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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器442.9異常簡介
只要正常的程序流被暫時(shí)中止,處理器就進(jìn)入異常模式。例如響應(yīng)一個(gè)來自外設(shè)的中斷。在處理異常之前,ARM7TDMI內(nèi)核保存當(dāng)前的處理器狀態(tài),這樣當(dāng)處理程序結(jié)束時(shí)可以恢復(fù)執(zhí)行原來的程序。如果同時(shí)發(fā)生兩個(gè)或更多異常,那么將按照固定的順序來處理異常,詳見“異常優(yōu)先級(jí)”部分。2.9異常簡介只要正常的程序流被暫時(shí)中止452.9異常異常的入口和出口處理
如果異常處理程序已經(jīng)把返回地址拷貝到堆棧,那么可以使用一條多寄存器傳送指令來恢復(fù)用戶寄存器并實(shí)現(xiàn)返回。SUBLR,LR,#4 ;計(jì)算返回地址STMFDSP!,{R0-R3,LR} ;保存使用到的寄存器...LDMFDSP!,{R0-R3,PC}^ ;中斷返回中斷處理代碼的開始部分和退出部分2.9異常異常的入口和出口處理如果異常處理程序46
如果異常處理程序已經(jīng)把返回地址拷貝到堆棧,那么可以使用一條多寄存器傳送指令來恢復(fù)用戶寄存器并實(shí)現(xiàn)返回。中斷處理代碼的開始部分和退出部分2.9異常異常的入口和出口處理SUBLR,LR,#4 ;計(jì)算返回地址STMFDSP!,{R0-R3,LR} ;保存使用到的寄存器...LDMFDSP!,{R0-R3,PC}^ ;中斷返回注意:中斷返回指令的寄存器列表(其中必須包括PC)后的“^”符號(hào)表示這是一條特殊形式的指令。這條指令在從存儲(chǔ)器中裝載PC的同時(shí)(PC是最后恢復(fù)的),CPSR也得到恢復(fù)。這里使用的堆棧指針SP(R13)是屬于異常模式的寄存器,每個(gè)異常模式有自己的堆棧指針。這個(gè)堆棧指針應(yīng)必須在系統(tǒng)啟動(dòng)時(shí)初始化。如果異常處理程序已經(jīng)把返回地址拷貝到堆棧,那么可以472.9異常進(jìn)入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會(huì)作以下工作:1.在適當(dāng)?shù)腖R中保存下一條指令的地址,當(dāng)異常入口來自:ARM狀態(tài),那么ARM7TDMI將下一條指令地址復(fù)制到LR中;為ARM或Thumb狀態(tài),那么ARM7TDMI將當(dāng)前指令地址加4或加8(取決于異常的類型)復(fù)制到LR中;異常處理器程序不必確定狀態(tài)。2.9異常進(jìn)入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會(huì)作482.9異常進(jìn)入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會(huì)作以下工作:2.將CPSR復(fù)制到適當(dāng)?shù)腟PSR中;3.將CPSR模式位強(qiáng)制設(shè)置為與異常類型相對(duì)應(yīng)的值;4.強(qiáng)制PC從相關(guān)的異常向量處取指。2.9異常進(jìn)入異常在異常發(fā)生后,ARM7TDMI內(nèi)核會(huì)作49ARM7TDMI內(nèi)核在中斷異常時(shí)置位中斷禁止標(biāo)志,這樣可以防止不受控制的異常嵌套。注:異??偸窃贏RM狀態(tài)中進(jìn)行處理。當(dāng)處理器處于Thumb狀態(tài)時(shí)發(fā)生了異常,在異常向量地址裝入PC時(shí),會(huì)自動(dòng)切換到ARM狀態(tài)。2.9異常進(jìn)入異常ARM7TDMI內(nèi)核在中斷異常時(shí)置位中斷禁止50當(dāng)異常結(jié)束時(shí),異常處理程序必須:1.將LR中的值減去偏移量后存入PC,偏移量根據(jù)異常的類型而有所不同;2.將SPSR的值復(fù)制回CPSR;3.清零在入口置位的中斷禁止標(biāo)志。注:恢復(fù)CPSR的動(dòng)作會(huì)將T、F和I位自動(dòng)恢復(fù)為異常發(fā)生前的值。2.9異常退出異常當(dāng)異常結(jié)束時(shí),異常處理程序必須:2.9異常退出異常51程序AIRQ服務(wù)程序系統(tǒng)模式IRQ模式程序寄存器組圖示進(jìn)入異常過程1.程序在系統(tǒng)模式下運(yùn)行用戶程序,假定當(dāng)前處理器狀態(tài)為Thumb狀態(tài)、允許IRQ中斷;2.用戶程序運(yùn)行時(shí)發(fā)生IRQ中斷,硬件完成以下動(dòng)作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV置位I位(禁止IRQ中斷)清零T位(進(jìn)入ARM狀態(tài))設(shè)置MOD位,切換處理器模式至IRQ模式將下一條指令的地址存入IRQ模式的LR寄存器將CPSR寄存器內(nèi)容存入IRQ模式的SPSR寄存器將跳轉(zhuǎn)地址存入PC,實(shí)現(xiàn)跳轉(zhuǎn)IRQ0?1...????BackAddrJumpAddrJumpSYS1?0...????“?”表示對(duì)該位不關(guān)心程序AIRQ服務(wù)程序系統(tǒng)模式IRQ模式程序寄存器組圖示進(jìn)入異52在異常處理結(jié)束后,異常處理程序完成以下動(dòng)作:程序AIRQ服務(wù)程序系統(tǒng)模式IRQ模式程序寄存器組圖示退出異常過程LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV將SPSR寄存器的值復(fù)制回CPSR寄存器;將LR寄存的值減去一個(gè)常量后復(fù)制到PC寄存器,跳轉(zhuǎn)到被中斷的用戶程序。IRQ0?1...????BackAddrJumpAddrreturnSYS1?0...????SYS1?0...????BackAddr-4Jump“?”表示對(duì)該位不關(guān)心在異常處理結(jié)束后,異常處理程序完成以下動(dòng)作:程序AIRQ服務(wù)53FIQ和IRQ中斷請(qǐng)求由ARM內(nèi)核的nFIQ和nIRQ信號(hào)線輸入,當(dāng)信號(hào)線上出現(xiàn)有效觸發(fā)電平時(shí),產(chǎn)生相應(yīng)的FIQ或IRQ中斷,ARM核進(jìn)入相應(yīng)的異常模式。2.9異常FIQ和IRQ中斷請(qǐng)求FIQ和IRQ中斷請(qǐng)求由ARM內(nèi)核的nFIQ54
快速中斷請(qǐng)求(FIQ)適用于對(duì)一個(gè)突發(fā)事件的快速響應(yīng),這得益于在ARM狀態(tài)中,快中斷模式有8個(gè)專用的寄存器可用來滿足寄存器保護(hù)的需要(這可以加速上下文切換的速度)。2.9異??焖僦袛嗾?qǐng)求
與其它模式相比,它有更多的自有寄存器,可以減少程序中堆棧的操作,提高處理速度??焖僦袛嗾?qǐng)求(FIQ)適用于對(duì)一個(gè)突發(fā)事件的55
不管異常入口是來自ARM狀態(tài)還是Thumb狀態(tài),F(xiàn)IQ處理程序都會(huì)通過執(zhí)行下面的指令從中斷返回:SUBSPC,R14_fiq,#4
在一個(gè)特權(quán)模式中,可以通過置位CPSR中的F位來禁止FIQ異常。2.9異??焖僦袛嗾?qǐng)求不管異常入口是來自ARM狀態(tài)還是Thumb狀56
中斷請(qǐng)求(IRQ)異常是一個(gè)由nIRQ輸入端的低電平所產(chǎn)生的正常中斷(在具體的芯片中,nIRQ由片內(nèi)外設(shè)拉低,nIRQ是內(nèi)核的一個(gè)信號(hào),對(duì)用戶不可見)。IRQ的優(yōu)先級(jí)低于FIQ。對(duì)于FIQ序列它是被屏蔽的。任何時(shí)候在一個(gè)特權(quán)模式下,都可通過置位CPSR中的I位來禁止IRQ。不管異常入口是來自ARM狀態(tài)還是Thumb狀態(tài),F(xiàn)IQ處理程序都會(huì)通過執(zhí)行下面的指令從中斷返回:SUBSPC,R14_irq,#42.9異常中斷請(qǐng)求中斷請(qǐng)求(IRQ)異常是一個(gè)由nIRQ輸入端57指令A(yù)指令B指令C……正常程序流代碼2.9異常IRQ與FIQ的返回地址處理中斷發(fā)生時(shí)正在執(zhí)行的指令中斷發(fā)生時(shí)PC指向的指令void__irqINT_Express(){
服務(wù)代碼}//
SUBSpc,r14,#4C語言中斷服務(wù)程序指令A(yù)指令B指令C……正常程序流代碼2.9異常IRQ與F58
中止發(fā)生在對(duì)存儲(chǔ)器的訪問不能完成時(shí)。例如試圖訪問一個(gè)保留地址或未分配區(qū)域的地址,ARM處理器將產(chǎn)生中止異常。中止包含兩種類型:預(yù)取中止發(fā)生在指令預(yù)取過程中數(shù)據(jù)中止發(fā)生在對(duì)數(shù)據(jù)訪問時(shí)2.9異常中止中止發(fā)生在對(duì)存儲(chǔ)器的訪問不能完成時(shí)。例如試圖59例如:LPC2000微控制器會(huì)發(fā)生中止異常的區(qū)域:FlashSRAMBootBlockVPB地址空間AHB1.特定的ARM器件所沒有的存儲(chǔ)器映射區(qū)域;2.AHB外設(shè)空間中未分配的區(qū)域;3.VPB外設(shè)空間中未分配的區(qū)域。2.9異常中止231例如:FlashSRAMBootBlockVPB地址空間A60
當(dāng)發(fā)生預(yù)取中止時(shí),ARM7TDMI內(nèi)核將預(yù)取的指令標(biāo)記為無效,但在指令到達(dá)流水線的執(zhí)行階段時(shí)才進(jìn)入異常。如果指令在流水線中因?yàn)榘l(fā)生分支而沒有被執(zhí)行,中止將不會(huì)發(fā)生。在處理中止的原因之后,不管處于哪種處理器操作狀態(tài),處理程序都會(huì)執(zhí)行下面的指令恢復(fù)PC和CPSR并重試被中止的指令:
SUBSPC,R14_abt,#42.9異常中止——預(yù)取指中止當(dāng)發(fā)生預(yù)取中止時(shí),ARM7TDMI內(nèi)核將預(yù)取61指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A(yù)取指譯碼執(zhí)行存儲(chǔ)器程序存儲(chǔ)器第N次取指2.9異常中止——預(yù)取指中止指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指譯碼執(zhí)行指令C62第N+1次取指指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A(yù)無效指令指令C指令B取指譯碼執(zhí)行存儲(chǔ)器程序存儲(chǔ)器2.9異常中止——預(yù)取指中止第N+1次取指指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指63第N+2次取指指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A(yù)無效指令指令C指令B取指譯碼執(zhí)行無效指令無效指令指令C存儲(chǔ)器程序存儲(chǔ)器2.9異常中止——預(yù)取指中止第N+2次取指指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指64指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指譯碼執(zhí)行指令C指令B指令A(yù)無效指令指令C指令B取指譯碼執(zhí)行無效指令無效指令指令C無效指令無效指令無效指令存儲(chǔ)器程序存儲(chǔ)器
第N+3次取指,此時(shí)流水線的執(zhí)行級(jí)執(zhí)行了無效指令,發(fā)生預(yù)取指中止。如果指令C為跳轉(zhuǎn)指令則可以避免預(yù)取指中止的發(fā)生。2.9異常中止——預(yù)取指中止指令流水線指令C指令B指令A(yù)存儲(chǔ)器無效區(qū)域取指譯碼執(zhí)行指令C65
當(dāng)發(fā)生數(shù)據(jù)中止后,根據(jù)產(chǎn)生數(shù)據(jù)中止的指令類型作出不同的處理。2.9異常中止——數(shù)據(jù)中止
在修復(fù)產(chǎn)生中止的原因后,不管處于哪種處理器操作狀態(tài),處理程序都必須執(zhí)行下面的返回指令:
SUBSPC,R14_abt,#8當(dāng)發(fā)生數(shù)據(jù)中止后,根據(jù)產(chǎn)生數(shù)據(jù)中止的指令類型66
使用軟件中斷(SWI)指令可以進(jìn)入管理模式,通常用于請(qǐng)求一個(gè)特定的管理函數(shù)。SWI處理程序通過執(zhí)行下面的指令返回:MOVSPC,R14_svc
這個(gè)動(dòng)作恢復(fù)了PC和CPSR并返回到SWI之后的指令。SWI處理程序讀取操作碼以提取SWI函數(shù)編號(hào)。2.9異常軟件中斷指令使用軟件中斷(SWI)指令可以進(jìn)入管理模67用戶程序服務(wù)程序用戶模式管理模式程序SWI指令return2.9異常軟件中斷指令Jump實(shí)現(xiàn)操作系統(tǒng)的系統(tǒng)調(diào)用11.執(zhí)行用戶程序中的軟件中斷指令,產(chǎn)生軟件中斷異常,通常用于系統(tǒng)調(diào)用;2.執(zhí)行異常處理程序,并返回。2用戶程序服務(wù)程序用戶模式管理模式程序SWI指令return268
當(dāng)ARM7TDMI處理器遇到一條自己和系統(tǒng)內(nèi)任何協(xié)處理器都無法處理的指令時(shí),ARM7TDMI內(nèi)核執(zhí)行未定義指令陷阱。軟件可使用這一機(jī)制通過模擬未定義的協(xié)處理器指令來擴(kuò)展ARM指令集。注:ARM7TDMI處理器完全遵循ARM結(jié)構(gòu)v4T,可以捕獲所有分類未被定義的指令位格式。2.9異常未定義的指令當(dāng)ARM7TDMI處理器遇到一條自己和系692.9異常未定義的指令用戶程序服務(wù)程序用戶模式未定義模式程序未定義指令returnJump解釋無法執(zhí)行的指令,并完成其功能11.執(zhí)行用戶程序時(shí)遇到無法執(zhí)行的指令,產(chǎn)生未定義指令異常;3.異常處理程序執(zhí)行結(jié)束后返回。32.在服務(wù)程序中取出無法執(zhí)行指令,完成其功能;22.9異常未定義的指令用戶程序服務(wù)程序用戶模式未定義模式70
在模擬處理了失敗的指令后,陷阱程序執(zhí)行下面的指令:MOVSPC,R14_und
這個(gè)動(dòng)作恢復(fù)了PC和CPSR并返回到未定義指令之后的指令。2.9異常未定義的指令在模擬處理了失敗的指令后,陷阱程序執(zhí)行下面的指令:71異常向量注:表中的I和F表示不對(duì)該位有影響,保留原來的值。異常向量注:表中的I和F表示不對(duì)該位有影響,保留原來的值。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)地址后向服務(wù)程序跳轉(zhuǎn)CODE32AREAvectors,CODE,READONLYENTRYResetLDRPC,ResetAddrLDRPC,UndefinedAddr...DCD0xb9205f80LDRPC,[PC,#-0xff0]LDRPC,FIQ_AddrResetAddrDCDResetInitUndefinedAddrDCDUndefined...NouseDCD0IRQ_AddrDCDIRQ_HandlerFIQ_AddrDCDFIQ_Handler異常向量表:ResetInit
復(fù)位服務(wù)程序Undefine
未定義服務(wù)程序IRQ_Handler
IRQ中斷服務(wù)程序FIQ_HandlerFIQ中斷服務(wù)程序……CODE32異常向量表:取出跳轉(zhuǎn)地址后向服務(wù)74
當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí),一個(gè)固定的優(yōu)先級(jí)系統(tǒng)決定它們被處理的順序:2.9異常異常優(yōu)先級(jí)優(yōu)先級(jí)降低當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí),一個(gè)固定的優(yōu)先級(jí)系75注意:未定義的指令和SWI異?;コ?。因?yàn)橥粭l指令不能既是未定義的,又能產(chǎn)生有效的軟件中斷;當(dāng)FIQ使能,并且FIQ和數(shù)據(jù)中止異常同時(shí)發(fā)生時(shí),ARM7TDMI內(nèi)核首先進(jìn)入數(shù)據(jù)中止處理程序,然后立即跳轉(zhuǎn)到FIQ向量。在FIQ處理結(jié)束后返回到數(shù)據(jù)中止處理程序。數(shù)據(jù)中止的優(yōu)先級(jí)必須高于FIQ以確保數(shù)據(jù)轉(zhuǎn)移錯(cuò)誤不會(huì)被漏過。2.9異常異常優(yōu)先級(jí)注意:2.9異常異常優(yōu)先級(jí)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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器772.11復(fù)位復(fù)位
當(dāng)nRESET信號(hào)被拉低時(shí)(一般外部復(fù)位引腳電平的變化和芯片的其它復(fù)位源會(huì)改變這個(gè)內(nèi)核信號(hào)),ARM7TDMI處理器放棄正在執(zhí)行的指令。
在復(fù)位后,除PC和CPSR之外的所有寄存器的值都不確定。2.11復(fù)位復(fù)位當(dāng)nRESET信號(hào)被拉低782.11復(fù)位復(fù)位
當(dāng)nRESET信號(hào)再次變?yōu)楦唠娖綍r(shí),ARM處理器執(zhí)行下列操作:1.強(qiáng)制M[4:0]變?yōu)閎10011(管理模式);2.置位CPSR中的I和F位;3.清零CPSR中的T位;4.強(qiáng)制PC從地址0x00開始對(duì)下一條指令進(jìn)行取指。2.11復(fù)位復(fù)位當(dāng)nRESET信號(hào)再次變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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器802.12存儲(chǔ)器及存儲(chǔ)器映射I/O簡介ARM7TDMI處理器采用馮·諾依曼(VonNeumann)結(jié)構(gòu),指令和數(shù)據(jù)共用一條32位數(shù)據(jù)總線。只有裝載、保存和交換指令可訪問存儲(chǔ)器中的數(shù)據(jù)。2.12存儲(chǔ)器及存儲(chǔ)器映射I/O簡介AR812.12存儲(chǔ)器及存儲(chǔ)器映射I/O簡介ARM7的規(guī)范僅定義了處理器核與存儲(chǔ)系統(tǒng)之間的信號(hào)及時(shí)序(局部總線),而現(xiàn)實(shí)的芯片一般在外部總線與處理器核的局部總線之間有一個(gè)存儲(chǔ)器管理部件將局部總線的信號(hào)和時(shí)序轉(zhuǎn)換為現(xiàn)實(shí)的外部總線信號(hào)和時(shí)序。因此,外部總線的信號(hào)和時(shí)序與具體的芯片相關(guān),不是ARM7的標(biāo)準(zhǔn)。具體到某個(gè)芯片的外部存儲(chǔ)系統(tǒng)的設(shè)計(jì)需要參考其芯片的數(shù)據(jù)手冊(cè)或使用手冊(cè)等資料。2.12存儲(chǔ)器及存儲(chǔ)器映射I/O簡介AR82ARM7內(nèi)核存儲(chǔ)器控制器存儲(chǔ)器2.12存儲(chǔ)器及存儲(chǔ)器映射I/O簡介ARM7定義了局部總線的接口時(shí)序各芯片廠商制定了自己的接口時(shí)序ARM7局部總線一般在兩者之間加入存儲(chǔ)器控制器ARM7存儲(chǔ)器存儲(chǔ)器2.12存儲(chǔ)器及存儲(chǔ)器映射I/O簡介83存儲(chǔ)器系統(tǒng)有兩種映射機(jī)制:小端存儲(chǔ)器系統(tǒng):在小端格式中,數(shù)據(jù)的高字節(jié)存放在高地址中。因此存儲(chǔ)器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線7~0。大端存儲(chǔ)器系統(tǒng):在大端格式中,數(shù)據(jù)的高字節(jié)存放在低地址中。因此存儲(chǔ)器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線31~24。0x87654321字?jǐn)?shù)據(jù)的大小端存儲(chǔ)方式2.12存儲(chǔ)器及存儲(chǔ)器映射I/O存儲(chǔ)器格式0x78高地址低地址0x560x340x12大端模式0x12高地址低地址0x340x560x78小端模式存儲(chǔ)器系統(tǒng)有兩種映射機(jī)制:0x87654321字?jǐn)?shù)據(jù)的大小端84
一個(gè)基于ARM內(nèi)核的芯片可以只支持大端模式或小端模式,也可以兩者都支持。在ARM指令集中不包含任何直接選擇大小端的指令,但是一個(gè)同時(shí)支持大小端模式的ARM芯片可以通過硬件配置(一般使用芯片的引腳來配置)來匹配存儲(chǔ)器系統(tǒng)所使用的規(guī)則。2.12存儲(chǔ)器及存儲(chǔ)器映射I/O存儲(chǔ)器格式注意:如果實(shí)際的存儲(chǔ)器格式與芯片的存儲(chǔ)器格式不符時(shí),只有以字為單位的數(shù)據(jù)存取才正確,否則將出現(xiàn)不可預(yù)期的結(jié)果。一個(gè)基于ARM內(nèi)核的芯片可以只支持大端模式或85ARM結(jié)構(gòu)通常希望所有的存儲(chǔ)器訪問都合理的對(duì)齊。具體來說就是字訪問的地址通常是字對(duì)齊的,而半字訪問使用的地址是半字對(duì)齊的。不按這種方式對(duì)齊的存儲(chǔ)器訪問稱為非對(duì)齊的存儲(chǔ)器訪問。將一個(gè)非字(半字)對(duì)齊的地址寫入ARM(Thumb)狀態(tài)的R15寄存器,將引起非對(duì)齊的指令取指。在一個(gè)非字(半字)對(duì)齊的地址讀寫一個(gè)字(半字),將引起非對(duì)齊的數(shù)據(jù)訪問:2.12存儲(chǔ)器及存儲(chǔ)器映射I/O非對(duì)齊的存儲(chǔ)器訪問ARM結(jié)構(gòu)通常希望所有的存儲(chǔ)器訪問都合理的對(duì)86
基于ARM內(nèi)核的芯片具有許多的外設(shè),這些外設(shè)訪問的標(biāo)準(zhǔn)方法是使用存儲(chǔ)器映射的I/O,為外設(shè)的每個(gè)寄存器都分配一個(gè)地址。通常,從這些地址裝載數(shù)據(jù)用于讀入,向這些地址保存數(shù)據(jù)用于輸出。有些地址的裝載和保存用于外設(shè)的控制功能,而不是輸入或輸出功能。2.12存儲(chǔ)器及存儲(chǔ)器映射I/O存儲(chǔ)器映射的I/O注意:存儲(chǔ)器映射的I/O位置的操作不同于正常的存儲(chǔ)器位置的操作。通常,存儲(chǔ)器映射的I/O位置沒有高速緩存和無緩沖區(qū)。基于ARM內(nèi)核的芯片具有許多的外設(shè),這些外設(shè)872.12存儲(chǔ)器及存儲(chǔ)器映射I/O存儲(chǔ)器映射的I/O存儲(chǔ)器區(qū)memory外設(shè)區(qū)域地址空間0x000000000xE0000000ARM核操作外設(shè)操作存儲(chǔ)器存儲(chǔ)器控制器2.12存儲(chǔ)器及存儲(chǔ)器映射I/O存儲(chǔ)器映射的I/O存儲(chǔ)器882.12存儲(chǔ)器及存儲(chǔ)器映射I/O使用C語言如何訪問存儲(chǔ)器和外設(shè)<main.c>…uint32IOStatus;IOStatus=IO0PIN;…<LPC2200.h>...#defineIO0PIN(*((volatileunsignedlong*)0xE0028000))...2.12存儲(chǔ)器及存儲(chǔ)器映射I/O使用C語言如何訪問存儲(chǔ)器89電腦打鈴器硬件框圖CPULPC2132鍵盤輸入輸出接口2005年11月1
11:00
星期六
下次動(dòng)作:1-2
11:10液晶顯示任務(wù)1鍵盤檢測任務(wù)4輸出控制任務(wù)3信息顯示任務(wù)2鍵盤處理電腦打鈴器硬件框圖CPU鍵輸2005年11月111:090用戶模式USR系統(tǒng)模式SYS管理模式SVCIRQ模式IRQFIQ模式FIQ中止模式未定義abt/undThumb狀態(tài)ARM狀態(tài)任務(wù)1按鍵檢測任務(wù)2按鍵處理任務(wù)3信息顯示任務(wù)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任務(wù)切換IRQ1系統(tǒng)節(jié)拍FIQ1掉電處理While(1)電腦打鈴器程序分布示意圖其它代碼操作系統(tǒng)內(nèi)核用戶模式系統(tǒng)模式管理模式IRQ模式FIQ模式中止模式Thum91
思考與練習(xí)?1.我們已經(jīng)學(xué)習(xí)了ARM的模式和狀態(tài)等知識(shí),請(qǐng)考慮如何將原有的程序移植到ARM上運(yùn)行,模式和狀態(tài)要如何選擇?思考與練習(xí)?1.我們已經(jīng)學(xué)習(xí)了ARM的模式和狀態(tài)等知識(shí),請(qǐng)92ARM7體系結(jié)構(gòu)概述課件932.1ARM簡介ARM體系結(jié)構(gòu)ARM處理器為RISC芯片,其簡單的結(jié)構(gòu)使ARM內(nèi)核非常小,這使得器件的功耗也非常低。它具有經(jīng)典RISC的特點(diǎn):寄存器:具有更多的通用寄存器;裝載/保存結(jié)構(gòu):處理器操作只針對(duì)寄存器的內(nèi)容,而不直接對(duì)存儲(chǔ)器進(jìn)行操作;流水線:將指令處理過程分為多步,提高效率;指令長度:統(tǒng)一長度的指令域,簡化指令譯碼。2.1ARM簡介ARM體系結(jié)構(gòu)ARM處理942.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點(diǎn),使其非常適用于嵌入式系統(tǒng):低功耗:對(duì)于電池供電的設(shè)備,功耗無疑是重點(diǎn);高代碼密度:小的代碼量可以減小存儲(chǔ)成本;小面積:芯片內(nèi)可以集成更多的外設(shè),使系統(tǒng)硬件更緊湊簡潔;方便的硬件調(diào)試技術(shù):降低開發(fā)難度和成本。2.1ARM簡介ARM體系結(jié)構(gòu) ARM體系結(jié)構(gòu)的特點(diǎn),使952.1ARM簡介各ARM體系結(jié)構(gòu)版本ARM體系結(jié)構(gòu)從最初開發(fā)到現(xiàn)在有了巨大的改進(jìn),并仍在完善和發(fā)展。為了清楚的表達(dá)每個(gè)ARM應(yīng)用實(shí)例所使用的指令集,ARM公司定義了6種主要的ARM指令集體系結(jié)構(gòu)版本,以版本號(hào)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),并明確了哪些指令會(huì)引起未定義指令異常發(fā)生,它相對(duì)V3版本作了以下的改進(jìn):增加半字加載/存儲(chǔ)指令;字節(jié)和半字的加載和符號(hào)擴(kuò)展指令;具有可以轉(zhuǎn)換到Thumb狀態(tài)的指令;增加使用用戶模式寄存器的系統(tǒng)模式。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V4972.1ARM簡介各ARM體系結(jié)構(gòu)版本——V5
在V4版本的基礎(chǔ)上,對(duì)現(xiàn)在指令的定義進(jìn)行了必要的修正,對(duì)V4版本的體系結(jié)構(gòu)進(jìn)行了擴(kuò)展并并增加了指令,具體如下:改進(jìn)了ARM/Thumb狀態(tài)之間的切換效率;允許非T變量和T變量一樣,使用相同的代碼生成技術(shù);增加計(jì)數(shù)前導(dǎo)零指令和軟件斷點(diǎn)指令;對(duì)乘法指令如何設(shè)置標(biāo)志作了嚴(yán)格的定義。2.1ARM簡介各ARM體系結(jié)構(gòu)版本——V5982.1ARM簡介ARM處理器核簡介ARM公司開發(fā)了很多系列的ARM處理器核,目前最新的系列已經(jīng)是ARM11了,而ARM6核以及更早的系列已經(jīng)很罕見了。目前應(yīng)用比較廣泛的系列是:ARM7ARM9ARM9EARM10Cortex-M3XscaleARM112.1ARM簡介ARM處理器核簡介ARM992.1ARM簡介ARM處理器核簡介——ARM7
該系列包括ARM7TDMI、ARM7TDMI-S、帶有高速緩存處理器宏單元的ARM720T和擴(kuò)充了Jazelle的ARM7EJ-S。該系列處理器提供Thumb16位壓縮指令集和EmbededICE軟件調(diào)試方式,適用于更大規(guī)模的SoC設(shè)計(jì)中。
ARM7系列廣泛應(yīng)用于多媒體和嵌入式設(shè)備,包括Internet設(shè)備、網(wǎng)絡(luò)和調(diào)制解調(diào)器設(shè)備,以及移動(dòng)電話、PDA等無線設(shè)備。2.1ARM簡介ARM處理器核簡介——ARM71002.1ARM簡介ARM處理器核簡介——ARM9
該系列包括ARM9TDMI、ARM920T、ARM926和帶有高速緩存處理器宏單元的ARM940T。除了兼容ARM7系列,而且能夠更加靈活的設(shè)計(jì)。
PHILIPS最近推出的LPC3180就是基于ARM926的微處理器,即將推出的開發(fā)套件SmartARM3180支持Linux2.4、WinCE4.2,還有PC104等工控機(jī)系列產(chǎn)品。
ARM9系列主要應(yīng)用于引擎管理、儀器儀表、安全系統(tǒng)和機(jī)頂盒等領(lǐng)域。2.1ARM簡介ARM處理器核簡介——ARM91012.1ARM簡介ARM處理器核簡介——Cortex-M3
該系列主要針對(duì)MCU市場,改進(jìn)了代碼密度,減少了中斷延遲,并有更低的功耗,支持Thumb-2指令集。開發(fā)套件:KeilRealView(包含ULINK仿真器),支持ARM7、ARM9以及Cortex-M3,ADS將停止支持Cortex-M3,預(yù)計(jì)市場上第一顆基于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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器1032.2ARM7TDMI簡介ARM7TDMI支持32位尋址范圍,并彌補(bǔ)了ARM6不能在低于5V電源電壓下工作的不足。ARM7TDMI的后綴意義為:支持高密度16位的Thumb指令集;支持片上調(diào)試;支持64位乘法;支持EmbededICE觀察硬件;ARM7TDMI的可綜合(synthesizable)版本(軟核),對(duì)應(yīng)用工程師來說其編程模型與ARM7TDMI一致;ARM7TDMI-S2.2ARM7TDMI簡介ARM7TDM1042.2ARM7TDMI三級(jí)流水線正在執(zhí)行的指令正在譯碼的指令正在預(yù)取的指令內(nèi)核流水線LDR R0,AddInstrSTR R0,NextInstrSUBR1,R1,#1...ADDR1,R1,#1(1)(2)(4)(3)源程序2.2ARM7TDMI三級(jí)流水線正在執(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.復(fù)位12.存儲(chǔ)器及存儲(chǔ)器映射I/O第2章目錄1.簡介7.內(nèi)部寄存器1062.7內(nèi)部寄存器R14寄存器與異常發(fā)生
異常發(fā)生時(shí),程序要跳轉(zhuǎn)至異常服務(wù)程序,對(duì)返回地址的處理與子程序調(diào)用類似,都是由硬件完成的。區(qū)別在于有些異常有一個(gè)小常量的偏移。2.7內(nèi)部寄存器R14寄存器與異常發(fā)生異107程序計(jì)數(shù)器R15(PC)
寄存器R15為程序計(jì)數(shù)器(PC),它指向正在取指的地址??梢哉J(rèn)為它是一個(gè)通用寄存器,但是對(duì)于它的使用有許多與指令相關(guān)的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結(jié)果將是不可預(yù)測的。程序計(jì)數(shù)器R15(PC)寄存器R15為程序計(jì)數(shù)1082.7內(nèi)部寄存器讀R15的限制
正常操作時(shí),從R15讀取的值是處理器正在取指的地址,即當(dāng)前正在執(zhí)行指令的地址加上8個(gè)字節(jié)(兩條ARM指令的長度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。內(nèi)核流水線
取指
譯碼
執(zhí)行MOVADD……源程序PC(R15)PCPC-4PC-82.7內(nèi)部寄存器讀R15的限制正常操作時(shí)109MOVR0,PC
ADDSUB…2.7內(nèi)部寄存器讀R15的限制內(nèi)核流水線取指譯碼執(zhí)行SUBADDMOV程序代碼PC-8PC-4PC地址注意:執(zhí)行一條PC讀取指令時(shí),讀取的值并不是該行指令的地址值。MOVR0,PC2.7內(nèi)部寄存器讀R15的限制內(nèi)核1100x4000 ADDPC,PC,#40x4004 …0x4008 …0x400C …
思考與練習(xí)?
假設(shè)CPU正在運(yùn)行以下的程序,并正在執(zhí)0x4000處的指令(它的作用是將PC值加4后寫入PC),請(qǐng)問指令執(zhí)行后PC值是什么?正被執(zhí)行正被譯碼PC指向指令執(zhí)行結(jié)果PC=PC+40x4000 ADDPC,PC,#4思考1112.7內(nèi)部寄存器讀R15的限制
當(dāng)使用STR或STM指令保存R15時(shí),會(huì)有一個(gè)例外。這些指令可能將當(dāng)前指令地址加8字節(jié)或加12字節(jié)保存(將來可能還有其它數(shù)字)。偏移量是8還是12取決于具體的ARM芯片,但是對(duì)于一個(gè)確定的芯片,這個(gè)值是一個(gè)常量。所以最好避免使用STR和STM指令來保存R15,如果很難做到,那么應(yīng)當(dāng)在程序中計(jì)算出該芯片的偏移量。2.7內(nèi)部寄存器讀R15的限制當(dāng)使用ST1122.7內(nèi)部寄存器讀R15的限制計(jì)算偏移量程序代碼:SUB R1,PC,#4 ;R1=下面STR指令的地址STR PC,[R0] ;保存STR指令地址+偏移量LDR R0,[R0] ;然后重裝SUB R0,R0,R1 ;計(jì)算偏移量2.7內(nèi)部寄存器讀R15的限制計(jì)算偏移量程序代碼:SUB1132.7內(nèi)部寄存器寫R15的限制
正常操作時(shí),寫入R15的值被當(dāng)作一個(gè)指令地址,程序從這個(gè)地址處繼續(xù)執(zhí)行(相當(dāng)于執(zhí)行一次無條件跳轉(zhuǎn))。2.7內(nèi)部寄存器寫R15的限制正常操作時(shí)1142.7內(nèi)部寄存器寫R15的限制
由于ARM指令以字為邊界,因此寫入R15的值最低兩位通常為0b00。具體的規(guī)則取決于內(nèi)核結(jié)構(gòu)的版本:在ARM結(jié)構(gòu)V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉(zhuǎn)地址由指令的實(shí)際目標(biāo)地址(寫入R15的值)和0xFFFFFFFC相與得到;在ARM結(jié)構(gòu)V4版及以上版本中,寫入R15的值的最低兩位為0,如果不是,結(jié)果將不可預(yù)測。2.7內(nèi)部寄存器寫R15的限制由于ARM115程序狀態(tài)寄存器CPSR
寄存器CPSR為程序狀態(tài)寄存器,在異常模式中,另外一個(gè)寄存器“程序狀態(tài)保存寄存器(SPSR)”可以被訪問。每種異常都有自己的SPSR,在因?yàn)楫惓J录M(jìn)入異常時(shí)它保存CPSR的當(dāng)前值,異常退出時(shí)可通過它恢復(fù)CPSR。詳細(xì)描述參看2.8小節(jié)。程序狀態(tài)寄存器CPSR寄存器CPSR為程序狀態(tài)1162.7內(nèi)部寄存器Thumb狀態(tài)寄存器Thumb狀態(tài)寄存器集是ARM狀態(tài)集的子集,程序員可以直接訪問的寄存器為:8個(gè)通用寄存器R0~R7;程序計(jì)數(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)通用寄存器和程序計(jì)數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實(shí)際訪問的寄存器寄存器在匯編中的名稱寄存器類別注意:括號(hào)內(nèi)為ATPCS中寄存器的命名,可以使用RN匯編偽指令將寄存器定義多個(gè)名字。其中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)通用寄存器和程序計(jì)數(shù)器快中斷中斷未定義中止管理系統(tǒng)用戶各模式下實(shí)際訪問的寄存器寄存器在匯編中的名稱寄存器類別R7R6R5R4R3R2R1R0
在匯編語言中寄存器R0~R7為保存數(shù)據(jù)或地址值的通用寄存器。對(duì)于任何處理器模式,它們中的每一個(gè)都對(duì)應(yīng)于相同的32位物理寄存
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)員工借用設(shè)備使用期限合同3篇
- 2025年度定制家具行業(yè)競業(yè)禁止模板木方買賣合同3篇
- 2025年度農(nóng)村自建房合同協(xié)議書(含智能安防監(jiān)控)
- 養(yǎng)殖場土地租賃合同(二零二五年度)農(nóng)業(yè)科技創(chuàng)新3篇
- 二零二五年度個(gè)人施工安全責(zé)任協(xié)議書范本3篇
- 2025年度農(nóng)村自建房工程承包合同
- 2025年度全新官方版二零二五年度離婚協(xié)議書與房產(chǎn)分割執(zhí)行細(xì)則3篇
- 二零二五年度特色農(nóng)業(yè)農(nóng)田承包合作協(xié)議
- 2025年度出租車位充電樁安裝工程驗(yàn)收及質(zhì)保合同
- 二零二五年度全新寫字樓轉(zhuǎn)租協(xié)議合同:商務(wù)樓租賃權(quán)轉(zhuǎn)讓專案2篇
- 《跟上兔子》繪本三年級(jí)第1季One-Day教學(xué)課件
- 家長會(huì)課件:小學(xué)三年級(jí)家長會(huì) 課件
- 孕產(chǎn)婦妊娠風(fēng)險(xiǎn)評(píng)估表
- 農(nóng)村小學(xué)特色體育課程開發(fā)與實(shí)踐研究課題申報(bào)評(píng)審書1
- MOOC 社會(huì)保障學(xué)-江西財(cái)經(jīng)大學(xué) 中國大學(xué)慕課答案
- 城市規(guī)劃設(shè)計(jì)計(jì)費(fèi)指導(dǎo)意見(2004年)
- 制造業(yè)成本精細(xì)化管理
- 工業(yè)互聯(lián)網(wǎng)標(biāo)準(zhǔn)體系(版本3.0)
- 柴油發(fā)電機(jī)組采購施工 投標(biāo)方案(技術(shù)方案)
- 股權(quán)招募計(jì)劃書
- 創(chuàng)業(yè)之星學(xué)創(chuàng)杯經(jīng)營決策常見問題匯總
評(píng)論
0/150
提交評(píng)論