网站大量收购闲置独家精品文档,联系QQ:2885784924

vxWorks中断处理..doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
vxWorks中断处理.

Vxworks作为一个实时嵌入式操作系统,通常采用中断的方式来满足系统实时性的要求,因此,熟悉其中断的处理过程对于VxWorks操作系统的开发是至关重要的.本文通过编写和调试基于AT91RM9200处理器的VxWorks嵌入式操作系统的BSP,来讨论VxWorks操作系统的中断机制。 1 VxWorks中断处理机制及AIC ??? AT91RM9200使用一个8优先级,可单独屏蔽中断的中断向量控制器AIC。在ARM体系结构中,有7种异常中断,对应有一个异常中断向量表。ARM体系结构要求这个异常中断向量表从0地址处开始,对于外部中断请求IRQ,系统又增加了一块由中断控制器控制的中断向量表。 2 AT91RM9200 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所示。 ? 图1 中断驱动程序实现的流程图 3 VxWorks中断模块实现机制 3.1 异常中断向量表的生成及实现 ??? 在usrInit()函数中通过intVecBaseSet((FUNCPTR*)VEC_BASE_ADRS)函数对异常中断向量表的基址进行设置,VEC_BASE_ADRS在configall.h中定义为程序运行空间的起始地址,但是在ARM中并没有中断基址寄存器,由于ARM9有重影射机制,可以将程序运行空间的起始地址影射成0地址,这也符合ARM体系结构通常都是把异常中断向量表放在0地址处的惯例,异常中断向量表可以从反汇编bootrom_uncmp后的0地址处看到。当有内置的外设中断或外部中断产生时,系统首先跳转到异常中断向量表的0x18处,此处是IRQ中断向量的位置,该内存中放置的是一条跳转指令,因为excVecInit()对中断向量表初始化后,生成了一个exeEnterTbl,在这个表中列出了异常向量和对应入口函数的结构表

文档评论(0)

gangshou + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档