新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > VxWorks基于AT91RM9200处理器的中断处理

VxWorks基于AT91RM9200处理器的中断处理

作者:时间:2012-03-27来源:网络收藏

  Vxworks作为一个实时嵌入式操作系统,通常采用中断的方式来满足系统实时性的要求。

  因此,熟悉其中断的处理过程对于操作系统的开发是至关重要的.本文通过编写和调试基于处理器的嵌入式操作系统的BSP,来讨论操作系统的中断机制。

1 VxWorks机制及AIC

  使用一个8优先级,可单独屏蔽中断的中断向量控制器AIC。在ARM体系结构中,有7种异常中断,对应有一个异常中断向量表。 ARM体系结构要求这个异常中断向量表从0地址处开始,对于外部中断请求IRQ,系统又增加了一块由中断控制器控制的中断向量表。

2 BSP的中断驱动的实现
2.1 中断驱动中定义的函数
  STATUS at91rm9200LvlVecChk (int*,int*);
  STATUS at91rm9200LvlVecAck(int,int);
  STATUS at91rm9200LvlEnable(int);
  STATUS at91rm9200LvlDisable(int);

2.2 高级中断控制器AIC的初始化

  在usrInit()中excVecInit()函数对异常中断向量进行初始化.整个中断库,以及中断控制器的初始化都是在syslib.c中的 sysHwInit2()函数中完成的.该函数在sysClkConnect()中被调用,因为系统时钟中断要在内核开放中断后就要使能,因此内核在初始化为一个多任务环境后,就产生一个usrRoot()的任务,在该任务中要建立系统时钟中断,因此调用了sysClkConnect()函数,中断库以及中断控制器的初始化也就完成了。

  高级中断控制器必须进行初始化,其初始化是在板级支持包BSP的中断驱动程序中。具体的实现函数是void at91rm9200IntDevInit(void)。该函数在文件syslib.c的sysHwInit2()函数中调用。

  at91rm9200IntDevInit(void)函数中主要是配置系统的钩子函数,然后对中断源向量寄存器和中断模式寄存器进行配置,同时要清除并禁止AIC中所有的中断。

2.3 中断驱动中的回调函数

  在intEnt中,程序很快就进入了特权模式(SVC32),如果是中断可嵌套模式,要设置该模式下的堆栈,并且将中断深度intCnt值加1.然后跳转到intIntRtnPreempt中,在intIntRtnPreempt中为后来调用中断驱动中的函数开辟了32个字节的堆栈空间,并且将程序指针拉到at91rm9200LvlVecChk函数处执行,at91rm9200LvlVecChk函数是在中断驱动中定义的函数,是用来检测当前挂起的中断中,优先级最高的中断源。检测出最高优先级的中断后,首先要禁止该中断,因此要调用at91rm9200LvlDisable函数,该函数也在中断驱动中定义。在禁止中断的过程中,需要通过intLock和intUnLock函数来保护临界代码不被新的中断打断。

  at91rm9200LvlVecChk()函数是通过读AIC_IVR寄存器来获取当前最高优先级的中断,将获得的中断号和中断向量赋给2个变量,并且禁止该中断。

  at91rm9200LvlVecAek()函数是在结束后,通过写AIC_EIOC寄存器来清除刚刚处理的中断,并将其使能。 at91rm9200LvlEnable(int leve1)和at91rm9200LvlDisable(int level)来允许和禁止中断,从而保护临界代码不被新的中断所打断。

2.4 中断驱动程序实现的流程图

  中断驱动程序实现的流程图如图1所示。


     VxWorks基于AT91RM9200处理器的中断处理
图1 中断驱动程序实现的流程图


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭