基于arm9和vxworks中的中断处理

中断是外部事件通知操作系统的最常用手段。 中断处理机制是计算机多任务环境运行的基础,是系统实时性的保证

VxWorks内核wind在任务调度、中断处理及网络处理等方面与其它嵌入式实时操作系统相比具有一定的优势。特别是其提供的微秒级的中断处理为VxWorks在嵌入式实时操作系统领域的旗舰地位奠定了基础。

VxWorks下的中断处理机制

中断处理的实时性设计

VxWorks采用中断处理与普通任务分别在不同的栈中处理的中断处理机制。中断处理程序运行于一种特殊的上下文环境中,没有任务控制块Task Control BlockTCB,这使得中断的产生只会引发一些关键寄存器的存储而不会导致任务上下文的切换,从而减小了中断延迟。

VxWorks下的中断服务程序(ISR Interrupt Service Routine)只完成在最小时间内通告中断的发生,而将其它的非实时处理尽量通过中断与任务间的通信机制放在被引发的任务上下文中来完成,类似于Linux中的底半处理机制,这样既可以避开中断服务程序编写的种种限制,又进一步缩小了中断延迟。中断通常通过一二值信号量与任务进行通信的,即当一个中断发生时,中断服务程序调用semGive释放信号量,与之通信的任务在获得这个信号量后程序继续执行。

VxWorks在内核Wind中普遍采用被高度优化的信号量而不是关中断来实现互斥访问,这也对缩小中断延迟有一定的贡献。

方便的中断编程接口

为了让用户方便的使用C语言编写中断服务程序来实现对中断的控制,VxWorks在体系结构无关例程库intLib和体系结构相关例程库intArchLib中提供了系统接口函数[3]。对于应用程序员一般只需了解intLib库即可,而BSPBoard Support Packet,板级支持包程序员则还需要了解intArchLib库。对例程库的详细描述请参见参考文献[3]

接口函数中最常用的是在intLib库中提供的中断连接函数intConnect()。其函数原型为

STATUS intConnect

(

VOIDFUNCPTR * vector,/*需要连接的外部中断向量*/

VOIDFUNCPTR routine,/*中断发生时调用的中断服务程序*/

int parameter /*传递给中断服务程序的参数*/

)

该函数将指定的中断服务程序routine与指定的外部事件中断向量vector相关联。当指定的外部中断事件发生时,该函数以指定的参数parameter为参数,调用中断服务程序,完成相应的中断服务。

ARM9的中断初始化

arm的中断是由高级中断控制器(AIC)来控制的,支持快速中断和标准中断(注意,vxworks是禁用快速中断的)。在对中断初始化时,一般只需知道中断外设标识,即中断源即可,通过配置寄存器AIC_SMR来设置中断出发模式。具体中断源是与哪个中断向量匹配的,可以参考datasheet中PIO 的相关部分。下面是一个中断初始化的例子:

intDisable(INT_LVL_IRQ1);

 //中断优先级最低,低电平触发
        AT91C_BASE_AIC->AIC_SMR[26] = AT91C_AIC_PRIOR_LOWEST;
        //禁用PIO26
        *AT91C_PIOA_PDR |= 1<<26;
        //复用PIO26为外设B
        *AT91C_PIOA_BSR |= 1<<26;
        intConnect(INT_VEC_IRQ1, (VOIDFUNCPTR)IrqServer, 0); 
        intEnable(INT_LVL_IRQ1);


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值