《匯編語(yǔ)言程序設(shè)計(jì) -基于ARM體系結(jié)構(gòu)》課件第5章異常中斷及編程_第1頁(yè)
《匯編語(yǔ)言程序設(shè)計(jì) -基于ARM體系結(jié)構(gòu)》課件第5章異常中斷及編程_第2頁(yè)
《匯編語(yǔ)言程序設(shè)計(jì) -基于ARM體系結(jié)構(gòu)》課件第5章異常中斷及編程_第3頁(yè)
《匯編語(yǔ)言程序設(shè)計(jì) -基于ARM體系結(jié)構(gòu)》課件第5章異常中斷及編程_第4頁(yè)
《匯編語(yǔ)言程序設(shè)計(jì) -基于ARM體系結(jié)構(gòu)》課件第5章異常中斷及編程_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

教學(xué)目的掌握異常中斷的基本概念掌握復(fù)位處理程序的編寫方法掌握SWI異常處理程序的編寫方法掌握FIQ和IRQ中斷處理程序的編寫方法教學(xué)內(nèi)容5.1ARM的異常和中斷5.2ARM異常中斷的處理過程5.3復(fù)位處理程序5.4SWI異常中斷處理程序5.5FIQ和IRQ異常中斷處理程序5.6未定義指令異常中斷5.1ARM的異常和中斷5.1.1異常和中斷的基本概念5.1.2ARM的異常中斷5.1.3向量表5.1.4異常的優(yōu)先級(jí)別5.1.1異常和中斷的基本概念

異常和中斷是這樣一個(gè)過程:當(dāng)CPU內(nèi)部或外部出現(xiàn)某種事件(中斷源)需要處理時(shí),暫停正在執(zhí)行的程序(斷點(diǎn)),轉(zhuǎn)去執(zhí)行請(qǐng)求中斷的那個(gè)事件的處理程序(中斷服務(wù)程序),執(zhí)行完后,再返回被暫停執(zhí)行的程序(中斷返回),從斷點(diǎn)處繼續(xù)執(zhí)行,如圖5-1所示。圖5-1中斷示意圖異常和中斷的處理過程基本一致,但二者并不完全等同。ARM處理器有7種可以使正常指令順序中止執(zhí)行的異常情況:復(fù)位、未定義指令、軟件中斷、指令預(yù)取中止、數(shù)據(jù)中止、中斷請(qǐng)求(IRQ)、快速中斷請(qǐng)求(FIQ)。微機(jī)的中斷系統(tǒng)應(yīng)具有以下功能:(1)中斷響應(yīng):當(dāng)中斷源有中斷請(qǐng)求時(shí),CPU能決定是否響應(yīng)該請(qǐng)求。(2)斷點(diǎn)保護(hù)和中斷處理:在中斷響應(yīng)后,CPU能保護(hù)斷點(diǎn),并轉(zhuǎn)去執(zhí)行相應(yīng)的中斷服務(wù)程序。每個(gè)中斷服務(wù)程序都有一個(gè)確定的入口地址,該地址稱為中斷向量。(3)中斷優(yōu)先判斷:當(dāng)有兩個(gè)或兩個(gè)以上中斷源同時(shí)申請(qǐng)中斷時(shí),應(yīng)能給出處理的優(yōu)先順序,保證先執(zhí)行優(yōu)先級(jí)高的中斷。(4)中斷嵌套:在中斷處理過程中,發(fā)生新的中斷請(qǐng)求,CPU應(yīng)能識(shí)別中斷源的優(yōu)先級(jí)別,在高級(jí)的中斷源申請(qǐng)中斷時(shí),能中止低級(jí)中斷源的服務(wù)程序,而轉(zhuǎn)去響應(yīng)和處理優(yōu)先級(jí)較高的中斷請(qǐng)求,處理結(jié)束后再返回較低級(jí)的中斷服務(wù)程序,這一過程稱中斷嵌套或多重中斷。(5)中斷返回:自動(dòng)返回到斷點(diǎn)地址,繼續(xù)執(zhí)行被中斷的程序。5.1.2ARM的異常中斷

ARM處理器支持7種異常情況:復(fù)位、未定義指令、軟件中斷、指令預(yù)取中止、數(shù)據(jù)中止、中斷請(qǐng)求(IRQ)、快速中斷請(qǐng)求(FIQ)。

1.復(fù)位

ARM處理器中都有一個(gè)輸入引腳nRESET,這是引起ARM處理器復(fù)位異常的唯一原因。一般情況下,下列原因可以引起復(fù)位。上電復(fù)位:在上電后,復(fù)位使內(nèi)部達(dá)到預(yù)定狀態(tài),特別是程序跳到初始入口。復(fù)位引腳上的復(fù)位脈沖:這是由外部其他控制信號(hào)引起的。對(duì)系統(tǒng)電源檢測(cè)發(fā)現(xiàn)過壓或欠壓引起復(fù)位。時(shí)鐘異常復(fù)位等。系統(tǒng)復(fù)位后,進(jìn)入管理模式,一般對(duì)系統(tǒng)初始化。例如開中斷,初始化存儲(chǔ)器等。然后切換到用戶模式,開始執(zhí)行正常的用戶程序。

2.未定義

當(dāng)ARM處理器遇到不能處理的指令時(shí),會(huì)產(chǎn)生未定義指令異常。ARM未定義指令異常有以下兩種情況:

(1)遇到一條無法執(zhí)行的指令,此指令沒有定義(2)執(zhí)行一條對(duì)協(xié)處理器的操作指令,但協(xié)處理器沒有應(yīng)答在正常情況下,我們不希望發(fā)生未定義指令異常。但在有些情況下,可以利用這個(gè)異常,把它作為一個(gè)軟件中斷來利用。還有一些指令代碼,這些代碼沒有定義,屬于無效的指令代碼,但是并不能引起未定義指令異常,這些代碼被準(zhǔn)備用于ARM指令集的進(jìn)一步擴(kuò)展。3.軟件中斷軟件中斷是由軟件中斷指令(SWI)引起的。軟件中斷是一個(gè)很靈活的軟件功能,和子程序調(diào)用不同,軟件中斷把程序?qū)牍芾砟J剑?qǐng)求執(zhí)行特定的管理功能,而正常的子程序調(diào)用屬于用戶模式。

4.中止產(chǎn)生中止異常意味著對(duì)存儲(chǔ)器的訪問失敗。ARM微處理器在存儲(chǔ)器訪問周期內(nèi)檢查是否發(fā)生中止異常。中止異常包括指令預(yù)取中止和數(shù)據(jù)中止兩種類型。(1)指令預(yù)取中止指令預(yù)取訪問存儲(chǔ)器失敗時(shí)產(chǎn)生的異常稱為指令預(yù)取中止異常。此時(shí),存儲(chǔ)器系統(tǒng)向ARM處理器發(fā)出存儲(chǔ)器中止(Abort)信號(hào),預(yù)取的指令被記為無效,但只有當(dāng)處理器試圖執(zhí)行無效指令時(shí),指令預(yù)取中止異常才會(huì)發(fā)生,如果指令未被執(zhí)行,例如在指令流水線中發(fā)生了跳轉(zhuǎn),則預(yù)取指令中止不會(huì)發(fā)生。

(2)數(shù)據(jù)中止ARM處理器訪問數(shù)據(jù)存儲(chǔ)器失敗時(shí)產(chǎn)生的異常稱為數(shù)據(jù)中止異常。此時(shí),存儲(chǔ)器系統(tǒng)向ARM處理器發(fā)出存儲(chǔ)器中止(Abort)信號(hào),表明數(shù)據(jù)存儲(chǔ)器不能識(shí)別ARM處理器的讀數(shù)據(jù)請(qǐng)求,系統(tǒng)的響應(yīng)與指令的類型有關(guān)。5.中斷請(qǐng)求(IRQ)

IRQ異常屬于正常的中斷請(qǐng)求,可通過對(duì)處理器的nIRQ引腳輸入低電平產(chǎn)生,IRQ的優(yōu)先級(jí)低于FIQ,當(dāng)程序執(zhí)行進(jìn)入FIQ異常時(shí),IRQ可能被屏蔽。若將CPSR的I位置為1,則會(huì)禁止IRQ中斷,若將CPSR的I位清零,處理器會(huì)在指令執(zhí)行完之前檢查IRQ的輸入。注意只有在特權(quán)模式下才能改變I位的狀態(tài)。

6.快速中斷請(qǐng)求(FIQ)

FIQ異常是為了支持?jǐn)?shù)據(jù)傳輸或者通道處理而設(shè)計(jì)的。在ARM狀態(tài)下,系統(tǒng)有足夠的私有寄存器,從而可以避免對(duì)寄存器保存的需求,減小了系統(tǒng)上下文切換的開銷。

若將CPSR的F位置為1,則會(huì)禁止FIQ中斷,若將CPSR的F位清零,處理器會(huì)在指令執(zhí)行時(shí)檢查FIQ的輸入。注意只有在特權(quán)模式下才能改變F位的狀態(tài)??捎赏獠客ㄟ^對(duì)處理器上的nFIQ引腳輸入低電平產(chǎn)生FIQ。5.1.3向量表

當(dāng)一個(gè)異常中斷發(fā)生時(shí),處理器會(huì)把PC設(shè)置為一個(gè)特定的存儲(chǔ)器地址。這一地址放在一個(gè)稱為向量表的特定地址范圍內(nèi)。表5-1列出了異常向量的地址和進(jìn)入模式。

向量表的入口是一些跳轉(zhuǎn)指令,跳轉(zhuǎn)到專門處理某個(gè)異?;蛑袛嗟淖映绦颉3R姷奶D(zhuǎn)指令有:(1)B<Addr>這條分支指令實(shí)現(xiàn)了相對(duì)于PC的分支跳轉(zhuǎn)。(2)LDRPC,[PC,#offset]這條寄存器裝載指令把處理程序(handler)的入口地址從存儲(chǔ)器裝載到PC。

(3)MOVPC,#Immediate

這條MOV指令把一個(gè)立即數(shù)復(fù)制到PC。它可跨越全部的地址空間,但要注意受到地址對(duì)齊問題的限制。這個(gè)地址必須是一個(gè)由8位立即數(shù)循環(huán)右移偶數(shù)次得到的。

每一個(gè)異常發(fā)生時(shí),總是從異常向量表開始起跳的,例如:最簡(jiǎn)單的一種情況如圖5-2所示。圖5-2B指令實(shí)現(xiàn)中斷處理

向量表里面的每一條指令直接跳向?qū)?yīng)的異常處理函數(shù)。其中

FIQ_Handler()可以直接從地址0x1C處開始,從而節(jié)省了一條跳轉(zhuǎn)指令,提高了FIQ的處理速度。5.1.4異常的優(yōu)先級(jí)別

異??梢酝瑫r(shí)發(fā)生,當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí),系統(tǒng)根據(jù)固定的優(yōu)先級(jí)決定異常的處理次序。異常優(yōu)先級(jí)由高到低的排列次序如表5-2所示。

優(yōu)先級(jí)最低的2種異常是:軟件中斷和未定義指令異常??梢酝ㄟ^設(shè)置CPSR中的I位

或F位來禁止某些異常,如表所示。每一種異常將按照表5-2中設(shè)置的優(yōu)先級(jí)得到處理。下面從最高優(yōu)先級(jí)異常開始,逐一介紹這些異常是如何被處理的。

⑴復(fù)位異常是優(yōu)先級(jí)最高的異常。一旦復(fù)位信號(hào)產(chǎn)生,總是會(huì)發(fā)生復(fù)位異常。復(fù)位異常處理程序?qū)ο到y(tǒng)進(jìn)行初始化,包括配置存儲(chǔ)器和Cache。外部中斷源必須在IRQ或者FIQ中斷允許之前初始化,以避免在還沒有設(shè)置好相應(yīng)的處理程序前產(chǎn)生中斷。復(fù)位處理程序還要為所有處理器模式設(shè)置堆棧指針。

⑵數(shù)據(jù)中止異常發(fā)生在存儲(chǔ)控制器或MMU指示訪問了無效的存儲(chǔ)器地址時(shí),或者當(dāng)前代碼在沒有正確的訪問權(quán)限時(shí),試圖讀/寫存儲(chǔ)器。由于沒有禁止FIQ異常,在一個(gè)數(shù)據(jù)中止處理程序中,可以發(fā)生FIQ異常。當(dāng)FIQ服務(wù)完成后,控制權(quán)交還給數(shù)據(jù)中止處理程序。

⑶快速中斷請(qǐng)求(FIQ)異常發(fā)生在一個(gè)外部設(shè)備把內(nèi)核的FIQ線置為nFIQ時(shí)。FIQ異常是優(yōu)先級(jí)最高的中斷。內(nèi)核在進(jìn)入FIQ處理程序時(shí),把FIQ和IRQ都禁止了,因此任何外部中斷源都不能再次中斷處理器,除非在軟件中重新允許了IRQ或FIQ。應(yīng)該仔細(xì)設(shè)計(jì)FIQ處理程序,以便高效地為異常處理服務(wù)。

⑷中斷請(qǐng)求(IRQ)異常發(fā)生在一個(gè)外部設(shè)備把內(nèi)核的IRQ線置為nIRQ時(shí)。IRQ異常是第二優(yōu)先級(jí)中斷。FIQ異常和數(shù)據(jù)中止異常都沒有發(fā)生時(shí),IRQ處理程序才能夠進(jìn)入。在進(jìn)入IRQ處理程序時(shí),內(nèi)核禁止IRQ異常,直到當(dāng)前中斷源被清除。

⑸預(yù)取指中止異常即試圖取指令而導(dǎo)致存儲(chǔ)器訪問失敗的情形。在流水線中,如果某條指令的“執(zhí)行”階段沒有優(yōu)先級(jí)更高的異常出現(xiàn),將發(fā)生預(yù)取指中止異常。在進(jìn)入相應(yīng)的處理程序時(shí),內(nèi)核禁止IRQ異常,而保持FIQ不變。如果允許了FIQ,并且發(fā)生了一個(gè)FIQ異常,則它可在處理預(yù)取指中止過程中得到響應(yīng)。

⑹軟件中斷(SWI)異常發(fā)生在執(zhí)行SWI指令,且沒有更高優(yōu)先級(jí)的異常標(biāo)志置位的情況下,在進(jìn)入相應(yīng)的處理程序時(shí),CPSR將被設(shè)置成管理模式。如果系統(tǒng)使用嵌套SWI調(diào)用,則必須在跳轉(zhuǎn)到嵌套SWI之前,保存連接寄存器R14和SPSR的值,以免遭到破壞。5.2ARM異常中斷的處理過程5.2.1異常中斷響應(yīng)過程5.2.2異常中斷的返回5.2.1異常中斷響應(yīng)過程當(dāng)一個(gè)異常出現(xiàn)以后,ARM微處理器會(huì)執(zhí)行以下幾步操作:

1.保存處理器當(dāng)前狀態(tài)、中斷屏蔽位以及各條件標(biāo)志位。這是通過將當(dāng)前程序狀態(tài)寄存器CPSR的內(nèi)容復(fù)制到要執(zhí)行的異常中斷對(duì)應(yīng)的SPSR寄存器中實(shí)現(xiàn)的,各異常中斷都有自己的物理SPSR寄存器。實(shí)現(xiàn)這一操作的典型代碼如下:SUBLR,LR,#4;保存中斷的返回地址STMFDSP!,{LR}MRSR14,SPSR;保存狀態(tài)寄存器,及其他工作寄存器STMFDSP!,{R12,R14}2.設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中相應(yīng)的位。改變處理器狀態(tài)進(jìn)入ARM狀態(tài)改變處理器模式進(jìn)入相應(yīng)的異常模式設(shè)置中斷禁止位禁止相應(yīng)中斷

不管異常發(fā)生在ARM還是Thumb狀態(tài)下,處理器都將自動(dòng)進(jìn)入ARM狀態(tài)。如果此時(shí)處理器處于Thumb狀態(tài),則當(dāng)異常向量地址加載入PC時(shí),處理器自動(dòng)切換到ARM狀態(tài)。設(shè)置CPSR中的位,使處理器進(jìn)入相應(yīng)的執(zhí)行模式(ARM處理器異常及其對(duì)應(yīng)的模式如表5-3所示)。另一個(gè)需要注意的地方是中斷使能被自動(dòng)關(guān)閉,禁止IRQ中斷,也就是說缺省情況下中斷是不可重入的。當(dāng)進(jìn)入FIQ模式時(shí),禁止新的FIQ中斷,這是通過設(shè)置CPSR中的位來實(shí)現(xiàn)的。實(shí)現(xiàn)這一操作的典型代碼如下:MRSR14,CPSR;切換到系統(tǒng)模式,并使能中斷BICR14,R14,#0x9FORRR14,R14,#Ox1FMSRCPSR_c,R14

3.保存返回地址將下一條指令的地址存入相應(yīng)的連接寄存器LR,以便程序在處理異常返回時(shí)能從正確的位置重新開始執(zhí)行。若異常是從ARM狀態(tài)進(jìn)入,LR寄存器中保存的是下一條指令的地址(當(dāng)前PC+4或PC+8,與異常的類型有關(guān));若異常是從Thumb狀態(tài)進(jìn)入,則在LR寄存器中保存當(dāng)前PC的偏移量,這樣,異常處理程序就不需要確定異常是從何種狀態(tài)進(jìn)入的。典型的代碼如下:STMFDSP!,{R0-R3,LR}

4.執(zhí)行中斷處理程序強(qiáng)制PC從相關(guān)的異常向量地址取下一條指令執(zhí)行,從而跳轉(zhuǎn)到相應(yīng)的異常處理程序處。典型的代碼如下:BLC_irq_handler;跳轉(zhuǎn)到C語(yǔ)言的中斷處理程序

5.2.2異常中斷的返回

從異常中斷的程序中返回包括下面三個(gè)基本操作:1.恢復(fù)通用寄存器中的值通用寄存器的恢復(fù)采用一般的堆棧操作指令。2.恢復(fù)狀態(tài)寄存器的值恢復(fù)被中斷程序的處理器狀態(tài),將SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。3.修改PC的值使得程序能返回到發(fā)生異常中斷指令的下一條指令處執(zhí)行,將LR_mode寄存器的內(nèi)容復(fù)制到程序計(jì)數(shù)器PC中。PC和CPSR的恢復(fù)可以通過下面是3個(gè)指令中的一條指令來實(shí)現(xiàn):

MOVSpc,lrSUBSpc,lr,#4LDMFDsp!,{pc}^前面提到進(jìn)入異常時(shí)處理器會(huì)有一個(gè)保存LR的動(dòng)作,但是該保存值并不一定是正確中斷的返回地址。下面以ARM處理器3級(jí)流水線結(jié)構(gòu)為例,對(duì)此加以說明。實(shí)際上,當(dāng)異常中斷發(fā)生時(shí),程序計(jì)數(shù)器PC所指的位置對(duì)于各種不同的異常中斷是不同的。同樣,返回地址對(duì)于各種不同的異常中斷也是不同的。當(dāng)異常發(fā)生時(shí),程序計(jì)數(shù)器總是指向返回位置的下一條指令,如圖5-3所示。從圖5-3可以看出,當(dāng)程序執(zhí)行完第1條指令(地址0x8000)發(fā)生跳轉(zhuǎn)時(shí),程序計(jì)數(shù)器PC正指向第3條指令(地址0x8008)。在執(zhí)行完中斷服務(wù)程序返回時(shí),PC應(yīng)該指向第2條指令(地址0x8004)。第1條指令執(zhí)行時(shí),處理器硬件會(huì)自動(dòng)把把PC(=0x8008)保存到LR寄存器里面,但是接下去處理器會(huì)馬上對(duì)LR進(jìn)行一個(gè)自動(dòng)的調(diào)整動(dòng)作:LR=LR-0x4。這樣,最終保存在LR里面的是第2條指令的地址,所以當(dāng)從中斷程序返回時(shí),LR里面正好是正確的返回地址。由于各種異常中斷響應(yīng)的過程不同,因此,保存在LR中的地址是不相同的。大多數(shù)情況下保存在LR中的地址值是:LR保存的值=PC值-4因?yàn)楸4嬖贚R中的地址值是不同的,因而,不同的異常中斷返回時(shí)的指令也不同。表5-4給出了推薦的中斷返回指令,從指令中可以知道保存在LR中的地址值。下面詳細(xì)說明各類異常中斷的返回過程:1.SWI和未定義指令異常中斷處理程序的返回SWI和未定義指令異常中斷是由當(dāng)前執(zhí)行的指令自身產(chǎn)生的,當(dāng)SWI和未定義指令異常中斷產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值還未更新,它指向當(dāng)前指令后面第2條指令(對(duì)于ARM指令來說,它指向當(dāng)前指令地址加8個(gè)字節(jié)的位置;對(duì)于Thumb指令來說,它指向當(dāng)前指令地址加4個(gè)字節(jié)的位置)。當(dāng)SWI和未定義指令異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(shí)(PC-4)即指向當(dāng)前指令的下一條指令。如圖5-4所示。圖5-4SWI的返回地址

因此返回操作可以通過下面的指令來實(shí)現(xiàn):MOVPC,LR2.IRQ和FIQ異常中斷處理程序的返回通常處理器執(zhí)行完當(dāng)前指令后,查詢IRQ中斷引腳及FIQ中斷引腳,并且查看系統(tǒng)是否允許IRQ中斷及FIQ中斷。如果有中斷引腳有效,并且系統(tǒng)允許該中斷產(chǎn)生,處理器將產(chǎn)生IRQ異常中斷或FIQ異常中斷。當(dāng)IRQ和FIQ異常中斷產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值已經(jīng)更新,它指向當(dāng)前指令后面第3條指令(對(duì)于ARM指令來說,它指向當(dāng)前指令地址加12個(gè)字節(jié)的位置;對(duì)于Thumb指令來說,它指向當(dāng)前指令地址加6個(gè)字節(jié)的位置)。當(dāng)IRQ和FIQ異常中斷發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(shí)(PC-4)即指向當(dāng)前指令后的第2條指令,如圖5-5所示。圖5-5IRQ/FIQ的返回地址因此返回操作可以通過下面的指令來實(shí)現(xiàn):SUBSPC,LR,#43.指令預(yù)取中止異常中斷處理程序的返回在指令預(yù)取時(shí),如果目的地址是非法的,該指令將被記成有問題的指令。指令預(yù)取中止異常是由當(dāng)前執(zhí)行的指令自身產(chǎn)生的,當(dāng)指令預(yù)取中止異常產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值還未更新,它指向當(dāng)前指令后面第2條指令(對(duì)于ARM指令來說,它指向當(dāng)前指令地址加8個(gè)字節(jié)的位置;對(duì)于Thumb指令來說,它指向當(dāng)前指令地址加4個(gè)字節(jié)的位置)。當(dāng)指令預(yù)取中止異常發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(shí)(PC-4)即指向當(dāng)前指令的下一條指令,如圖5-6所示。圖5-6指令預(yù)取異常返回地址因此返回操作可以通過下面的指令來實(shí)現(xiàn):SUBSPC,LR,#4該指令將寄存器LR中的值減4后,復(fù)制到程序計(jì)數(shù)器PC中,實(shí)現(xiàn)程序的返回,同時(shí)將SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。4.?dāng)?shù)據(jù)訪問中止異常中斷處理程序的返回當(dāng)發(fā)生數(shù)據(jù)訪問中止異常中斷時(shí),程序要返回到該有問題的數(shù)據(jù)訪問處,重新訪問該數(shù)據(jù)。因此數(shù)據(jù)訪問中止異常中斷處理程序應(yīng)該返回到產(chǎn)生該數(shù)據(jù)訪問中止異常中斷的指令處,而不是像前1、2兩種情況下返回到發(fā)生中斷的指令的下一條指令。數(shù)據(jù)訪問中止異常中斷是由數(shù)據(jù)訪問指令指令自身產(chǎn)生的,當(dāng)數(shù)據(jù)訪問中止異常產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值已經(jīng)更新,它指向當(dāng)前指令后面第3條指令(對(duì)于ARM指令來說,它指向當(dāng)前指令地址加12個(gè)字節(jié)的位置)。當(dāng)指令預(yù)取中止異常發(fā)生時(shí),處理器將值(PC-4)保存到異常模式下的寄存器LR_mode中。這時(shí)(PC-4)即指向當(dāng)前指令的第二條指令,如圖5-7所示。圖5-7數(shù)據(jù)訪問異常的返回地址因此返回操作可以通過下面的指令來實(shí)現(xiàn):SUBSPC,LR,#85.3復(fù)位處理程序5.3.1復(fù)位5.3.2復(fù)位處理編程5.3.1復(fù)位

ARM處理器中都有一個(gè)輸入引腳nRESET,這是引起ARM處理器復(fù)位異常的唯一原因。ARM處理器復(fù)位是由外部復(fù)位邏輯引起的,有些復(fù)位可以使用軟件進(jìn)行控制。復(fù)位對(duì)系統(tǒng)影響很大,復(fù)位后,內(nèi)部寄存器重新恢復(fù)默認(rèn)值,ARM內(nèi)部的數(shù)據(jù)有可能丟失,而有些寄存器的值是不確定的。一般情況下,下列原因可以引起復(fù)位。上電復(fù)位:在上電后,復(fù)位使內(nèi)部達(dá)到預(yù)定狀態(tài),特別是程序跳到初始入口。復(fù)位引腳上的復(fù)位脈沖:這是由外部其他控制信號(hào)引起的。對(duì)系統(tǒng)電源檢測(cè)發(fā)現(xiàn)過壓或欠壓。時(shí)鐘異常復(fù)位等。系統(tǒng)復(fù)位后,進(jìn)入管理模式,一般對(duì)系統(tǒng)初始化,具體內(nèi)容與具體系統(tǒng)相關(guān),然后程序控制權(quán)交給應(yīng)用程序,因而復(fù)位異常中斷處理程序不需要返回。5.3.2復(fù)位處理編程

復(fù)位異常中斷處理程序通常進(jìn)行如下一些處理:將處理器切換到管理模式初始化存儲(chǔ)系統(tǒng),如系統(tǒng)中的MMU等。初始化一些關(guān)鍵的I/O設(shè)備設(shè)置異常中斷向量表。初始化數(shù)據(jù)棧和寄存器。使用中斷初始化C語(yǔ)言環(huán)境變量,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行。例5.1下面是一個(gè)基于S3C2410芯片的復(fù)位處理程序

AREASTARTUP,CODE,READONLYENTRY CODE32;/***********************************************************;* ;*功能描述:初始化程序入口點(diǎn);*;*************************************************************STARTBINT_ResetLDRPC,Undefined_AddrLDRPC,SWI_AddrLDRPC,Prefetch_AddrLDRPC,Abort_AddrNOP LDRPC,IRQ_AddrLDRPC,FIQ_Addr…EXPORTINT_ResetINT_ResetMRSR0,CPSR;模式轉(zhuǎn)換為管理模式,BICR0,R0,#MODE_MASKORRR0,R0,#MODE_SVCORRR0,R0,#INTLOCKMSRCPSR_cxsf,R0LDRR0,=INTMSK;硬件屏蔽中斷 LDRR1,=0xFFFFFFFFSTRR1,[R0,#0]…LDRR0,=WTCON;屏蔽看門狗 LDRR1,=0x0 STRR1,[R0]LDRR0,=LOCKTIME;PLL穩(wěn)定輸出時(shí)間LDRR1,=0xffffffSTRR1,[R0]

LDRR0,=MPLLCON;設(shè)置CPU工作頻率LDRR1,=0X70022;Fin=10MHz,Fout=90MHzSTRR1,[R0]MOVR0,#0;關(guān)閉MMUMCRp15,0,R0,c1,c0,0LDRR0,=BWSCON;設(shè)置內(nèi)存控制寄存器,LDRR1,=0X22111110;配置內(nèi)存參數(shù),初始化內(nèi)存

STRR1,[R0]…INT_IRQ_Vectors;設(shè)置異常中斷向量表 DCDINT_EINT0_Shell;Vector00DCD0;Vector01DCD0;Vector02…;初始化堆棧LDRSP,=SYS_STACK;初始化Sys模式下的堆棧MRSR0,CPSR;初始化IRQ模式下的堆棧BICR0,R0,#MODE_MASKORRR0,R0,#MODE_IRQMSRCPSR_cxsf,R0LDRSP,=IRQ_STACK…MRSR0,CPSR;轉(zhuǎn)回系統(tǒng)模式,并使能中斷標(biāo)志位

;***********************************************************;C語(yǔ)言的調(diào)用(跳至應(yīng)用程序);************************************************************

IMPORTC_EntryBC_Entry分析:通過以上例子可以知道復(fù)位處理程序的基本過程如下:一旦復(fù)位發(fā)生,處理器便開始執(zhí)行地址0x00000000處的指令BINT_Reset,隨即跳轉(zhuǎn)到復(fù)位處理程序INT_Reset處,該程序首先將模式轉(zhuǎn)換為管理模式,接下來對(duì)硬件做一些初始化工作,如看門狗、工作頻率設(shè)置、內(nèi)存設(shè)置等等,具體的芯片不同,這些參數(shù)的設(shè)置也不同,上例給出了三星公司的基于ARM9內(nèi)核的S3C2410芯片初始化的簡(jiǎn)單例子。初始化工作完成后程序跳轉(zhuǎn)到C語(yǔ)言程序?qū)崿F(xiàn)某個(gè)具體的應(yīng)用。

5.4SWI異常中斷處理程序5.4.1SWI異常中斷處理程序的實(shí)現(xiàn)5.4.2SWI異常中斷調(diào)用5.4.1SWI異常中斷處理程序的實(shí)現(xiàn)通過SWI異常中斷,用戶模式的應(yīng)用程序可以調(diào)用系統(tǒng)模式下的代碼。在實(shí)時(shí)操作系統(tǒng)中,通常使用SWI異常中斷為用戶應(yīng)用程序提供系統(tǒng)功能。在SWI指令中包含一個(gè)24位立即數(shù),該立即數(shù)指示了用戶請(qǐng)求的特定SWI功能。在SWI異常中斷處理程序要讀取該24位立即數(shù),這涉及到SWI異常模式下對(duì)寄存器LR的讀取,并且要從存儲(chǔ)器讀取該SWI指令。這樣需要使用匯編程序來實(shí)現(xiàn)。SWI的處理過程如圖5-8所示圖5-8SWI處理過程通常SWI異常中斷處理程序分為兩級(jí):第1級(jí)SWI異常中斷處理程序?yàn)閰R編程序,用于確定SWI指令中的24位的立即數(shù);第2級(jí)SWI異常中斷處理程序具體實(shí)現(xiàn)SWI的各個(gè)功能,它可以是匯編程序,也可以是C程序。1.第1級(jí)SWI異常中斷處理程序第1級(jí)SWI異常中斷處理程序從存儲(chǔ)器中讀取該SWI指令。在進(jìn)入SWI異常中斷處理程序時(shí),LR寄存器中保存的是該SWI指令的下一條指令。LDRR0,[LR,#-4]下面的指令,從該SWI指令中讀取其中的24位立即數(shù)。BICR0,R0,#0xFF000000綜合上面所述,例5.2程序是一個(gè)第1級(jí)SWI異常中斷處理程序的模板。例5.21級(jí)SWI異常中斷處理程序模板AREAToplevelSwi,CODE,READONLY;定義該段代碼的名稱和屬性EXPORTSWI_HandlerSWI_Handler

STMFDSP!,{R0-R12,LR};保存用到的寄存器LDRR0,[LR,#-4];計(jì)算該SWI指令的地址,;并把它讀取到寄存器R0中BICR0,R0,#0xFF000000;將SWI指令中的24位立即數(shù);存放到R0寄存器中…;使用R0寄存器中的值,調(diào)用相應(yīng)的SWI異常中斷的第2級(jí)處理程序…LDMFDSP!,{R0-R12,PC}^;恢復(fù)使用到的寄存器,并返回END2.使用匯編程序的第2級(jí)SWI異常中斷處理程序可以使用跳轉(zhuǎn)指令,根據(jù)由第1級(jí)中斷處理程序得到的SWI指令中的立即數(shù)的值,直接跳轉(zhuǎn)到實(shí)現(xiàn)相應(yīng)SWI功能的處理程序。例5.32級(jí)的SWI異常中斷處理程序?yàn)閰R編語(yǔ)言程序的例子CMPR0,#MaxSWI;判斷R0寄存器中的立即數(shù)值是否超過允許的最大值LDRLSPC,[PC,R0,LSL#2]BSWIOutOfRangeSWIJumpTableDCDSWInum0DCDSWInum1

;其他的DCDSWInum0;立即數(shù)為0對(duì)應(yīng)的SWI中斷處理程序

…BEndofSWISWInum1;立即數(shù)為1對(duì)應(yīng)的SWI中斷處理程序

…BEndofSWI

;其他的SWI中斷處理程序EndofSWI;結(jié)束中斷處理程序?qū)⒗?.3程序代碼嵌入在程序例5.2中,組成一個(gè)完整的SWI異常中斷處理程序。3.使用C程序的第2級(jí)SWI異常中斷處理程序第2級(jí)SWI異常中斷處理程序可以是C程序。這時(shí),利用從第1級(jí)SWI異常中斷處理程序得到的SWI指令中的24位立即數(shù)來跳轉(zhuǎn)到相應(yīng)的處理程序。例5.4C程序類型的SWI異常中斷第2級(jí)中斷處理程序模板voidC_SWI_handler(unsignednumber){switch(number){case0:/*SWI號(hào)為0時(shí)執(zhí)行的代碼*/…break;case1:/*SWI號(hào)為1時(shí)執(zhí)行的代碼*/…break;…/*各種SWI號(hào)執(zhí)行的代碼*/default:/*無效的SWI號(hào)時(shí)執(zhí)行的代碼*/}}

在程序中,將得到的SWI指令中的24位立即數(shù)(稱為SWI功能號(hào))保存在寄存器RO中。根據(jù)ATPCS,1級(jí)中斷處理程序可以通過指令BLC_SWI_Handler來調(diào)用程序中的代碼,從而組成一個(gè)完整的SWI異常中斷處理程序,如例5.5程序所示。例5.5第2級(jí)中斷處理程序?yàn)镃程序的SWI異常中斷處理程序AREATopLevelSwi,CODE,READONLY;定義該段代碼的名稱和屬性EXPORTSWI_HandlerIMPORTC_SWI_HandlerSWI_HandlerSTMFDSP!,{R0-R12,LR};保存用到的寄存器LDRR0,{LR,#-4};計(jì)算該SWI指令的地址,并把它讀取到寄存器R0中BICR0,R0,#0xFF000000;將SWI指令中的24位立即數(shù)存放到R0寄存器中BLC_SWI_Handler;調(diào)用相應(yīng)的SWI異常中斷的第2級(jí)處理程序LDMFDSP!,{R0-R12,PC}^;恢復(fù)使用到的寄存器,并返回END如果第1級(jí)的SWI異常中斷處理程序?qū)⑵錀V羔樧鰹榈诙?shù)傳遞給C程序類型的第2級(jí)中斷處理程序,就可以實(shí)現(xiàn)在兩級(jí)中斷處理程序之間傳遞參數(shù)。這時(shí)C程序類型的第2級(jí)中斷處理程序函數(shù)原型如下所示,其中參數(shù)reg是SWI異常中斷第1級(jí)中斷處理程序傳遞來得數(shù)據(jù)棧指針。VoidC_SWI_handler(unsignednumber,unsigned*reg)在第1級(jí)的SWI異常中斷處理程序調(diào)用第2級(jí)中斷處理程序的操作如下:MOVR1,SP;設(shè)置C程序?qū)⑹褂玫牡诙€(gè)參數(shù),;根據(jù)ATPCS第二個(gè)參數(shù)保存在寄存器R1中BLC_SWI_Handler;調(diào)用C程序在第2級(jí)中斷處理程序,可以通過下面的操作讀取參數(shù),這些參數(shù)是在SWI異常中斷產(chǎn)生時(shí)各寄存器的值,這些寄存器值可以保存在SWI異常中斷對(duì)應(yīng)的數(shù)據(jù)棧中。value_in_reg_0=reg[0]value_in_reg_1=reg[1]value_in_reg_2=reg[2]value_in_reg_3=reg[3]在第2級(jí)中斷處理程序可以通過下面的操作返回結(jié)果:reg[0]=updated_value_0reg[1]=updated_value_1reg[2]=updated_value_2reg[3]=updated_value_35.4.2SWI異常中斷調(diào)用

1.在特權(quán)模式下調(diào)用SWI執(zhí)行SWI指令后,系統(tǒng)將會(huì)把CPSR寄存器的內(nèi)容保存到寄存器SPSR_svc中,將返回地址保存到寄存器LR_svc中。這樣如果在執(zhí)行SWI指令時(shí),系統(tǒng)已經(jīng)處于特權(quán)模式下,這時(shí)寄存器SPSR_svc和寄存器LR_svc中的內(nèi)容就會(huì)被破壞。因此如果在特權(quán)模式下調(diào)用SWI功能(即執(zhí)行SWI指令),比如在一個(gè)SWI異常中斷程序中執(zhí)行SWI指令,就必須將原始的寄存器SPSR_svc和寄存器LR_svc中的值保存在數(shù)據(jù)棧中。例5.6程序說明了在SWI中斷處理程序中如何保存寄存器SPSR_svc和寄存器LR_svc的值。例5.6SWI中斷處理程序中如何保存寄存器SPSR_svc和寄存器LR_svc的值STMFDSP!,{R0-R12,LR};保存寄存器,包括寄存器LR_svcMOVR1,SP;保存SPSR_svcMRSR0,SPSRSTMFDSP!,{R0}LDRR0,[LR,#-4];讀取SWI指令BICR0,R0,#0xFF000000;計(jì)算SWI指令中的24位立即數(shù);并將其存放到R0寄存器中BLC_SWI_Handler;調(diào)用C_SWI_Handler程序完成相應(yīng)的SWI功能LDMFDSP!,{R0};恢復(fù)SPSR_svc的值MSRSPSR_cf,R0LDMFDSP!,{R0-R12,PC}^;恢復(fù)使用到的寄存器,并返回END2.從應(yīng)用程序中調(diào)用SWI這里分為兩種情況考慮從應(yīng)用程序中調(diào)用特定的SWI功能:一種考慮使用匯編指令調(diào)用特定的SWI功能;一種考慮從C程序中調(diào)用特定的SWI功能。使用匯編指令調(diào)用特定的SWI功能比較簡(jiǎn)單,將需要的參數(shù)按照APTCS的要求放在相應(yīng)的寄存器中,然后在指令SWI中指定相應(yīng)24位立即數(shù)(指定想要調(diào)用的SWI功能號(hào))即可。例5.7的例子中,SWI中斷處理程序需要的參數(shù)放在R0中,這里該參數(shù)值為100,然后調(diào)用功能號(hào)為0x0的SWI功能調(diào)用。MOVR0,#100SWI0x0從C程序中調(diào)用特定的SWI功能比較復(fù)雜,因?yàn)檫@時(shí)需要將一個(gè)C程序的子程序調(diào)用映射到一個(gè)SWI異常中斷處理程序。這些被映射的C語(yǔ)言子程序使用編譯器偽操作__SWI來聲明。3.從應(yīng)用程序中動(dòng)態(tài)調(diào)用SWI

在有些情況下,直到運(yùn)行時(shí)才能夠確定需要調(diào)用的SWI功能號(hào)。這時(shí),有兩種方法處理這種情況。第1種方法是在運(yùn)行時(shí)得到SWI功能號(hào),然后構(gòu)造出相應(yīng)的SWI指令的編碼,把這個(gè)指令的編碼保存在某個(gè)存儲(chǔ)單元中,執(zhí)行該指令即可。第2種方法使用一個(gè)通用的SWI異常中斷處理程序,將運(yùn)行時(shí)需要調(diào)用的SWI功能號(hào)作為參數(shù)傳遞給該通用的SWI異常中斷處理程序,通用的SWI異常中斷處理程序根據(jù)參數(shù)值調(diào)用相應(yīng)的SWI處理程序完成需要的操作。在操作系統(tǒng)中通常使用一個(gè)SWI功能號(hào)和一個(gè)寄存器來提供很多的SWI功能調(diào)用。這樣可以將其他的SWI功能號(hào)留給用戶使用。例5.8從應(yīng)用程序動(dòng)態(tài)調(diào)用SWI的例子

#ifdef__thumb#defineSemiSWI0xAB/*Thumb的semihostingSWI號(hào)為0xAB*/#else#defineSemiSWI0x123456/*ARM的semihostingSWI號(hào)為0x123456*/#endif/*使用SemihostingSWI輸出一個(gè)字符*/__swi(SemiSWI)voidSemihosting(unsignedop,char*c);#defineWriteC(c)Semihosting(0x3,c)voidwrite_a_character(intch){chartempch=ch;WriteC(&tempch);}

5.5FIQ和IRQ異常中斷處理程序5.5.1IRQ/FIQ中斷處理機(jī)制5.5.2IRQ/FIQ異常中斷處理程序5.5.3IRQ異常中斷處理程序舉例5.5.1IRQ/FIQ中斷處理機(jī)制

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異常中斷被禁止。

由于FIQ異常中斷通常用于系統(tǒng)中對(duì)于響應(yīng)時(shí)間要求比較苛刻的任務(wù),ARM體系在設(shè)計(jì)上有一些特別的安排,以盡量減少FIQ異常中斷的響應(yīng)時(shí)間。FIQ異常中斷的中斷向量為0x1C,位于中斷向量表的最后。這樣FIQ異常中斷處理程序可以直接放在地址0x1C開始的存儲(chǔ)單元,這種安排省掉了中斷向量表中的跳轉(zhuǎn)指令,從而也就節(jié)省了中斷響應(yīng)的時(shí)間。當(dāng)系統(tǒng)中存在Cache時(shí),可以把FIQ異常中斷向量以及處理程序一起鎖定在Cache中,從而大大地提高了FIQ異常中斷的響應(yīng)時(shí)間。除此之外,與其他模式相比,F(xiàn)IQ異常模式還有額外的5個(gè)物理寄存器,這樣在進(jìn)入FIQ處理程序時(shí)可以不用保存這5個(gè)寄存器,從而也提高了FIQ異常中斷的執(zhí)行速度。IRQ和FIQ中斷處理機(jī)制如圖5-9所示,ARM內(nèi)核只有二個(gè)外部中斷輸入信號(hào)nFIQ和nIRQ,但對(duì)于一個(gè)系統(tǒng)來說,中斷源可能多達(dá)幾十個(gè)。為此,在系統(tǒng)集成的時(shí)候,一般都會(huì)有一個(gè)異??刂破鱽硖幚懋惓P盘?hào)。用戶程序可能存在多個(gè)IRQ/FIQ的中斷處理函數(shù),為了從向量表開始的跳轉(zhuǎn)最終能找到正確的處理函數(shù)入口,需要設(shè)計(jì)一套處理機(jī)制和方法。通常可以從硬件和軟件兩個(gè)角度考慮。

圖5-9中斷處理機(jī)制

有的系統(tǒng)在ARM的異常向量表之外,又增加了一張由中斷控制器控制的特殊向量表。當(dāng)由外設(shè)觸發(fā)一個(gè)中斷以后,PC能夠自動(dòng)跳到這張?zhí)厥庀蛄勘碇腥ィ厥庀蛄勘碇械拿總€(gè)向量空間對(duì)應(yīng)一個(gè)具體的中斷源。例如,假設(shè)某系統(tǒng)一共有20個(gè)外設(shè)中斷源,特殊向量表被直接放置在普通向量表后面。如圖5-10所示。圖5-10額外的硬件異常向量表

當(dāng)某個(gè)外部中斷觸發(fā)之后,首先觸發(fā)ARM的內(nèi)核異常,中斷控制器檢測(cè)到ARM的這種狀態(tài)變化,再通過識(shí)別具體的中斷源,使PC自動(dòng)跳轉(zhuǎn)到特殊向量表中的對(duì)應(yīng)地址,從而開始一次異常響應(yīng)。需要檢查具體的芯片說明,是否支持這類特性。多數(shù)情況下是用軟件來處理異常分支。如圖5-11所示,因?yàn)檐浖梢酝ㄟ^讀取中斷控制器來獲得中斷源的詳細(xì)信息。圖5-11軟件控制中斷分支

因?yàn)檐浖O(shè)計(jì)的靈活性,用戶可以設(shè)計(jì)出比上圖更好的流程控制方法來。如圖5-12所示,用戶可以自定義向量表來實(shí)現(xiàn)中斷的處理程序。圖5-12用戶自定義向量表5.5.2IRQ/FIQ異常中斷處理程序可重入的異常中斷處理程序:在有些IRQ/FIQ異常中斷處理程序中,允許新的IRQ/FIQ異常中斷,這時(shí)將需要一些特別的操作保證“老的”異常中斷的寄存器不會(huì)被“新的”異常中斷破壞,這種IRQ/FIQ異常中斷處理程序稱為可重入的異常中斷處理程序(reentrantinterrupthandler)。1.不可重入的IRQ/FIQ異常中斷處理程序?qū)τ贑語(yǔ)言不可重入的IRQ/FIQ異常中斷處理程序可以使用關(guān)鍵詞__irq來說明。關(guān)鍵詞__irq可以實(shí)現(xiàn)下面的操作:保存ATPCS規(guī)定的被破壞的寄存器保存其他中斷處理程序中用到的寄存器同時(shí)將(LR-4)賦與程序計(jì)數(shù)器PC實(shí)現(xiàn)中斷處理程序的返回,并且恢復(fù)CPSR寄存器的內(nèi)容。

當(dāng)IRQ/FIQ異常中斷處理程序調(diào)用了子程序時(shí),關(guān)鍵詞__irq可以使IRQ/FIQ異常中斷處理程序返回時(shí)從其數(shù)據(jù)棧中讀取LR_irq值,并通過SUBSPC,LR,#4實(shí)現(xiàn)返回。

例5.9關(guān)鍵字__irq的作用第1個(gè)程序使用關(guān)鍵詞__irq聲明__irqvoidIRQHandle(void){volatileunsignedintbase=(unsignedint*)0x80000000;if(*base==1){C_int_handler();//調(diào)用相應(yīng)的C語(yǔ)言處理程序}*(base+1)=0;}第一個(gè)C語(yǔ)言程序?qū)?yīng)的匯編語(yǔ)言程序如下:IRQHandlerPROCSTMFDSP!,{R0-R4,R12,LR}MOVR4,#0x80000000LDRR0,[R4,#0]SUBSP,SP,#4;CMPR0,#1BLEQC_int_handlerMOVR0,#0STRR0,[R4,#4]ADDSP,SP,#4LDMFDSP!,{R0-R4,R12,LR}SUBSPC,LR,#4ENDPEXPORTIRQHandler

第2個(gè)程序沒有使用關(guān)鍵詞__irq聲明irqvoidIRQHandle(void){volatileunsignedintbase=(unsignedint*)0x80000000;if(*base==1){C_int_handler();//調(diào)用相應(yīng)的C語(yǔ)言處理程序}*(base+1)=0;}第2個(gè)C語(yǔ)言程序?qū)?yīng)的匯編語(yǔ)言程序如下:IRQHandlerPROCSTMFDSP!,{R0-R4,R12,LR}MOVR4,#0x80000000LDRR0,[R4,#0]CMPR0,#1BLEQC_int_handlerMOVR0,#0STRR0,[R4,#4]LDMFDSP!,{R0-R4,R12,LR}ENDP2.可重入的IRQ/FIQ異常中斷處理程序如果在可重入的IRQ/FIQ異常中斷處理程序中調(diào)用了子程序,子程序的返回地址將被保存到寄存器LR_irq中,這時(shí)如果發(fā)生了IRQ/FIQ異常中斷,這個(gè)LR_irq寄存器的值將會(huì)被破壞,那么調(diào)用的子程序?qū)⒉荒苷_返回。因此,對(duì)于可重入的IRQ/FIQ異常中斷處理程序需要一些特別的操作。這時(shí),第1級(jí)中斷處理程序(對(duì)應(yīng)于IRQ/FIQ異常中斷的程序)不能使用C語(yǔ)言,因?yàn)槠渲幸恍┎僮鞑荒芡ㄟ^C語(yǔ)言實(shí)現(xiàn)。下面列出了可重入的IRQ/FIQ異常中斷處理程序需要的操作:將返回地址保存到IRQ的數(shù)據(jù)棧中。保存工作寄存器和SPSR_irq清除中斷標(biāo)志位將處理器切換到系統(tǒng)模式,重新使能中斷(IRQ/FIQ)保存用戶模式的LR寄存器和被調(diào)用者不保存的寄存器調(diào)用C語(yǔ)言的IRQ/FIQ異常中斷處理程序當(dāng)C語(yǔ)言程序的IRQ/FIQ異常中斷處理程序返回后,恢復(fù)用戶模式的寄存器,并禁止中斷(IRQ/FIQ)切換到IRQ模式,禁止中斷恢復(fù)工作組寄存器和寄存器LR_irq從IRQ異常中斷處理程序中返回例5.10可重入的IRQ/FIQ異常中斷處理程序AREAINTERRUPT,CODE,READONLYIMPORTC_irq_handler;引入C語(yǔ)言的IRQ中斷處理程序IRQSUBLR,LR,#4;保存返回IRQ處理程序地址STMFDSP!,{LR}MRSR14,SPSR;保存SPSR_irq,及其他工作寄存器STMFDSP!,{R12,R14}…;在這里添加指令,清除中斷標(biāo)志位

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論