Arm 架构下的中断


中断的处理分为三个部分:
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里相应中断向量对应的中断处理函数。

转载于:https://www.cnblogs.com/b2tang/archive/2009/12/30/1636253.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值