ARM體系結(jié)構(gòu)與編程(第2版)第9章_第1頁(yè)
ARM體系結(jié)構(gòu)與編程(第2版)第9章_第2頁(yè)
ARM體系結(jié)構(gòu)與編程(第2版)第9章_第3頁(yè)
ARM體系結(jié)構(gòu)與編程(第2版)第9章_第4頁(yè)
ARM體系結(jié)構(gòu)與編程(第2版)第9章_第5頁(yè)
已閱讀5頁(yè),還剩22頁(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)介

第9章

異常中斷處理在ARM體系中,通常有以下3種方式來(lái)控制程序的執(zhí)行流程:在正常程序執(zhí)行過(guò)程中,每執(zhí)行一條ARM指令,程序計(jì)數(shù)器(PC)的值加4個(gè)字節(jié);每執(zhí)行一條Thumb指令,程序計(jì)數(shù)器(PC)的值加兩個(gè)字節(jié)。整個(gè)過(guò)程是順序執(zhí)行的。通過(guò)跳轉(zhuǎn)指令,程序可以跳轉(zhuǎn)到特定的地址標(biāo)號(hào)處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行。當(dāng)異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行完當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。29.1.1ARM體系中的異常中斷種類ARM體系中的異常中斷如表9.1所示。39.1.1ARM體系中的異常中斷種類49.1.2異常中斷向量表及異常中斷優(yōu)先級(jí)中斷向量表中指定了各異常中斷及其處理程序的對(duì)應(yīng)關(guān)系。它通常存放在存儲(chǔ)地址的低端。在ARM體系中,異常中斷向量表的大小為32字節(jié)。每個(gè)異常中斷對(duì)應(yīng)的中斷向量表中的4個(gè)字節(jié)的空間中存放了一個(gè)跳轉(zhuǎn)指令或者一個(gè)向程序計(jì)數(shù)器(PC)中賦值的數(shù)據(jù)訪問(wèn)指令。通過(guò)這兩種指令,程序?qū)⑻D(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。當(dāng)幾個(gè)異常中斷同時(shí)發(fā)生時(shí),就必須按照一定的次序來(lái)處理這些異常中斷。處理器執(zhí)行某個(gè)特定的異常中斷的過(guò)程中,稱為處理器處于特定的中斷模式。59.1.2異常中斷向量表及異常中斷優(yōu)先級(jí)各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級(jí)如表9.2所示。6中斷向量地址異常中斷類型異常中斷模式優(yōu)先級(jí)(6最低)0x0復(fù)位特權(quán)模式(SVC)10x4未定義的指令未定義指令中止模式(Undef)60x8軟件中斷(SWI)特權(quán)模式(SVC)60x0c指令預(yù)取中止中止模式50x10數(shù)據(jù)訪問(wèn)中止中止模式20x14保留未使用未使用0x18外部中斷請(qǐng)求(IRQ)外部中斷(IRQ)模式40x1c快速中斷請(qǐng)求(FIQ)快速(FIQ)中斷模式39.1.3異常中斷使用的寄存器各異常中斷對(duì)應(yīng)著一定的處理器模式。應(yīng)用程序通常運(yùn)行在用戶模式下。ARM中的處理器模式如表9.3所示。7處理器模式描述用戶模式(User,usr)正常程序執(zhí)行的模式快速中斷模式(FIQ,fiq)用于高速數(shù)據(jù)傳輸和通道處理外部中斷模式(IRQ,irq)用于通常的中斷處理特權(quán)模式(Supervisor,sve)供操作系統(tǒng)使用的一種保護(hù)模式中止模式(Abort,abt)用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)未定義指令模式(Undefined,und)用于支持通過(guò)軟件仿真硬件的協(xié)處理器系統(tǒng)模式(System,sys)用于運(yùn)行特權(quán)級(jí)的操作系統(tǒng)任務(wù)9.1.3異常中斷使用的寄存器各種不同的處理器模式可能有對(duì)應(yīng)于該處理器模式的物理寄存器組,如表9.4所示。89.2進(jìn)入和退出異常中斷的過(guò)程本節(jié)主要介紹處理器對(duì)于各種異常中斷的響應(yīng)過(guò)程以及從異常中斷處理程序中返回的方法。對(duì)于不同的異常中斷處理程序,返回地址以及使用的指令是不同的。99.2.1ARM處理器對(duì)異常中斷的響應(yīng)過(guò)程ARM處理器對(duì)異常中斷的響應(yīng)過(guò)程如下。(1) 保存處理器當(dāng)前狀態(tài)、中斷屏蔽位以及各條件標(biāo)志位。(2) 設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中相應(yīng)的位。(3) 將寄存器lr_mode設(shè)置成返回地址。(4) 將程序計(jì)數(shù)器值(PC)設(shè)置成該異常中斷的中斷向量地址,從而跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。109.2.1ARM處理器對(duì)異常中斷的響應(yīng)過(guò)程1.響應(yīng)復(fù)位異常中斷2.響應(yīng)未定義指令異常中斷3.響應(yīng)SWI異常中斷4.響應(yīng)指令預(yù)取中止異常中斷5.響應(yīng)數(shù)據(jù)訪問(wèn)中止異常中斷6.響應(yīng)IRQ異常中斷7.響應(yīng)FIQ異常中斷119.2.2從異常中斷處理程序中返回從異常中斷處理程序中返回包括下面兩個(gè)基本操作:恢復(fù)被中斷的程序的處理器狀態(tài),即把SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。返回到發(fā)生異常中斷的指令的下一條指令處執(zhí)行,即把lr_mode寄存器的內(nèi)容復(fù)制到程序計(jì)數(shù)器PC中。復(fù)位異常中斷處理程序不需要返回。整個(gè)應(yīng)用系統(tǒng)是從復(fù)位異常中斷處理程序開(kāi)始執(zhí)行的,因而它不需要返回。129.2.2從異常中斷處理程序中返回1.

SWI和未定義指令異常中斷處理程序的返回2.

IRQ和FIQ異常中斷處理程序的返回3.指令預(yù)取中止異常中斷處理程序的返回4.數(shù)據(jù)訪問(wèn)中止異常中斷處理程序的返回139.3在應(yīng)用程序中安排異常中斷處理程序通常有兩種方法將異常中斷處理程序注冊(cè)到異常中斷向量表中。一種是使用跳轉(zhuǎn)指令,另一種是使用數(shù)據(jù)讀取指令LDR。使用跳轉(zhuǎn)指令的方法比較簡(jiǎn)單,可以在異常中斷對(duì)應(yīng)的向量表中的特定位置放一條跳轉(zhuǎn)指令,直接跳轉(zhuǎn)到該異常中斷的處理程序。這種方法有一個(gè)缺點(diǎn),即跳轉(zhuǎn)指令只能在32MB的空間范圍內(nèi)跳轉(zhuǎn)。使用數(shù)據(jù)讀取指令LDR向程序計(jì)數(shù)器PC中直接賦值。這種方法分為兩步:先將異常中斷處理程序的絕對(duì)地址存放在距離向量表4KB的范圍之內(nèi)的一個(gè)存儲(chǔ)單元中;再使用數(shù)據(jù)讀取指令LDR將該單元的內(nèi)容讀取到程序計(jì)數(shù)器PC中。149.3.1在系統(tǒng)復(fù)位時(shí)安排異常中斷處理程序1.地址0x0處為ROM的情況(1) 使用數(shù)據(jù)讀取指令LDR的示例(2) 使用跳轉(zhuǎn)指令的示例2.地址0x0處為RAM的情況159.3.2在C程序中安排異常中斷處理程序1.中斷向量表中使用跳轉(zhuǎn)指令的情況(1) 讀取中斷處理程序的地址。(2) 從上一步得到的地址中減去該異常中斷對(duì)應(yīng)的中斷向量的地址。(3) 從上一步得到的地址中減去8,以允許指令預(yù)取。(4) 將上一步得到的地址右移2位,得到以字(32位)為單位的偏移量。(5) 確保上一步得到的地址值高8位為0,因?yàn)樘D(zhuǎn)指令只允許24位的偏移量。(6) 將上一步得到的地址與數(shù)據(jù)0xea000000作邏輯或,從而得到將要寫(xiě)到中斷向量表中的跳轉(zhuǎn)指令的編碼。169.3.2在C程序中安排異常中斷處理程序2.中斷向量表中使用數(shù)據(jù)讀取指令的情況(1) 讀取中斷處理程序的地址。(2) 從上一步得到的地址中減去該異常中斷對(duì)應(yīng)的中斷向量的地址。(3) 從上一步得到的地址中減去8,以允許指令預(yù)取。(4) 將上一步得到的地址與數(shù)據(jù)0xe59ff000做邏輯或,從而得到將要寫(xiě)到中斷向量表中的數(shù)據(jù)讀取指令的編碼。(5) 將中斷處理程序的地址放到相應(yīng)的存儲(chǔ)單元中。179.4SWI異常中斷處理程序通過(guò)SWI異常中斷,用戶模式的應(yīng)用程序可以調(diào)用系統(tǒng)模式下的代碼。在實(shí)時(shí)操作系統(tǒng)中,通常使用SWI異常中斷為用戶應(yīng)用程序提供系統(tǒng)功能調(diào)用。189.4.1SWI異常中斷處理程序的實(shí)現(xiàn)1.第1級(jí)SWI異常中斷處理程序2.使用匯編程序的第2級(jí)SWI異常中斷處理程序3.使用C程序的第2級(jí)SWI異常中斷處理程序199.4.2SWI異常中斷調(diào)用1.在特權(quán)模式下調(diào)用SWI2.從應(yīng)用程序中調(diào)用SWI3.從應(yīng)用程序中動(dòng)態(tài)調(diào)用SWI209.5FIQ和IRQ異常中斷處理程序ARM提供的FIQ和IRQ異常中斷用于外部設(shè)備向CPU請(qǐng)求中斷服務(wù)。這兩個(gè)異常中斷的引腳都是低電平有效的。當(dāng)前程序狀態(tài)寄存器CPSR的I控制位可以屏蔽這兩個(gè)異常中斷請(qǐng)求:當(dāng)程序狀態(tài)寄存器CPSR中的I控制位為1時(shí),F(xiàn)IQ和IRQ異常中斷被屏蔽;當(dāng)程序狀態(tài)寄存器CPSR中的I控制位為0時(shí),CPU正常響應(yīng)FIQ和IRQ異常中斷請(qǐng)求。FIQ異常中斷為快速異常中斷,它比IRQ異常中斷優(yōu)先級(jí)高,這主要表現(xiàn)在如下兩個(gè)方面:當(dāng)FIQ和IRQ異常中斷同時(shí)產(chǎn)生時(shí),CPU先處理FIQ異常中斷。在FIQ異常中斷處理程序中,IRQ異常中斷被禁止。219.5.1IRQ/FIQ異常中斷處理程序1.不可重入的IRQ/FIQ異常中斷處理程序保存APCS規(guī)定的被破壞的寄存器。保存其他中斷處理程序中用到的寄存器。同時(shí)將(LR-4)賦予程序計(jì)數(shù)器PC,實(shí)現(xiàn)中斷處理程序的返回,并且恢復(fù)CPSR寄存器的內(nèi)容。2.可重入的IRQ/FIQ異常中斷處理程序(1) 將返回地址保存到IRQ的數(shù)據(jù)棧中。(2) 保存工作寄存器和SPSR_irq。(3) 清除中斷標(biāo)志位。(4) 將處理器切換到系統(tǒng)模式,重新使能中斷(IRQ/FIQ)。(5) 保存用戶模式的LR寄存器和被調(diào)用者不保存的寄存器。(6) 調(diào)用C語(yǔ)言的IRQ/FIQ異常中斷處理程序。(7) 當(dāng)C語(yǔ)言的IRQ/FIQ異常中斷處理程序返回后,恢復(fù)用戶模式的寄存器,并禁止中斷(IRQ/FIQ)。(8) 切換到IRQ模式,禁止中斷。(9) 恢復(fù)工作寄存器和寄存器LR_irq。(10) 從IRQ異常中斷處理程序中返回。229.5.2IRQ異常中斷處理程序舉例本例中有多達(dá)32個(gè)中斷源,每個(gè)中斷源對(duì)應(yīng)一個(gè)單獨(dú)的優(yōu)先級(jí)值,優(yōu)先級(jí)的取值范圍為0~31。假設(shè)系統(tǒng)中的中斷控制器的基地址為IntBase,存放中斷優(yōu)先級(jí)值的寄存器的偏移地址為IntLevel。寄存器R13指向一個(gè)FD類型的數(shù)據(jù)棧。例子的源代碼如程序9.13中所示。程序9.13多中斷源的IRQ異常中斷處理程序:參見(jiàn)教材P301239.6復(fù)位異常中斷處理程序復(fù)位異常中斷處理程序在系統(tǒng)加電或復(fù)位時(shí)執(zhí)行,它將進(jìn)行一些初始化工作,具體內(nèi)容與具體系統(tǒng)相關(guān),然后程序控制權(quán)交給應(yīng)用程序,因而復(fù)位異常中斷處理程序不需要返回。下面是通常在復(fù)位異常中斷處理程序中進(jìn)行的一些處理:設(shè)置異常中斷向量表。初始化數(shù)據(jù)棧和寄存器。初始化存儲(chǔ)系統(tǒng),如系統(tǒng)中的MMU等(如果系統(tǒng)中包含這些部件的話)。初始化一些關(guān)鍵的I/O設(shè)備。使用中斷。將處理器切換到合適的模式。初始化C語(yǔ)言環(huán)境變量,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行。249.7未定義指令異常中斷這種仿真的處理過(guò)程類似于SWI異常中斷的功能調(diào)用。在SWI異常中斷的功能調(diào)用中通過(guò)讀取SWI指令中的24位(位[23:0])立即數(shù),判斷具體請(qǐng)求的SWI功能。這種仿真機(jī)制的操作過(guò)程如下。(1) 將仿真程序設(shè)置成未定義指令異常中斷的中斷處理程序(鏈接到未定義指令異常中斷的中斷處理程序鏈中),并保存原來(lái)的中斷處理程序。(2) 讀取該未定義指令的位[27:24],判斷該未定義指令是否是一個(gè)協(xié)處理器指令。(3) 如果不仿真該未定義指令,則程序跳轉(zhuǎn)到原來(lái)的未定義指令異常中斷的中斷處理程序中執(zhí)行。Thumb指令集中不包含協(xié)處理器指令,因而不需要這種指令仿真機(jī)制。259.8指令預(yù)取中止異常中斷處理程序如果系統(tǒng)中不包含MMU,指令預(yù)取中止異常中斷處理程序只是簡(jiǎn)單地報(bào)告錯(cuò)誤,然后退出。如果系統(tǒng)中包含MMU,則發(fā)生錯(cuò)誤的指令觸發(fā)虛擬地址失效,在該失效處理程序中重新讀取該指令。指令預(yù)取中止異常中斷是由錯(cuò)誤的指令執(zhí)行時(shí)被觸發(fā)的,這時(shí)LR_abt寄存器還沒(méi)有被更新,它指向該指令的下面一條指令。因?yàn)樵撚袉?wèn)題的指令要被重新讀取,因而應(yīng)該返回到該有問(wèn)題的指令,即返回到(LR_abt-4)處。269.9數(shù)據(jù)

溫馨提示

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