嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)-基于ARM Cortex-A9和Linux 課件 第05章 中斷及中斷處理_第1頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)-基于ARM Cortex-A9和Linux 課件 第05章 中斷及中斷處理_第2頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)-基于ARM Cortex-A9和Linux 課件 第05章 中斷及中斷處理_第3頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)-基于ARM Cortex-A9和Linux 課件 第05章 中斷及中斷處理_第4頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)-基于ARM Cortex-A9和Linux 課件 第05章 中斷及中斷處理_第5頁(yè)
已閱讀5頁(yè),還剩45頁(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)介

第五章中斷及中斷處理北京航空航天大學(xué)電工電子中心2025年3月提綱中斷響應(yīng)及優(yōu)先級(jí)ARM的通用中斷控制器GIC寄存器及應(yīng)用舉例ARM中的異常中斷處理概述進(jìn)入和退出異常中斷的過(guò)程在應(yīng)用程序中安排異常中斷處理程序SWI異常、FIQ和IRQ異常中斷處理程序CPU與外部設(shè)備之間的數(shù)據(jù)交換,可以采用無(wú)條件傳送,查詢傳送,也可以采用中斷方式。當(dāng)CPU正常運(yùn)行程序時(shí),由于微處理器內(nèi)部事件或外部請(qǐng)求,引起CPU中斷真在運(yùn)行的程序,轉(zhuǎn)去執(zhí)行請(qǐng)求中斷的外設(shè)(或內(nèi)部事件)的中斷服務(wù)子程序,中斷程序執(zhí)行完畢,再返回被終止的程序,這個(gè)過(guò)程被稱為中斷。利用中斷可以避免不斷檢測(cè)外部設(shè)備狀態(tài),提高CPU的利用率。中斷概念中斷的例子

某人正在做家務(wù),如果沒(méi)有“中斷”的話,他會(huì)一直做下去,直到把家務(wù)做完。突然出現(xiàn)了電話“中斷”,現(xiàn)在必須去接電話,電話剛剛接通,突然有人敲門,“中斷”的過(guò)程被新的“中斷”嵌套。現(xiàn)在必須去開(kāi)門,門開(kāi)了,進(jìn)來(lái)一個(gè)工人師傅,他是一個(gè)抄水表工,抄完水表,把他送出門。需要繼續(xù)接電話,接完電話,他繼續(xù)做家務(wù)。這是一個(gè)二級(jí)中斷系統(tǒng)的例子。包括主函數(shù)、中斷服務(wù)函數(shù)1和中斷服務(wù)函數(shù)2,函數(shù)1被函數(shù)2中斷的過(guò)程也常常被稱為中斷嵌套。如果有更高級(jí)別的中斷申請(qǐng),CPU將保護(hù)斷點(diǎn)2的位置(該指令后面一條運(yùn)行指令的位置)和保護(hù)現(xiàn)場(chǎng)。響應(yīng)更高級(jí)別的中斷,將中斷服務(wù)函數(shù)2的地址送給程序計(jì)數(shù)器(PC),CPU開(kāi)始執(zhí)行中斷服務(wù)函數(shù)2的程序,執(zhí)行完該程序,中斷返回。先是恢復(fù)現(xiàn)場(chǎng)(包括相關(guān)的寄存器、計(jì)數(shù)器和相關(guān)的變量和數(shù)據(jù)結(jié)構(gòu)),然后是中斷返回,返回地址是在斷點(diǎn)2壓入堆棧的斷點(diǎn)地址,繼續(xù)執(zhí)行中斷服務(wù)函數(shù)1,執(zhí)行完中斷服務(wù)函數(shù)1。恢復(fù)斷點(diǎn)1處的現(xiàn)場(chǎng),接著中斷返回到斷點(diǎn)1處執(zhí)行主函數(shù)。至此,二級(jí)中斷系統(tǒng)執(zhí)行完畢。二級(jí)中斷系統(tǒng)CPU對(duì)中斷的響應(yīng)中斷的響應(yīng)關(guān)中斷保留斷點(diǎn)保護(hù)現(xiàn)場(chǎng)給出中斷入口,轉(zhuǎn)入相應(yīng)的中斷服務(wù)程序恢復(fù)現(xiàn)場(chǎng)與返回鏈?zhǔn)絻?yōu)先權(quán)排隊(duì)電路在鏈?zhǔn)诫娐分校旁阪湹淖钋懊娴闹袛嗑哂凶罡叩膬?yōu)先權(quán),即中斷輸入1具有最高的優(yōu)先權(quán),然后是中斷輸入2,然后是中斷輸入3,……。F/F是觸發(fā)器,用于保存中斷觸發(fā)信號(hào),中斷輸入信號(hào)是“1”有效,“0”無(wú)效,中斷響應(yīng)后,該位自動(dòng)清零。在鏈?zhǔn)浇Y(jié)構(gòu)的優(yōu)先權(quán)排隊(duì)電路中,當(dāng)有兩個(gè)或者以上的中斷源排隊(duì)的時(shí)候,響應(yīng)高優(yōu)先權(quán)的中斷,低優(yōu)先級(jí)的中斷被屏蔽。當(dāng)高優(yōu)先級(jí)的中斷執(zhí)行完畢,接下來(lái)執(zhí)行低優(yōu)先級(jí)中斷。編碼器和譯碼器的優(yōu)先權(quán)排隊(duì)電路這是有一個(gè)3位二進(jìn)制的比較器,參與比較的數(shù)據(jù)是A2A1A0與B2B1B0。正在運(yùn)行的中斷源的編號(hào)放在優(yōu)先權(quán)寄存器里,輸出在比較器的B2B1B0端。只有當(dāng)A2A1A0>B2B1B0時(shí),“A>B”端輸出高電平,打開(kāi)與門1,將中斷請(qǐng)求信號(hào)送至CPU的INTR端,CPU就去中斷正在進(jìn)行的中斷處理程序,轉(zhuǎn)去執(zhí)行更高級(jí)的中斷。提綱中斷響應(yīng)及優(yōu)先級(jí)ARM的通用中斷控制器GIC寄存器及應(yīng)用舉例ARM中的異常中斷處理概述進(jìn)入和退出異常中斷的過(guò)程在應(yīng)用程序中安排異常中斷處理程序SWI異常、FIQ和IRQ異常中斷處理程序通用中斷控制器(GIC)邏輯分區(qū)GIC(通用中斷控制器)是外設(shè)中斷和CPU之間的接口電路,目的是把中斷源送給CPU。它在硬件結(jié)構(gòu)上分為兩個(gè)大的邏輯塊:Distributor(分發(fā)器)和CPUInterface(CPU接口電路)。圖中,CFGSDISABLE是一個(gè)控制信號(hào),當(dāng)該位為“1”時(shí),不能修改使能信號(hào)“EnableNon-secure”的值。分發(fā)器是多輸入、多輸出電路,輸入信號(hào)是中斷源,輸出信號(hào)連接到CPUinterface0或者CPUinterface1。分發(fā)器收集所有的中斷源,執(zhí)行中斷優(yōu)先級(jí)排序,它將優(yōu)先級(jí)最高的中斷事件發(fā)送到CPU接口端,同時(shí)選擇是哪一個(gè)CPU接口端,以進(jìn)行優(yōu)先級(jí)屏蔽和搶占處理。分發(fā)器寄存器由GICD_前綴標(biāo)識(shí)。模塊功能如下:全局中斷使能控制;控制每一個(gè)中斷的使能或者關(guān)閉;設(shè)置每個(gè)中斷的優(yōu)先級(jí);設(shè)置每個(gè)中斷的目標(biāo)處理器列表;設(shè)置每個(gè)外部中斷的觸發(fā)模式:電平觸發(fā)或邊沿觸發(fā);設(shè)置每個(gè)中斷屬于組0還是組1;每個(gè)中斷狀態(tài)的可見(jiàn);軟件可以設(shè)置或清除外設(shè)中斷掛起狀態(tài)。Distributori.MX6Solo/6DL共160個(gè)中斷源,可分為三類:SPIs:共享中斷。ID159~ID32,這128個(gè)ID分配給SPIs。這是由外設(shè)產(chǎn)生,可以發(fā)送給一個(gè)或多個(gè)核心處理的中斷源。PPIs:專用外設(shè)中斷。ID31~ID16,這16個(gè)ID分配給PPIs。這是由外設(shè)產(chǎn)生,是專由特定核心處理的中斷。SGI:軟件中斷。ID15~ID0,這16個(gè)ID分配給SGI。軟件中斷的產(chǎn)生是通過(guò)軟件寫入到一個(gè)專門的寄存器:軟中斷產(chǎn)生中斷寄存器(ICDSGIR)。它常用在核間通信。軟中斷能以所有核心為目標(biāo)或選中一組系統(tǒng)中的核心為目標(biāo)。常見(jiàn)的中斷源有:數(shù)據(jù)輸入/輸出外設(shè)請(qǐng)求中斷、定時(shí)時(shí)間到申請(qǐng)中斷、滿足規(guī)定狀態(tài)申請(qǐng)中斷、電源掉電申請(qǐng)中斷、故障報(bào)警申請(qǐng)中斷、程序調(diào)試申請(qǐng)中斷等。ARM的中斷源CPUInterfaces和CPUCore相連接的,因此每個(gè)CPUCore都可以在GIC中找到一個(gè)與之對(duì)應(yīng)的CPUInterface。CPUInterface是Distributor和CPUCore之間的橋梁。執(zhí)行優(yōu)先屏蔽和搶占處理系統(tǒng)中連接的處理器。CPU接口是有時(shí)稱為物理CPU接口,以避免可能與虛擬CPU接口混淆。CPU接口塊寄存器由GICC_前綴標(biāo)識(shí)。模塊功能如下:使能或者關(guān)閉發(fā)送到CPUCore的中斷請(qǐng)求信號(hào);設(shè)置優(yōu)先級(jí)掩碼,通過(guò)掩碼來(lái)設(shè)置哪些中斷不需要上報(bào)給CPUCore;當(dāng)多個(gè)中斷到來(lái)的時(shí)候,選擇優(yōu)先級(jí)最高的中斷通知給CPUCore;定義搶占策略;應(yīng)答中斷;通知中斷處理完成。CPUInterfaces中斷狀態(tài)轉(zhuǎn)換圖無(wú)效。

中斷沒(méi)有發(fā)生。掛起。發(fā)生了中斷,但又沒(méi)運(yùn)行的狀態(tài)。此時(shí)的中斷等待CPU的控制權(quán),拿到控制權(quán)的中斷通過(guò)C或D去運(yùn)行。掛起的中斷也可被取消,通過(guò)B1進(jìn)入無(wú)效。運(yùn)行。正在運(yùn)行的中斷被高優(yōu)先級(jí)中斷剝奪CPU的控制權(quán)后,通過(guò)A2進(jìn)入“運(yùn)行或掛起”態(tài),等待再次獲得CPU的控制權(quán)后繼續(xù)運(yùn)行。運(yùn)行或掛起。這是一個(gè)運(yùn)行或者掛起的中間態(tài),叫“運(yùn)行和掛起”。它有兩條到達(dá)路徑:A2或者D。GIC中斷處理流程1)當(dāng)ARM內(nèi)核收到中斷時(shí),它會(huì)跳轉(zhuǎn)到異常向量表中,PC寄存器獲得對(duì)應(yīng)的異常向量并開(kāi)始執(zhí)行中斷處理程序。2)在中斷處理函數(shù)中,先讀取GIC控制器CPU接口模塊內(nèi)的中斷響應(yīng)寄存器,一方面獲取需要處理的中斷ID號(hào),進(jìn)行相應(yīng)的中斷處理,另一方面作為ARM核心對(duì)GIC發(fā)來(lái)中斷信號(hào)的應(yīng)答,GIC接收到應(yīng)答信號(hào),GIC分配器會(huì)把對(duì)應(yīng)的中斷源的狀態(tài)設(shè)置為運(yùn)行狀態(tài)。3)當(dāng)中斷處理程序執(zhí)行結(jié)束后,中斷處理函數(shù)需要寫入相同的中斷ID號(hào)到GIC控制器CPU接口模塊內(nèi)的中斷結(jié)束寄存器(ICCEOIR),作為給GIC控制器的中斷處理結(jié)束信號(hào)。GIC分配器會(huì)把對(duì)應(yīng)中斷源的狀態(tài)由“運(yùn)行”設(shè)置為“無(wú)效”(如果中斷運(yùn)行的過(guò)程中被更高優(yōu)先級(jí)中斷搶占,退回到“運(yùn)行或掛起”狀態(tài))。同時(shí)GIC控制器CPU接口模塊就可以繼續(xù)提交一個(gè)優(yōu)先級(jí)最高的狀態(tài)為“掛起”的中斷到ARM內(nèi)核進(jìn)行中斷處理。一次完整的中斷處理到此完成。提綱中斷響應(yīng)及優(yōu)先級(jí)ARM的通用中斷控制器GIC寄存器及應(yīng)用舉例ARM中的異常中斷處理概述進(jìn)入和退出異常中斷的過(guò)程在應(yīng)用程序中安排異常中斷處理程序SWI異常、FIQ和IRQ異常中斷處理程序GIC寄存器ICDISRn是中斷安全狀態(tài)寄存器,分為8段,每段長(zhǎng)度為32位。ICDISERn是中斷使能寄存器。ICDICERn是中斷清除使能寄存器,讀取對(duì)應(yīng)位的值為1,該寄存器寫無(wú)效。ICDISPRn是設(shè)置等待狀態(tài),防止多個(gè)CPU處理同一個(gè)中斷。ICDICPRn是清除等待狀態(tài),設(shè)置對(duì)應(yīng)位的中斷取消等待狀態(tài)。ICDABRn是活性位寄存器。ICDIPRn是中斷優(yōu)先級(jí)寄存器,偏移量為中斷號(hào)值。ICDIPTR是中斷處理器目標(biāo)寄存器,偏移量為中斷號(hào)值。ICDICFRn是中斷控制寄存器,SGI模式是只讀的。GICC_PMR寄存器只有低8位有效,這8位最多可以設(shè)置256個(gè)優(yōu)先級(jí)。11111111256個(gè)優(yōu)先級(jí) 11111110128個(gè)優(yōu)先級(jí)1111110064個(gè)優(yōu)先級(jí) 1111100032個(gè)優(yōu)先級(jí)1111000016個(gè)優(yōu)先級(jí)i.MX6Solo/6DL最多支持32個(gè)優(yōu)先級(jí),所以GICC_PMR要設(shè)置為8b11111000。設(shè)置搶占優(yōu)先級(jí)和子優(yōu)先級(jí)。GICC_BPR寄存器決定搶占優(yōu)先級(jí)和子優(yōu)先級(jí)的比例,寄存器GICC_BPR只有低3位有效。000:7級(jí)搶占優(yōu)先級(jí),1級(jí)子優(yōu)先級(jí)。 001:6級(jí)搶占優(yōu)先級(jí),2級(jí)子優(yōu)先級(jí)。010:5級(jí)搶占優(yōu)先級(jí),3級(jí)子優(yōu)先級(jí)。 011:4級(jí)搶占優(yōu)先級(jí),4級(jí)子優(yōu)先級(jí)。100:3級(jí)搶占優(yōu)先級(jí),5級(jí)子優(yōu)先級(jí)。 101:2級(jí)搶占優(yōu)先級(jí),6級(jí)子優(yōu)先級(jí)。110:1級(jí)搶占優(yōu)先級(jí),7級(jí)子優(yōu)先級(jí)。 111:0級(jí)搶占優(yōu)先級(jí),8級(jí)子優(yōu)先級(jí)。設(shè)置中斷優(yōu)先級(jí)GIC應(yīng)用舉例編寫一個(gè)軟件中斷程序,在超級(jí)終端上顯示“SGIwashandled”。軟件中斷的實(shí)現(xiàn),需要5個(gè)函數(shù)。首先,需要使用register_interrupt_routine()函數(shù)注冊(cè)中斷處理程序,其中的參數(shù)3表示中斷號(hào),gic_sgi_test_handler表示一個(gè)中斷處理程序。該函數(shù)將中斷處理程序的地址存放到中斷處理程序數(shù)組中,當(dāng)對(duì)應(yīng)中斷號(hào)的中斷產(chǎn)生時(shí),就會(huì)執(zhí)行對(duì)應(yīng)的處理程序。(1)register_interrupt_routine(SW_INTERRUPT_3,gic_sgi_test_handler,intn);mx6_enable_interrupt函數(shù)的功能是設(shè)置處理該中斷的CPU和優(yōu)先級(jí),這里設(shè)置處理中斷號(hào)SW_INTERRUPT_3的CPU為CPU_0,優(yōu)先級(jí)為0(最高)。(2)voidmx6_enable_interrupt(uint32_tirq_id,uint32_tcpu_id,uint32_tpriority){MX6_ICDIPR3=priority&0xff; /*setirqpriority*/MX6_ICDISR0&=~(1<<irq_id); /*setIRQassecure*/MX6_ICDIPTR3|=(cpu_id&0xff); /*setcputarget*/}gic_send_sgi()函數(shù)是通過(guò)軟件方式觸發(fā)一個(gè)中斷,中斷號(hào)是SW_INTERRUPT_3,第二個(gè)參數(shù)表示目標(biāo)處理進(jìn)程,kGicSgiFilter_ΜSeTargetList表示使用目標(biāo)列表。gic_send_sgi()函數(shù)是向指定目標(biāo)發(fā)送一個(gè)中斷,當(dāng)目標(biāo)接收到中斷后就會(huì)執(zhí)行中斷處理函數(shù)。(3)gic_send_sgi(SW_INTERRUPT_3,1,kGicSgiFilter_ΜSeTargetList);編寫一個(gè)中斷處理函數(shù),在產(chǎn)生中斷后,程序會(huì)直接執(zhí)行此處的代碼。這段代碼的功能是打印出一句話,并且將一個(gè)全局變量gicTestDone設(shè)置為0。(4)voidgic_sgi_test_handler(void){printf("Ingic_sgi_test_handler()\n");gicTestDone=0; //testcomplete}測(cè)試程序主要是通過(guò)軟中斷方式觸發(fā)中斷,產(chǎn)生中斷后會(huì)將變量gicTestDone設(shè)置為0,如果沒(méi)有產(chǎn)生中斷程序會(huì)一直處于While循環(huán)中。(5)voidgic_test(void){printf("StartingGICSGItest\n");register_interrupt_routine(3,gic_sgi_test_handler);/*registersgi_irq_id=3*/mx6_enable_interrupt(3,0,0); /*enableinterrupt*/gicTestDone=1; /*interruptflag*/printf("SendingSGI\n");MX6_ICDSGIR=(0<<24)|(1<<16)|(3&0xf);/*sendsgi*/printf("Waiting\n");while(gicTestDone); /*waitinginterrupt*/printf("SGIwashandled\n");}(6)實(shí)驗(yàn)結(jié)果,測(cè)試GIC中斷,成功輸出“SGIwashandled”,如圖5.8所示。提綱中斷響應(yīng)及優(yōu)先級(jí)ARM的通用中斷控制器GIC寄存器及應(yīng)用舉例ARM中的異常中斷處理概述進(jìn)入和退出異常中斷的過(guò)程在應(yīng)用程序中安排異常中斷處理程序SWI異常、FIQ和IRQ異常中斷處理程序ARM體系控制程序的執(zhí)行流程1.在正常程序執(zhí)行過(guò)程中,每執(zhí)行一條ARM指令,程序計(jì)數(shù)器(PC)的值增加4個(gè)字節(jié);每執(zhí)行一條Thumb指令,PC的值加兩個(gè)字節(jié)。整個(gè)過(guò)程是順序執(zhí)行的;2.通過(guò)跳轉(zhuǎn)指令,程序可以跳轉(zhuǎn)到特定的地址標(biāo)號(hào)處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行。其中,B指令用于執(zhí)行跳轉(zhuǎn)操作;BL指令在執(zhí)行跳轉(zhuǎn)操作的同時(shí),保存子程序的返回地址;BX指令在執(zhí)行跳轉(zhuǎn)操作的同時(shí),根據(jù)目標(biāo)地址最低位,可以將程序切換到Thumb狀態(tài);3.當(dāng)異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。當(dāng)異常中斷處理程序執(zhí)行完成后,程序返回到發(fā)生中斷的指令的下一條指令處執(zhí)行。在進(jìn)入異常中斷處理程序時(shí),要保存被中斷的程序的執(zhí)行現(xiàn)場(chǎng),在從異常中斷處理程序退出時(shí),要恢復(fù)被中斷的程序的執(zhí)行現(xiàn)場(chǎng)。ARM體系中的異常中斷種類各異常中斷的中斷向置地址以及中斷的處理優(yōu)先級(jí)中斷向量表中指定了各異常中斷及其處理程序的對(duì)應(yīng)關(guān)系。它通常存放在存儲(chǔ)地址的低端。存ARM體系中,異常中斷向量表的大小為32字節(jié)。其中,每個(gè)異常中斷占據(jù)4個(gè)字節(jié)大小,保留了4個(gè)字節(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í)行。異常中斷使用的寄存器提綱中斷響應(yīng)及優(yōu)先級(jí)ARM的通用中斷控制器GIC寄存器及應(yīng)用舉例ARM中的異常中斷處理概述進(jìn)入和退出異常中斷的過(guò)程在應(yīng)用程序中安排異常中斷處理程序SWI異常、FIQ和IRQ異常中斷處理程序1.保存存儲(chǔ)器當(dāng)前狀態(tài)、中斷屏蔽位以及各條件標(biāo)志位。通過(guò)將CPSR的內(nèi)容保存到將要執(zhí)行的的SPSR寄存器中實(shí)現(xiàn)的。各異常中斷有自己的SPSR寄存器。2.設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中相應(yīng)的位。包括設(shè)置CPSR中的位,使處理器進(jìn)入相應(yīng)的執(zhí)行模式;設(shè)置CPSR中的位,禁止IRQ中斷,當(dāng)進(jìn)入FIQ模式時(shí),禁止FIQ中斷。3.將寄存器lr_mode設(shè)置成返回地址。4.將程序計(jì)數(shù)器值(PC)設(shè)置成該異常中斷的中斷向量地址,從而跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。ARM處理器對(duì)異常中斷的響應(yīng)過(guò)程響應(yīng)復(fù)位異常中斷當(dāng)處理器的復(fù)位引腳有效時(shí),處理器終止當(dāng)前指令。當(dāng)處理器的復(fù)位引腳變成無(wú)效時(shí),處理器開(kāi)始執(zhí)行下面的操作:響應(yīng)未定義指令異常中斷處理器響應(yīng)未定義指令異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示:響應(yīng)SWI異常中斷處理器響應(yīng)SWI異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示:響應(yīng)指令預(yù)取終止異常中斷處理器響應(yīng)指令預(yù)取終止異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示:響應(yīng)數(shù)據(jù)訪問(wèn)終止異常中斷處理器響應(yīng)數(shù)據(jù)訪問(wèn)終止異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示:響應(yīng)IRQ異常中斷處理器響應(yīng)IRQ異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示:響應(yīng)FIQ異常中斷處理器響應(yīng)FIQ異常中斷時(shí)的處理過(guò)程如下面的偽代碼所示:從異常中斷處理程序中返回從異常中斷處理程序中返回包括下面兩個(gè)基本操作:1.恢復(fù)被中斷的程序的處理器狀態(tài),即把SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中;2.返回到發(fā)生異常中斷的指令的下一條指令處執(zhí)行,即把lr_mode寄存器的內(nèi)容復(fù)制到程序計(jì)數(shù)器PC中。復(fù)位異常中斷處理程序不需要返回。整個(gè)應(yīng)用系統(tǒng)是從復(fù)位異常中斷處理程序開(kāi)始執(zhí)行的,因而它不需要返回。SWI和未定義指令異常中斷處理程序的返回如下:MOV PC,LRSTMFD sp!,{reglist,lr};…LDMFD sp!,{reglist,pc}^上述指令中,reglist是異常中斷處理程序中使用的寄存器列表。標(biāo)識(shí)符^指示將SPSR_mode寄存器的內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。該指令只能在特權(quán)模式下使用。提綱中斷響應(yīng)及優(yōu)先級(jí)ARM的通用中斷控制器GIC寄存器及應(yīng)用舉例ARM中的異常中斷處理概述進(jìn)入和退出異常中斷的過(guò)程在應(yīng)用程序中安排異常中斷處理程序SWI異常、FIQ和IRQ異常中斷處理程序通常有兩種方法將異常中斷處理程序注冊(cè)到異常中斷向量表中。一種是使用跳轉(zhuǎn)指令,另一種是使用數(shù)據(jù)讀取指令LDR。1.使用跳轉(zhuǎn)指令的方法比較簡(jiǎn)單,可以在異常中斷對(duì)應(yīng)的向量表中的特定位置放一條跳轉(zhuǎn)指令,直接跳轉(zhuǎn)到該異常中斷的處理程序。這種方法有一個(gè)缺點(diǎn),即跳轉(zhuǎn)指令只能在32MB的空間范圍內(nèi)跳轉(zhuǎn)。2.使用數(shù)據(jù)讀取指令LDR向程序計(jì)數(shù)器PC中直接賦值。這種方法分為兩步:先將異常中斷處理程序的絕對(duì)地址存放在距離向量表4KB的范圍之內(nèi)的一個(gè)存儲(chǔ)單元中;再使用數(shù)據(jù)讀取指令LDR將該單元的內(nèi)容讀取到程序計(jì)數(shù)器PC中。異常中斷處理程序注冊(cè)到異常中斷向量表中的方法地址0x0處為ROM系統(tǒng)復(fù)位時(shí)安排異常中斷處理程序當(dāng)?shù)刂?x0處為ROM時(shí),在異常中斷向量表中,可以使用數(shù)據(jù)讀取指令LDR直接向程序計(jì)數(shù)器PC中賦值,也可以直接使用跳轉(zhuǎn)指令跳轉(zhuǎn)到異常中斷處理程序。地址0x0處為RAM系統(tǒng)復(fù)位時(shí)安排異常中斷處理程序當(dāng)?shù)刂?x0處為RAM時(shí),中斷向量表必須使用數(shù)據(jù)讀取指令直接向PC中賦值的形式。而且必須使用下面的代碼把中斷向量表從只讀ROM中復(fù)制到RAM的地址0x0開(kāi)始處的存儲(chǔ)空間中。提綱中斷響應(yīng)及優(yōu)先級(jí)ARM的通用中斷控制器GIC寄存器及應(yīng)用舉例ARM中的異常中斷處理概述進(jìn)入和退出異常中斷的過(guò)程在應(yīng)用程序中安排異常中斷處理程序SWI異常、FIQ和IRQ異常中斷處理程序SWI異常中斷處理程序的實(shí)現(xiàn)通常SWI異常中斷處理程序分為兩級(jí):第1級(jí)SWI異常中斷處理程序?yàn)閰R編程序,用于確定SWI指令中的24位的立即數(shù);第2級(jí)SWI異常中斷處理程序具體實(shí)現(xiàn)SWI的各個(gè)功能,它可以是匯編程序,也可以是C程序。1.第1級(jí)SWI異常中斷處理程序2.使用匯編程序的第2級(jí)SWI異常中斷處理程序可以使用跳轉(zhuǎn)指令,根據(jù)由第1級(jí)中斷處理程序得到的SWI指令中的立即數(shù)的值,直接跳轉(zhuǎn)到實(shí)現(xiàn)相應(yīng)SWI功能的處理程序。下例中的代碼實(shí)現(xiàn)了這種跳轉(zhuǎn)功能。這種第2級(jí)的SWI異常中斷處理程序?yàn)閰R編語(yǔ)言程序。3.使用C程序的第2級(jí)SWI異常中斷處理程序第2級(jí)SWI異常中斷處理程序也可以為C程序。這時(shí),利用從第1級(jí)SWI異常中斷處理程序得到的SWI指令中的24位立即數(shù)來(lái)跳轉(zhuǎn)到相應(yīng)的處理程序。下例是一個(gè)C程序的第2級(jí)SWI異常中斷處理程序模板。其中,參數(shù)number是從第1級(jí)SWI異常中斷處理程序得到的SWI指令中的24位立即數(shù)。IRQ/FIQ異常中斷處理程序的實(shí)現(xiàn)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異常中斷被屏蔽;程序狀態(tài)寄存器CPSR中的I控制位為0時(shí),CPU正常響應(yīng)FIQ和IRQ異常中斷請(qǐng)求。FIQ異常中斷為快速異常中斷,它比IRQ異常中斷優(yōu)先級(jí)高,這主要表現(xiàn)在如下兩個(gè)方面:1.當(dāng)FIQ和IRQ異常中斷同時(shí)產(chǎn)生時(shí),CPU先處理FIQ異常中斷;2.在FIQ異常中斷處理程序中,IRQ異常中斷被禁止。由于FIQ異常

溫馨提示

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