1. 結(jié)構(gòu)框圖
中斷圖解
這里我以外部中斷為例畫(huà)出了中斷響應(yīng)的過(guò)程。
- 當(dāng)外部中斷得到響應(yīng)娄柳,會(huì)由硬件自動(dòng)轉(zhuǎn)到異常向量表搀罢,執(zhí)行對(duì)應(yīng)的異常處理程序。在這里指的就是IRQ的處理程序晦雨。
- 在異常處理程序IRQ_handle中將會(huì)執(zhí)行現(xiàn)場(chǎng)的保護(hù)與恢復(fù),以及最重要的中斷處理函數(shù)(注意隘冲,這里就來(lái)到了中斷處理部分闹瞧,而不是異常處理了,相當(dāng)于是一個(gè)兩級(jí)的機(jī)制)展辞。
- 在中斷處理程序irq_handler中(代碼如下)奥邮,將會(huì)通過(guò)判斷中斷標(biāo)志位來(lái)找到外部中斷到底來(lái)自于VIC0/VIC1/VIC2/VIC3。(S5PV210支持多達(dá)93個(gè)中斷罗珍,所以有四個(gè)中斷控制器來(lái)控制洽腺。)找到之后,調(diào)用對(duì)應(yīng)外部中斷的處理函數(shù)(即VICnADDR指向的函數(shù))覆旱。
void irq_handler(void)
{
unsigned long vicaddr[4] = {VIC0ADDR,VIC1ADDR,VIC2ADDR,VIC3ADDR};
int i=0;
void (*isr)(void) = NULL;
for(i=0; i<4; i++)
{
// 發(fā)生一個(gè)中斷時(shí)蘸朋,4個(gè)VIC中有3個(gè)是全0,1個(gè)的其中一位不是0
if(intc_getvicirqstatus(i) != 0)
{
isr = (void (*)(void)) vicaddr[i];
break;
}
}
(*isr)(); // 通過(guò)函數(shù)指針來(lái)調(diào)用函數(shù)
}
2. 詳細(xì)講述如何找到外部中斷對(duì)應(yīng)的處理函數(shù)
在上面我們提到扣唱,S5PV210支持多達(dá)93個(gè)中斷藕坯,而在S3C2440中也支持幾十個(gè)中斷,但是兩者的處理方式是截然不同的噪沙。
- 在S3C2440中炼彪,同樣也有類似于上圖中“外部中斷向量表1”這樣的表格,但是當(dāng)一個(gè)外部中斷發(fā)生后正歼,需要通過(guò)輪詢的方式查找中斷標(biāo)志位得到正確的外部中斷編號(hào)辐马,然后調(diào)用對(duì)應(yīng)的中斷處理子函數(shù)。這樣處理器的響應(yīng)時(shí)間變長(zhǎng)局义,無(wú)法適應(yīng)高實(shí)時(shí)性要求喜爷。
- S5PV210則用硬件更好地解決了問(wèn)題冗疮,以上面的外部中斷向量表1為例,如果是其中的中斷源發(fā)生了中斷贞奋,那么相應(yīng)的中斷處理函數(shù)將會(huì)自動(dòng)復(fù)制到VIC0ADDR寄存器當(dāng)中赌厅,不需要人工輪詢,只需要將中斷處理函數(shù)寫(xiě)到“外部中斷向量表1”的對(duì)應(yīng)位置處即可轿塔,特愿,當(dāng)然了因?yàn)镾5PV210有四個(gè)VIC,所以還是要輪詢四次勾缭。
3. 其他
其他諸如中斷使能揍障、中斷模式(IRQ/FIQ)的選擇、中斷引腳的相關(guān)配置(GPIO設(shè)成外部中斷俩由、觸發(fā)方式毒嫡、中斷使能)、清掛起等不在此贅述幻梯。