vxworks Arm 架構(gòu)下的中斷
1、中斷檢測:
arm架構(gòu)下,中斷監(jiān)測部分的代碼是需要用戶自己開發(fā)的,可以參考ambaIntrCtl.c,需要實現(xiàn)函數(shù)xxxIntLvlVecChk、xxxIntLvlVecAck、xxxIntLvlChg、xxxIntLvlEnable、xxxIntLvlDisable和xxxIntDevInit,在函數(shù)xxxIntDevInit中把其他幾個函數(shù)分別掛載在sysIntLvlVecChkRtn、sysIntLvlVecAckRtn、sysIntLvlChgRtn、sysIntLvlEnableRtn和sysIntLvlDisableRtn這幾個鉤子函數(shù)上。xxxIntDevInit在sysLib.c中的sysHwInit2中調(diào)用,以初始化中斷。
2、中斷管理:
中斷管理部分,BSP中需要調(diào)用兩個函數(shù),一個是intLibInit,另一個是xxxIntDevInit。后者的作用就是前面講的掛接中斷處理鉤子函數(shù)。前者intLibInit是個比較關(guān)鍵的函數(shù),三個參數(shù)設(shè)置了中斷的個數(shù)和中斷模式。內(nèi)部處理中,根據(jù)中斷的個數(shù)申請intVecTable數(shù)組,用戶使用intConnect代碼掛接的中斷就是根據(jù)中斷向量到表中查找位置然后賦以中斷處理函數(shù)。中斷模式分可搶占和不可搶占兩種,分別對應(yīng)INT_PREEMPT_MODEL和INT_NON_PREEMPT_MODEL。
3、中斷處理:
根據(jù)vxWorks的實現(xiàn)代碼,在excArchLib.c中有一張表:
LOCAL EXC_TBL excEnterTbl[NUM_EXC_VECS] =
{
/* no entry for branch through zero */
{ EXC_OFF_UNDEF, excEnterUndef},/* undefined instr */
{ EXC_OFF_SWI,excEnterSwi},/* software interrupt */
{ EXC_OFF_PREFETCH,excEnterPrefetchAbort}, /* prefetch abort */
{ EXC_OFF_DATA,excEnterDataAbort}, /* data abort */
/* no entry for old address exception */
{ EXC_OFF_IRQ,intEnt},/* interrupt request */
/* no entry for FIQ */
};
其中EXC_OFF_IRQ對應(yīng)的即外部中斷,缺省情況下,調(diào)用的是intEnt,但是正常運行的時候,BSP代碼在intLibInit中會使用intIntRtnPreempt或者intIntRtnNonPreempt把intEnt替換掉,具體使用哪個由中斷處理模式?jīng)Q定。
中斷發(fā)生后,先產(chǎn)生外部中斷異常,即IRQ,進(jìn)入excExcHandle,excExcHandle查找列表excEnterTbl找到EXC_OFF_IRQ對應(yīng)的處理函數(shù)intIntRtnPreempt或者intIntRtnNonPreempt,在intIntRtnPreempt或者intIntRtnNonPreempt里面,調(diào)用intVecTable里相應(yīng)中斷向量對應(yīng)的中斷處理函數(shù)。
評論