異常及中斷處理匯總(共19頁)_第1頁
異常及中斷處理匯總(共19頁)_第2頁
異常及中斷處理匯總(共19頁)_第3頁
異常及中斷處理匯總(共19頁)_第4頁
異常及中斷處理匯總(共19頁)_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上一 ARM異常中斷處理概述1、中斷的概念中斷是一個過程,是CPU在執(zhí)行當前程序的過程中因硬件或軟件的原因插入了另一段程序運行的過程。因硬件原因引起的中斷過程的出現(xiàn)是不可預(yù)測的,即隨機的,而軟中斷是事先安排的。 2、中斷源的概念 我們把可以引起中斷的信號源稱之為中斷源。3、中斷優(yōu)先級的概念A(yù)RM處理器中有7種類型的異常,按優(yōu)先級從高到低的排列如下:復(fù)位異常(Reset)、數(shù)據(jù)異常(Data Abort)、快速中斷異常(FIQ)、外部中斷異常(IRQ)、預(yù)取異常(Prefetch Abort)、軟件中斷(SWI)和未定義指令異常(Undefined instruction

2、) 二 ARM體系異常種類下面是ARM的7種異常當異常發(fā)生時,處理器會把PC設(shè)置為一個特定的存儲器地址。這一地址放在被稱為向量表(vector table)的特定地址范圍內(nèi)。向量表的入口是一些跳轉(zhuǎn)指令,跳轉(zhuǎn)到專門處理某個異?;蛑袛嗟淖映绦颉?當異常產(chǎn)生時, ARM core:拷貝 CPSR 到 SPSR_設(shè)置適當?shù)?CPSR 位: 改變處理器狀態(tài)進入 ARM 狀態(tài) 改變處理器模式進入相應(yīng)的異常模式設(shè)置中斷禁止位禁止相應(yīng)中斷 (如果需要)保存返回地址到 LR_設(shè)置 PC 為相應(yīng)的異常向量返回時, 異常處理需要:從 SPSR_恢復(fù)CPSR從LR_恢復(fù)PC Note:這些操作只能在 ARM 態(tài)執(zhí)行.

3、當異常發(fā)生時,分組寄存器r14和SPSR用于保存處理器狀態(tài),操作偽指令如下。 R14_ = return linkSPSR_ = CPSRCPSR40 = exception mode numberCPSR5 = 0 /*進入ARM狀態(tài)*/If = = reset or FIQ thenCPSR6 = 1/*屏蔽快速中斷FIQ*/CPSR7 = 1/*屏蔽外部中斷IRQ*/PC = exception vector address異常返回時,SPSR內(nèi)容恢復(fù)到CPSR,連接寄存器r14的內(nèi)容恢復(fù)到程序計數(shù)器PC。注:cortex-A8系統(tǒng)中支持通過設(shè)置CP15的c12寄存器將異常向量表的首地址

4、設(shè)置在任意地址。例如:mcr p15, 0, r0, c12, c0, 01復(fù)位異常當處理器的復(fù)位引腳有效時,系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面兩種情況下。系統(tǒng)上電。系統(tǒng)復(fù)位。當復(fù)位異常時,系統(tǒng)執(zhí)行下列偽操作:R14_svc = UNPREDICTABLE valueSPSR_svc = UNPREDICTABLE valueCPSR40 = 0b10011/*進入特權(quán)模式*/CPSR5 = 0/*處理器進入ARM狀態(tài)*/CPSR6 = 1/*禁止快速中斷*/CPSR7 = 1/*禁止外設(shè)中斷*/If high vectors configur

5、ed thenPC = 0xffff0000ElsePC = 0x 復(fù)位異常中斷處理程序的主要功能: 設(shè)置異常中斷向量表。 初始化數(shù)據(jù)棧和寄存器。 初始化存儲系統(tǒng),如系統(tǒng)中的MMU等。 初始化關(guān)鍵的I/O設(shè)備。 使能中斷。 處理器切換到合適的模式。 初始化C變量,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行。 2未定義指令異常當ARM處理器執(zhí)行協(xié)處理器指令時,它必須等待一個外部協(xié)處理器應(yīng)答后,才能真正執(zhí)行這條指令。若協(xié)處理器沒有相應(yīng),則發(fā)生未定義指令異常 當未定義異常發(fā)生時,系統(tǒng)執(zhí)行下列的偽操作:r14_und = address of next instruction after the undefined inst

6、ructionSPSR_und = CPSRCPSR40 = 0b11011/*進入未定義指令模式*/CPSR5 = 0/*處理器進入ARM狀態(tài)*/*CPSR6保持不變*/CPSR7 = 1/*禁止外設(shè)中斷*/If high vectors configured then PC = 0xffff0004Else PC = 0x3軟中斷SWI軟中斷異常發(fā)生時,處理器進入特權(quán)模式,執(zhí)行一些特權(quán)模式下的操作系統(tǒng)功能。軟中斷異常發(fā)生時,處理器執(zhí)行下列偽操作。r14_svc = address of next instruction after the SWI instructionSPSR_und =

7、 CPSRCPSR40 = 0b10011/*進入特權(quán)模式*/CPSR5 = 0/*處理器進入ARM狀態(tài)*/*CPSR6保持不變*/CPSR7 = 1/*禁止外設(shè)中斷*/If high vectors configured then PC = 0xffff0008Else PC = 0x 4預(yù)取指令異常預(yù)取指令異常是由系統(tǒng)存儲器報告的。當處理器試圖去取一條被標記為預(yù)取無效的指令時,發(fā)生預(yù)取異常。如果系統(tǒng)中不包含MMU時,指令預(yù)取異常中斷處理程序只是簡單地報告錯誤并退出。若包含MMU,引起異常的指令的物理地址被存儲到內(nèi)存中。預(yù)取異常發(fā)生時,處理器執(zhí)行下列偽操作:r14_svc = address

8、 of the aborted instruction + 4SPSR_und = CPSRCPSR40 = 0b10111/*進入特權(quán)模式*/CPSR5 = 0/*處理器進入ARM狀態(tài)*/*CPSR6保持不變*/CPSR7 = 1/*禁止外設(shè)中斷*/If high vectors configured then PC = 0xffff000CElse PC = 0xC5數(shù)據(jù)訪問中止異常數(shù)據(jù)訪問中止異常是由存儲器發(fā)出數(shù)據(jù)中止信號,它由存儲器訪問指令Load/Store產(chǎn)生。當數(shù)據(jù)訪問指令的目標地址不存在或者該地址不允許當前指令訪問時,處理器產(chǎn)生數(shù)據(jù)訪問中止異常。當數(shù)據(jù)訪問中止異常發(fā)生時,處理器

9、執(zhí)行下列偽操作。r14_abt = address of the aborted instruction + 8SPSR_abt = CPSRCPSR40 = 0b10111CPSR5 = 0/*CPSR6保持不變*/CPSR7 = 1 /*禁止外設(shè)中斷*/If high vectors configured then PC = 0xffff000C10Else PC = 0x當數(shù)據(jù)訪問中止異常發(fā)生時,寄存器的值將根據(jù)以下規(guī)則進行修改: 返回地址寄存器r14的值只與發(fā)生數(shù)據(jù)異常的指令地址有關(guān),與PC值無關(guān) 如果指令中沒有指定基址寄存器回寫,則基址寄存器的值不變 如果指令中指定了基址寄存器回寫,

10、則寄存器的值和具體芯片的Abort Models有關(guān),由芯片的生產(chǎn)商指定 如果指令只加載一個通用寄存器的值,則通用寄存器的值不變 如果是批量加載指令,則寄存器中的值是不可預(yù)知的值 如果指令加載協(xié)處理器寄存器的值,則被加載寄存器的值不可預(yù)知6外部中斷IRQ當處理器的外部中斷請求引腳有效,而且CPSR寄存器的I控制位被清除時,處理器產(chǎn)生外部中斷IRQ異常。系統(tǒng)中各外部設(shè)備通常通過該異常中斷請求處理器服務(wù)。當外部中斷IRQ發(fā)生時,處理器執(zhí)行下列偽操作。r14_irq = address of next instruction to be executed + 4SPSR_irq = CPSRCPSR

11、40 = 0b10010/*進入特權(quán)模式*/CPSR5 = 0/*處理器進入ARM狀態(tài)*/ /*CPSR6保持不變*/CPSR7 = 1 /*禁止外設(shè)中斷*/If high vectors configured then PC = 0xffff0018Else PC = 0x 7快速中斷FIQ當處理器的快速中斷請求引腳有效且CPSR寄存器的F控制位被清除時,處理器產(chǎn)生快速中斷請求FIQ異常。當快速中斷異常發(fā)生時,處理器執(zhí)行下列偽操作。r14_fiq = address of next instruction to be executed + 4SPSR_fiq = CPSRCPSR40 = 0

12、b10001 /*進入FIQ模式*/CPSR5 = 0CPSR6 = 1CPSR7 = 1If high vectors configured then PC= 0xffff001cElse PC = 0xc 三 ARM異常的優(yōu)先級四ARM 處理器模式和異常ARM處理器異常及其對應(yīng)的模式:每一種異常都會導(dǎo)致內(nèi)核進入一種特定的模式。也可以通過編程改變CPSR,進入任何一種ARM處理器模式。注:用戶模式和系統(tǒng)模式是僅有的不可以通過異常進入的兩種模式,也就是說,要進入這兩張模式必須通過編程改變CPSR五 ARM 異常響應(yīng)和處理程序返回1.中斷響應(yīng)的概念中斷響應(yīng)大致可以分為以下幾個步驟:1、 保護斷點

13、,即保存下一將要執(zhí)行的指令的地址,就是把這個地址送入堆棧。Sub lr, lr, #4Stmfd sp!, r0-r12, lr2、 尋找中斷入口,根據(jù)不同的中斷源所產(chǎn)生的中斷,查找不同的入口地址。Bl c_irq_handler3、 執(zhí)行中斷處理程序。可以寫在main函數(shù)中4、 中斷返回:執(zhí)行完中斷指令后,就從中斷處返回到主程序,繼續(xù)執(zhí)行。 Ldmfd sp!, r0-r12, pc2.ARM異常響應(yīng)流程1.判斷處理狀態(tài)2.向量表跳轉(zhuǎn)指令B的跳轉(zhuǎn)范圍為32MB,但很多情況下不能保證所有的異常處理函數(shù)都定位在向量的32MB范圍內(nèi),需要更大范圍的跳轉(zhuǎn),而且由于向量表空間的限制,只能由一條指令完成

14、。具體實現(xiàn)方法有下面兩種。(1)MOV PC,imme_value 這種辦法將目標地址直接賦值給PC。但這種方法受格式限制不能處理任意立即數(shù)。這個立即數(shù)由一個8位數(shù)值循環(huán)右移偶數(shù)位得到。(2)LDR PC,PC+offset 把目標地址先存儲在某一個合適的地址空間,然后把這個存儲器單元的32位數(shù)據(jù)傳送給PC來實現(xiàn)跳轉(zhuǎn)。這種方法對目標地址值沒有要求。但是存儲目標地址的存儲器單元必須在當前指令的4KB空間范圍內(nèi)。注意:在計算指令中引用offset數(shù)值的時候,要考慮處理器流水線中指令預(yù)取對PC值的影響。3.從異常處理程序中返回1恢復(fù)被中斷程序的處理器狀態(tài)PC和CPSR的恢復(fù)可以通過一條指令來實現(xiàn),下

15、面是3個例子。 MOVS PC,LR SUBS PC,LR,4 LDMFD SP!,PC這幾條指令是普通的數(shù)據(jù)處理指令,特殊之處在于它們把程序計數(shù)器寄存器PC作為目標寄存器,并且?guī)Я颂厥獾暮缶Y“S”或“”。其中“S”或“”的作用就是使指令在執(zhí)行時,同時完成從SPSR到CPSR的拷貝,達到恢復(fù)狀態(tài)寄存器的目的。2異常的返回地址六 S5PC100中斷相關(guān)的寄存器如果你要想通過 VIC(中斷控制器)控制一個外設(shè),首先查下面的中斷源表,找到其中斷號,然后去看中斷控制器中的寄存器對應(yīng)哪位來控制這個中斷。如果你需要在片外連接一個外設(shè),并且這個外設(shè)也需要申請中斷怎么辦呢?對了,用外部中斷管腳。也就是上圖對應(yīng)

16、的從 0 號到 16號中斷源,其中需要注意到是有 16 根中斷管腳共用一根中斷請求線,怎么共用呢?我們看下圖外部中斷管理模塊,從 SOC 共有 32 個管腳引出來,這些管腳是復(fù)用的,可以配置成通用輸入/輸出 IO,也可以配置成喚醒中斷的模式 (及內(nèi)部會連接到中斷控制器電路)。 GPIO 模塊內(nèi)部有三個寄存器對這 32 根管線的中斷功能進行管理。(1).功能寄存器 如圖,對管腳的電平激發(fā)方式進行管理,可以配置成高電平激發(fā)中斷,低電平 、上升沿 、下降沿、雙邊沿等。相關(guān)寄存器如下:WKUP_INT0_7_CONWKUP_INT8_15_CONWKUP_INT16_24_CONWKUP_INT25_

17、31_CON圖為中斷控制器 (2)Mask 寄存器 外部管腳 EINT16 到 EINT31 共 16 根線共用一根線 EINT(16-31)連接到中斷控制器,也就是共用一個中斷號(中斷號 16),可能需要在某一個時刻只能有一根管腳線的信號通過模塊順利進入中斷控制器,這個時候就需要將其余的管腳信號屏蔽起來,如何屏蔽呢?就是設(shè)置 mask 里的對應(yīng)位。相關(guān)寄存器如下:WKUP_INT0_7_MASKWKUP_INT8_15_MASKWKUP_INT16_24_MASKWKUP_INT25_31_MASK (3)Pend 寄存器 記錄中斷信號標志。如果信號通過了前面的關(guān)口,送入了 VIC,就是將對

18、應(yīng)線上的 pend 寄存器的對應(yīng)位值 1,如果在某一時刻,中斷控制器來不起處理當前信號線上的中斷請求,那么pend 位會一直保持著這個請求,哪怕硬件中斷線上的中斷激發(fā)狀態(tài)已經(jīng)過去。同樣,需要注意是,如果當前線上的中斷已經(jīng)處理,這個pend 位也不會自動清零,需要人為的清零。相關(guān)寄存器如下:WKUP_INT0_7_PENDWKUP_INT8_15_PENDWKUP_INT16_24_PENDWKUP_INT25_31_PEND中斷信號請求的流程是:1 使外設(shè)有中斷激發(fā)的功能(如果為外部中斷,設(shè)置電平激發(fā)方式)。2 設(shè)置子模塊下的 mask 寄存器,讓需要監(jiān)控的中斷信號能通過,而不需要監(jiān)控的則 被

19、屏蔽。3 開啟中斷控制器中對應(yīng)每個中斷源的使能位。1.S5PC100的中斷相關(guān)的寄存器中斷狀態(tài)寄存器VIC0IRQSTATUS中斷源模式選擇寄存器VIC0INTSELECT中斷源使能寄存器VIC0INTENABLE中斷源向量地址寄存器VIC0VECTADDR0 . VIC0VECTADDR31中斷源入口地址寄存器VIC0ADDRESS一 ARM的SWI異常中斷處理程序設(shè)計匯編:_start:b reset_handlernopb swi_handlernopnopnopnopswi_handler:stmfd sp!, r0-r12, lrldr r0, lr, -4bic r0, r0, #

20、0xff 獲取軟中斷 的中斷號bl c_swi_handlerldmfd sp!, r0-r12, pc SPSR -CPSR 并出棧c_swi_handler:stmfd sp!, r0-r12, lrcmp r0, #5bleq sys_opencmp r0, #6bleq sys_closeldmfd sp!, r0-r12, pc二 ARM的IRQ異常中斷處理程序設(shè)計匯編:_start:b reset_handler reset 異常nopnopnopnopnopb irq_handler 中斷異常nopirq_handler:sub lr, lr, #4 調(diào)整返回地址stmfd sp

21、!, r0-r12, lr 壓棧保存寄存器bl c_irq_handler 跳轉(zhuǎn)到C 中 中斷處理函數(shù)執(zhí)行 執(zhí)行完返回ldmfd sp!, r0-r12, pc 出棧 并回復(fù)cpsrreset_handler:/*將異常向量表搬到 */ldr r0, =0xmcr p15, 0, r0, c12, c0, 0/*初始化svc棧頂指針*/ldr r0, =0xmov sp, r0sub r0, r0, #0x1000/*到irq模式下初始化irq模式棧頂指針,開irq fiq*/msr cpsr_c, #0x12mov sp, r0sub r0, r0, #0x100/*到user模式 并且初始

22、化user的棧頂指針*/msr cpsr_c, #0x10mov sp, r0/*清bss段*/clear_bss:mov r2, #0ldr r0, =_bss_startldr r1, =_bss_endbss_loop:cmp r0, r1strne r2, r0, #4bne bss_loop/*跳轉(zhuǎn)到*/b main.end(一)key中斷/*key_IRQ*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();printf(c_irq_handler! rn );VIC0ADD

23、RESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void key1_irq_init(void)/設(shè)置IO 為激發(fā)中斷功能GPH0.GPH0CON = GPH0.GPH0CON & (0xf4) | (0x24);/設(shè)置外部中斷管腳為下降沿激發(fā)方式WU_INT0_7_CON = WU_INT0_7_CON & (0x74) | (0x24);/enable mask 位WU_INT0_7_MASK = WU_INT0_7_MASK & (11);/注冊中斷處理函數(shù) 因為按鍵1 鏈接的為EINT1 所以將處理函數(shù)放在對應(yīng)第0組 第一個地址寄存器里VIC0VECT

24、ADDR.VIC0VECTADDR1 = (unsigned int)key1_down;/enable 中斷控制器中對應(yīng)中斷源的使能位VIC0INTERRUPT.VIC0INTENABLE = VIC0INTERRUPT.VIC0INTENABLE | (11);void key2_irq_init(void)GPH0.GPH0CON = GPH0.GPH0CON & (0xf8) | (0x28);WU_INT0_7_CON = WU_INT0_7_CON & (0x78) | (0x28);WU_INT0_7_MASK = WU_INT0_7_MASK & (12);VIC0VECTAD

25、DR.VIC0VECTADDR2 = (unsigned int)key2_down;VIC0INTERRUPT.VIC0INTENABLE = VIC0INTERRUPT.VIC0INTENABLE | (12);void key1_down(void)printf(*key1_down*rn);WU_INT0_7_PEND = (11);void key2_down(void)printf(*key2_down*rn);WU_INT0_7_PEND = (12);void main(void)uart0_init();key1_irq_init();key2_irq_init();uart

26、0_sendstring(hello farsight !nr );int a = 100;printf(a = %dnr, a);while(1);(二)UART中斷/*uart0_IRQ*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();uart0_sendstring(c_irq_handler! rn );VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void uart0_recvchar_irq(void)uart0_send

27、char(UART0.URXH0);/清標志位 寫1清0UART0.UINTP0 = UART0.UINTP0;UART0.UINTSP0 = UART0.UINTSP0;void main(void)uart0_init();uart0_sendstring(hello farsight !nr );/注冊中斷處理函數(shù)UART0.UINTM0 = 0x1;VIC1VECTADDR.VIC1VECTADDR10 = (unsigned int)uart0_recvchar_irq;VIC1INTERRUPT.VIC1INTENABLE = VIC1INTERRUPT.VIC1INTENABLE

28、 | (110);while(1);(三)ADC中斷/*ADC_IRQ*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();uart0_sendstring(c_irq_handler! rn );VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void adc_init(void)/ 精度12位| 開啟分頻| 分頻 得1M | 讀轉(zhuǎn)換/ADC.ADCCON = (116) | (114) | (656) | (11);ADC.ADCCON

29、 = (116) | (114) | (656) | (1); /手動開啟轉(zhuǎn)換ADC.ADCMUX = 0; /選擇第0通道void adc_read_handler(void)adc_val = ADC.ADCDAT0 & 0xfff;printf(adc_val = %d rn, adc_val);ADC.ADCCLRINT = 0; /填任意值,清ADC中斷標志void main(void)uart0_init();uart0_sendstring(hello farsight !nr );/注冊中斷處理函數(shù)人口VIC2VECTADDR.VIC2VECTADDR23 = (unsigne

30、d int)adc_read_handler;VIC2INTERRUPT.VIC2INTENABLE = VIC2INTERRUPT.VIC2INTENABLE | (123);adc_init();int m;while(1)for(m=0; m0x;m+);ADC.ADCCON = ADC.ADCCON | (1); /手動開啟轉(zhuǎn)換(四)ALARM中斷/*RTC_ALARM*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();uart0_sendstring(c_irq_handle

31、r! rn );VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void rtc_init(void)RTCCON = 1; /開啟修改權(quán)限RTCBCD.BCDYEAR = 0x13;RTCBCD.BCDMON = 0x10;RTCBCD.BCDDATE = 0x21;RTCBCD.BCDHOUR = 0x16;RTCBCD.BCDMIN = 0x06;RTCBCD.BCDSEC = 0x55;RTCCON = 0;void rtc_alarm_init(void)RTALM.RTCALM = 16 | 12 | 11;RTALM.ALMHOUR

32、 = 0x16;RTALM.ALMMIN = 0x07;void rtc_alarm_handler(void)uart0_sendstring(alarm signalnr);alarm_beep_on();RTCINTP = (11);/清除中斷標志void main(void)uart0_init();uart0_sendstring(hello farsight !rn );rtc_init();rtc_alarm_init();VIC0VECTADDR.VIC0VECTADDR28 = (unsigned int)rtc_alarm_handler;VIC0INTERRUPT.VIC0INTENABLE = VIC0INTERRUPT.VIC0INTENABLE | (128);while(1);(五)TICK中斷/*RTC_ALARM_TICK*/void c_irq_handler(void)void (*pfunc)(void);pfunc =(void *)VIC0ADDRESS;pfunc();VIC0ADDRESS = 0;VIC1ADDRESS = 0;VIC2ADDRESS = 0;void rtc_in

溫馨提示

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

評論

0/150

提交評論