×
单片机 > 单片机程序设计 > 详情

vxworks Arm 架构下的中断

发布时间:2020-05-23 发布时间:
|
中断的处理分为三个部分:
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里相应中断向量对应的中断处理函数。
关键字:vxworks  Arm  架构  中断 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式