arm linux 中断优先级,ARM中断处理过程
以s3c2440?ARM9核為例:
一:s3c2440 ARM處理器特性:
1、S3C2440支持60個(gè)中斷源,含子中斷源;
2、ARM9采用五級(jí)流水線方式;
3、支持外部中斷和內(nèi)部中斷;
二、s3c2440 支持的寄存器:
2.1 外部中斷寄存器
24個(gè)外部中斷占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用這些腳做中斷輸入,則必須配置引腳為中斷,并且不要上拉。具體可參考datesheet數(shù)據(jù)手冊(cè)。
寄存器:
EXTINT0-EXTINT2:分別設(shè)置EINT0—EINT7、EINT8—EINT15、EINT16—EINT23的觸發(fā)方式(高電平觸發(fā)、低電平觸發(fā)、下降沿觸發(fā)、上升沿觸發(fā))。
EINTFLT0-EINTFLT3:控制濾波時(shí)鐘和濾波寬度。
EINTPEND:這個(gè)是中斷掛起寄存器,清除時(shí)要寫(xiě)1,后面還有幾個(gè)是寫(xiě)1清除。當(dāng)一個(gè)外部中斷(EINT4-EINT23)發(fā)生后,那么相應(yīng)的位會(huì)被置1。為什么沒(méi)有EINT0-EINT3,因?yàn)樗鼈兎謩e由SRCPND寄存器的后4位控制。
EINTMASK:這個(gè)簡(jiǎn)單,是屏蔽中斷用的,也就是說(shuō)位為1時(shí),此次中斷無(wú)效。
2.2 內(nèi)部中斷寄存器
內(nèi)部中斷有8個(gè)寄存器。
寄存器:
SUBSRCPND:當(dāng)一個(gè)中斷發(fā)生后,那么相應(yīng)的位會(huì)被置1,表示一個(gè)中斷發(fā)生了。
INTSUBMSK:與上一個(gè)是一樣的,中斷屏蔽寄存器。
SRCPND:當(dāng)一個(gè)中斷發(fā)生后,那么相應(yīng)的位會(huì)被置1,表示一個(gè)或一類(lèi)中斷發(fā)生了。
INTMSK:用來(lái)屏蔽SRCPND寄存器所標(biāo)識(shí)的中斷。但只能屏蔽IRQ中斷,不能屏蔽FIQ中斷。
INTMOD:當(dāng)INTMOD中某位被設(shè)置為1時(shí),它對(duì)應(yīng)的中斷被設(shè)為FIQ,CPU將進(jìn)入快速中斷模式。
PRIORITY:用于設(shè)置IRQ中斷的優(yōu)先級(jí)。具體使用方法可參考芯片手冊(cè)。
INTPND:中斷優(yōu)先級(jí)仲裁器選出優(yōu)先級(jí)最高中斷后,這個(gè)中斷在INTPND寄存器中的相應(yīng)位被置1,隨后,CPU進(jìn)入中斷模式處理它。同一時(shí)間內(nèi),此寄存器只有一位被置1。
INTOFFSET:用來(lái)表示INTPND寄存器中哪位被置1了,即記錄INTPND中位[x]為1的位x的值。清除INTPND、SRCPND時(shí)自動(dòng)清除。
三、中斷處理流程
1、中斷控制器匯集各類(lèi)外設(shè)發(fā)出的中斷信號(hào),然后通知CPU。
2、CPU保存當(dāng)前程序的運(yùn)行環(huán)境,然后調(diào)用中斷服務(wù)程序(ISR),來(lái)處理中斷。
3、在ISR中通過(guò)讀取外設(shè)的相關(guān)的寄存器來(lái)識(shí)別中斷的類(lèi)型,并進(jìn)行相應(yīng)的處理。
4、清除中斷:通過(guò)讀寫(xiě)相關(guān)中斷控制寄存器和外設(shè)相關(guān)寄存器來(lái)實(shí)現(xiàn)。(注意消除中斷是必要的)
5、恢復(fù)被中斷程序的執(zhí)行環(huán)境,繼續(xù)執(zhí)行被中斷的程序。
四、代碼:
main.c
1 intmain()2 {3 ................4 //其他部分初始化
5 button_init();6 init_irq();7 while(1);8 return 0;9 }
interrupt.c
1 /*interrupt registes*/
2 #define SRCPND (volatile unsigned long *)0x4A000000
3 #define INTMOD (volatile unsigned long *)0x4A000004
4 #define INTMSK (volatile unsigned long *)0x4A000008
5 #define PRIORITY (volatile unsigned long *)0x4A00000c
6 #define INTPND (volatile unsigned long *)0x4A000010
7 #define INTOFFSET (volatile unsigned long *)0x4A000014
8 #define SUBSRCPND (volatile unsigned long *)0x4A000018
9 #define INTSUBMSK (volatile unsigned long *)0x4A00001c
10
11 #define EINTMASK (volatile unsigned long *)0x560000a4
12 #define EINTPEND (volatile unsigned long *)0x560000a8
13
14 voidinit_irq()15 {16
17 //對(duì)于EINT4,需要在EINTMASK寄存器中使能它
18 *(EINTMASK) &= ~(1<<4);19
20
21 //EINT0、EINT1、EINT2、EINT4_7使能
22 *(INTMSK) &= (~(1<<0)) & (~(1<<1)) & (~(1<<2)) & (~(1<<4));23
24 __asm__(25 /*開(kāi)中斷*/
26 "mrs r0,cpsr\n"
27 "bic r0, r0, #0x80\n"
28 "msr cpsr_c, r0\n"
29 :30 :31 );32 }33
34 voidhandle_int()35 {36 /*讀取產(chǎn)生中斷的源*/
37 unsigned long value = *(INTOFFSET);38
39 switch(value)40 {41 case 0: //EINT0~K4
42 led_on();43 break;44
45 case 1: //EINT1~K1
46 led_off();47 break;48
49 case 2: //EINT2~K3
50 led_on();51 break;52
53 case 4: //EINT4~K2
54 led_off();55 break;56
57 default:58 break;59 }60
61 /*中斷清除*/
62 if(value == 4)63 *(EINTPEND) = (1 << 4);64 *(SRCPND) = 1 <
start.S
1 irq:
2 sub lr, lr, #4
3 stmfd sp!, {r0-r12, lr} /* 保護(hù)現(xiàn)場(chǎng) */4 bl handle_int5 ldmfd sp!, {r0-r12, pc}^ /* 恢復(fù)現(xiàn)場(chǎng),^表示把spsr恢復(fù)到cpsr */
五:部分代碼解釋:
sub lr, lr, #4
總結(jié)
以上是生活随笔為你收集整理的arm linux 中断优先级,ARM中断处理过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 支付宝基金怎么看当日净值
- 下一篇: 小米手机销量跃居全球第二 近几年发