中断的处理分为三个部分:
1、中断检测:
arm架构下,中断监测部分的代码是需要用户自己开发的,可以参考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替换掉,具体使用哪个由中断处理模式决定。
中断发生后,先产生外部中断异常,即IRQ,进入excExcHandle,excExcHandle查找列表excEnterTbl找到 EXC_OFF_IRQ对应的处理函数intIntRtnPreempt或者intIntRtnNonPreempt,在 intIntRtnPreempt或者intIntRtnNonPreempt里面,调用intVecTable里相应中断向量对应的中断处理函数。
阅读(788) | 评论(0) | 转发(0) |