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