vxworks Arm 架構下的中斷
1、中斷檢測:
arm架構下,中斷監(jiān)測部分的代碼是需要用戶自己開發(fā)的,可以參考ambaIntrCtl.c,需要實現函數xxxIntLvlVecChk、xxxIntLvlVecAck、xxxIntLvlChg、xxxIntLvlEnable、xxxIntLvlDisable和xxxIntDevInit,在函數xxxIntDevInit中把其他幾個函數分別掛載在sysIntLvlVecChkRtn、sysIntLvlVecAckRtn、sysIntLvlChgRtn、sysIntLvlEnableRtn和sysIntLvlDisableRtn這幾個鉤子函數上。xxxIntDevInit在sysLib.c中的sysHwInit2中調用,以初始化中斷。
2、中斷管理:
中斷管理部分,BSP中需要調用兩個函數,一個是intLibInit,另一個是xxxIntDevInit。后者的作用就是前面講的掛接中斷處理鉤子函數。前者intLibInit是個比較關鍵的函數,三個參數設置了中斷的個數和中斷模式。內部處理中,根據中斷的個數申請intVecTable數組,用戶使用intConnect代碼掛接的中斷就是根據中斷向量到表中查找位置然后賦以中斷處理函數。中斷模式分可搶占和不可搶占兩種,分別對應INT_PREEMPT_MODEL和INT_NON_PREEMPT_MODEL。
3、中斷處理:
根據vxWorks的實現代碼,在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對應的即外部中斷,缺省情況下,調用的是intEnt,但是正常運行的時候,BSP代碼在intLibInit中會使用intIntRtnPreempt或者intIntRtnNonPreempt把intEnt替換掉,具體使用哪個由中斷處理模式決定。
中斷發(fā)生后,先產生外部中斷異常,即IRQ,進入excExcHandle,excExcHandle查找列表excEnterTbl找到EXC_OFF_IRQ對應的處理函數intIntRtnPreempt或者intIntRtnNonPreempt,在intIntRtnPreempt或者intIntRtnNonPreempt里面,調用intVecTable里相應中斷向量對應的中斷處理函數。
評論