- 嵌入式系統設計與實踐:Linux篇
- 季江民
- 1751字
- 2020-04-03 09:21:47
4.2 中斷控制器
1.中斷的概念
中斷是指在計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得CPU暫時中斷當前正在執行的程序而轉去執行相應的事件處理程序。待處理完畢后又返回原來被中斷處繼續執行或調度新的進程執行的過程。在嵌入式系統中外部設備的功能實現主要是靠中斷機制來實現的。
2.中斷的功能
中斷功能可以解決CPU內部運行速度遠遠快于外部總線速度而產生的等待延時問題。它是計算機可以更好更快利用有限的系統資源解決系統響應速度和運行效率的一種控制技術。
(1)并行操作;
(2)硬件故障報警與處理;
(3)支持多道程序并發運行,提高計算機系統的運行效率;
(4)支持實時處理功能。
3.中斷類型與中斷的優先級
ARM系統包括兩類中斷:一類是IRQ中斷,另一類是FIQ中斷。IRQ是普通中斷,FIQ是快速中斷,在進行大批量的復制、數據傳輸等工作時,常使用FIQ中斷。FIQ的優先級高于IRQ。在ARM系統中,支持7類異常,包括:復位、未定義指令、軟中斷、預取中止、數據中止、IRQ和FIQ,每種異常對應于不同的處理器模式。一旦發生異常,首先要進行模式切換,然后程序將轉到該異常對應的固定存儲地址執行。這個固定的地址稱為異常向量。異常向量中保存的通常為異常處理程序的地址。S3C2410中ARM中斷模式及中斷向量入口地址如表4.8所示。
表4.8 ARM中斷模式及中斷向量入口地址

4.中斷響應過程
中斷響應過程描述如下:
(1)當發生中斷IRQ時,CPU進入“中斷模式”,這時使用“中斷模式”下的堆棧;當發生快中斷FIQ時,CPU進入“快中斷模式”,這時使用“快中斷模式”下的堆棧。所以在使用中斷前,應先設置好相應模式下的堆棧。
(2)對于Request sources中的中斷,將INTSUBMSK寄存器中相應位設為0。
(3)將INTMSK寄存器中相應位設為0。
(4)確定中斷是FIQ還是IRQ。
a.如果是FIQ,則在INTMOD寄存器設置相應位為1;
b.如果是IRQ,則在RIORITY寄存器中設置優先級。
(5)準備好中斷處理函數
a.中斷向量:在中斷向量設置好當FIQ或IRQ被觸發時的跳轉函數,IRQ、FIQ的中斷向量地址分別為0x00000018、0x0000001c。
b.對于IRQ,在跳轉函數中讀取INTPND寄存器或INTOFFSET寄存器的值來確定中斷源,然后調用具體的處理函數。
c.對于FIQ,因為只有一個中斷可以設為FIQ,無須判斷中斷源。
d.中斷處理函數進入和返回。
(6)設置CPSR寄存器中的F-bit(對于FIQ)或I-bit(對于IRQ)為0,開中斷。
中斷返回之前需要清中斷:設置次級源待決中斷寄存器SUBSRCPND、源待決中斷寄存器SRCPND、中斷請求寄存器INTPND中相應位寫1即可。
中斷流程圖如圖4.4所示

圖4.4 中斷的響應過程
5.與中斷相關的寄存器
常用的中斷寄存器如表4.9所示。
表4.9 常用的中斷寄存器

S3C2410.h中與中斷相關的地址映射為:
#define rSRCPND (*(volatile unsigned *)0x4a000000) //Interrupt request status #define rINTMOD (*(volatile unsigned *)0x4a000004) //Interrupt mode control #define rINTMSK (*(volatile unsigned *)0x4a000008) //Interrupt mask control #define rPRIORITY (*(volatile unsigned *)0x4a00000c) //IRQ priority control #define rINTPND (*(volatile unsigned *)0x4a000010) //Interrupt request status #define rINTOFFSET (*(volatile unsigned *)0x4a000014) //Interruot request source offset #define rSUBSRCPND (*(volatile unsigned *)0x4a000018) //Sub source pending #define rINTSUBMSK (*(volatile unsigned *)0x4a00001c) //Interrupt sub mask
6.中斷寄存器的設置實例
下列函數init_irq是中斷初始化函數,函數中應用GPG3、GPG6、GPG7、GPG11產生的外部中斷輸入功能,采用系統默認的優先級、默認的低電平觸發,所有的中斷都設為IRQ中斷模式,通過設置中斷屏蔽寄存器INTMSK的第5位,外部中斷EINT8_23使能,通過設置外部中斷屏蔽寄存器EINTMSK第11、14、15、19位,中斷EINT11、EINT14、EINT15、EINT19使能。
分析:由于通過GPG3、GPG6、GPG7、GPG11將產生的外部中斷輸入,S3C2410中用控制位10控制外部中斷輸入。程序中首先用表達式~(3<<6)的“與運算”設置第6、7控制位為00,再與表達式(2<<6)進行或運算,用于控制GPG3引腳的控制位為10,控制GPG3達到外部中斷輸入的功能(在本題中第6~7、12~13、14~15、22~23控制位需設置為10),通過以下語句設置:
rGPGCON & = (~((3<<6)| (3<<12)| (3<<14)| (3<<22))); rGPGCON | =(2<<6)| (2<<12)| (2<<14)| (2<<22);
保證GPGCON第6~7、12~13、14~15、22~23控制位為10。
中斷優先級使用默認的固定優先級,中斷模式使用IRQ中斷,通過語句:
rPRIORITY=0x00000000; rINTMOD=0x00000000;
設置中斷優先級與中斷模式。
外部中斷EINT8_23使能需要將中斷寄存器INTMSK第5位設置為0。
通過設置rEINTMASK的11、14、15、19位為0,使EINT11、EINT14、EINT15、EINT19中斷使能,因而有語句:
rEINTMASK & = (~((1<<11) | (1<<14) | (1<<15) | (1<<19)));
此問題完整的中斷函數如下:
void init_irq( ) { rGPGCON & = (~((3<<6)| (3<<12)| (3<<14)| (3<<22))); rGPGCON | =(2<<6)| (2<<12)| (2<<14)| (2<<22); //設置GPG3、GPG6、GPG7、GPG11引腳的中斷功能 rPRIORITY=0x00000000; //使用默認的固定優先級 rINTMOD = 0x00000000 //所有中斷均為IRQ中斷 rINTMSK & = ( ~(1<<5)); //使能外部中斷EINT8_23 rEINTMASK & = (~((1<<11) | (1<<14) | (1<<15) | (1<<19))); //EINT11、EINT14、EINT15、EINT19中斷使能 } 思考:分析下列函數,寫出函數代碼的含義。 void Enable_Eint(void) { rEINTPEND = 0xffffff; //to clear the previous pending states rSRCPND |= BIT_EINT0|BIT_EINT2|BIT_EINT8_23; rINTPND |= BIT_EINT0|BIT_EINT2|BIT_EINT8_23; rEINTMASK=~( (1<<11)|(1<<19) ); rINTMSK=~(BIT_EINT0|BIT_EINT2|BIT_EINT8_23); }
7.常用中斷處理函數
在Linux操作系統中應用于S3C2410中常用的中斷處理函數有:
