VxWorks下MPC860的中断处理机制及其应用 02
- UID
- 872238
|
VxWorks下MPC860的中断处理机制及其应用 02
4 中断处理应用编程
实际中断处理应用编程主要包括两部分工作:一是编写中断初始化程序,进行初始化和中断连接;二是编写中断服务程序完成中断服务功能。
4.1 编写中断初始化程序
中断初始化程序的首要工作是初始化中断寄存器,包括打开SIU中断屏蔽寄存器(SIMASK,SIU Interrupt Mask)对应的屏蔽位,使能外部中断。如果是SIU的外部中断,应该初始化SIU中断边沿/电平寄存器(SIEL,SIU Interrupt Edge/Level Register),以设定中断是下降沿触发还是低电平触发。如果使用了CPM中断,还应该初始化CPM中断配置寄存器(CICR,CPM Interrupt Configuration Register)和CPM中断屏蔽寄存器(CIMR,CPM Interrupt Mask Register),以设定CPM在SIU中断控制器中的中断优先级,以及其内部的最高优先级中断源。对于子块可屏蔽中断源,还应该打开对应的事件屏蔽寄存器。
中断初始化程序还必须把SIU中断服务程序放到正确的位置。在VxWorks环境下调用intConnect()函数即将中断服务程序与外部中断源连接起来。
4.2 编写中断服务程序
由于中断服务程序不是在规则的任务上下文中运行(它没有任务控制块,中断处理程序共享一个堆栈等),中断服务程序必须遵守一个基本约束:它必须不能调用可能直接或间接导致阻塞的函数。例如,ISR不能获取信号量,但可以释放信号量;ISR不能直接或间接调用内存操作函数malloc()和free();ISR不能通过VxWorks驱动来执行I/O操作,但VxWorks的管道驱动程序是一个例外;ISR也不能使用printf()进行打印,VxWorks专门为ISR打印信息设计了一个记录功能,允许向系统输出平台打印文本信息。具体能被中断服务程序调用的函数请参见参考文献[5].
由于中断服务通常涉及到任务级代码,并且中断服务程序受到种种限制,VxWorks支持在中断级运行的中断服务程序直接与一般任务进行通信。其通信机制有共享数据结构、信号量、消息队列、管道、信号等。其中,信号量是VxWorks提高中断服务程序与任务的合作性能的最好机制。理想情况下,一个中断服务程序仅仅调用semGive()函数释放一个信号量,发起一个任务来完成必要的处理[6].
5 中断处理应用实例
下面给出VxWorks下MPC860的中断处理的应用实例。我们在某项目开发中利用中断通知MPC860读取外围器件FIFO的数据。相关的硬件连接如图3所示。
图3 中断处理应用实例的硬件连接 其中,FIFO采用IDT公司的IDT72V3650芯片,FPGA采用ALTERA公司APEX20K系列的EP20K1500E器件。FIFO芯片提供了五个空满状态标志位,可根据不同的实际需求方便的通过FPGA编程向MPC860的IRQ2和IRQ1分别发送开始读信号和停止读信号,从而在时钟的驱动下读取FIFO数据。
中断应用程序的主要实现函数的代码及注释如下:
/***初始化,中断连接***/
void tRdFifoInit(void)
{
*SIEL(RegBase)|=0x28000000; /*设置外部中断源IRQ1、IRQ2下降沿触发*/
startSem=semBCreate(SEM_Q_FIFO,SEM_EMPTY);
/*创建二进制信号量,以便实现中断与任务的通信*/
intConnect(IV_IRQ1,(VOIDFUNCPTR)stopRdISR,NULL);
intConnect(IV_IRQ2,(VOIDFUNCPTR)startRdISR,NULL);
/*分别将外部中断源与中断服务程序相连接*/
intEnable(IVEC_TO_INUM(IV_IRQ1)); intEnable(IVEC_TO_INUM(IV_IRQ2));
/*分别使能外部中断*/
}
/***开始读FIFO中断服务程序***/
void startRdISR(void)
{
semGive(startSem);
/*释放信号量*/
RdFlag=1;
/*设置读FIFO数据标志*/
*SIPEND(RegBase)=0x08000000;
/*清除外部中断源IRQ2的状态位*/
}
/***停止读FIFO中断服务程序***/
void stopRdISR(void)
{
RdFlag=0;
/*禁止读FIFO数据标志*/
*SIPEND(RegBase)=0x20000000;
/*清除外部中断源IRQ1的状态位*/
}
/***按照中断通知读取FIFO数据***/
void tRdFifo(void)
{
while(1)
{
semTake(startSem,WAIT_FOREVER);
/*获取信号量*/
while(RdFlag)
{
…/*读取FIFO数据*/
}
}
}
6 结束语
嵌入式实时操作系统VxWorks提供的中断处理机制中断延迟小、用户编程方便,被广泛应用于实际工程中。MPC860的中断体系结构是理解如PowerPC系列芯片等双处理器体系结构的中断处理机制的难点。本文在详细分析两者中断处理机制的基础上介绍了具体的开发实例。该实例已在TornadoⅡ 2.0.2版本上调试通过,并成功应用于某型网络设备开发中。 |
|
|
|
|
|