分类:
2008-10-15 13:50:32
实时操作系统VxWorks提供的中断处理机制中断延迟小,应用编程方便。MPC860是目前在网络与通信领域应用非常广泛的一款微处理器芯片。论文详细分析了VxWorks及MPC860的中断处理机制,阐述了中断处理应用编程的过程,并给出了应用实例。
1 引言
中断是外部事件通知操作系统的最常用手段。中断处理机制是计算机多任务环境运行的基础,是系统实时性的保证[1].
VxWorks是美国Wind River公司于1983年设计开发的一种实时操作系统。内核wind在任务调度、中断处理及网络处理等方面与其它嵌入式实时操作系统相比具有一定的优势。特别是其提供的微秒级的中断处理为VxWorks在嵌入式实时操作系统领域的旗舰地位奠定了基础。
Motorola公司推出的MPC860是目前在网络与通信领域应用非常广泛的一款微处理器芯片。高速的PowerPC内核,连同集成的网络与通信外围设备,为用户提供了一个建立高端通信系统的全新系统解决方案。因其体系结构与通用的x86体系结构有很大的不同,理解其中断处理机制及编写相应的中断处理程序成为系统移植与应用中的难点。
2 VxWorks下的中断处理机制
2.1 中断处理的实时性设计
VxWorks采用中断处理与普通任务分别在不同的栈中处理的中断处理机制[2].中断处理程序运行于一种特殊的上下文环境中,没有任务控制块(Task Control Block, TCB),这使得中断的产生只会引发一些关键寄存器的而不会导致任务上下文的切换,从而减小了中断延迟。
VxWorks下的中断服务程序(ISR, Interrupt Service Routine)只完成在最小时间内通告中断的发生,而将其它的非实时处理尽量通过中断与任务间的通信机制放在被引发的任务上下文中来完成,类似于Linux中的底半处理机制,这样既可以避开中断服务程序编写的种种限制,又进一步缩小了中断延迟。
VxWorks在内核Wind中普遍采用被高度优化的信号量而不是关中断来实现互斥访问,这也对缩小中断延迟有一定的贡献。
2.2 方便的中断编程接口
为了让用户方便的使用C语言编写中断服务程序来实现对中断的控制,VxWorks在体系结构无关例程库intLib和体系结构相关例程库intArchLib中提供了系统接口函数[3].对于应用程序员一般只需了解intLib库即可,而BSP(Board Support Packet,板级支持包)程序员则还需要了解intArchLib库。对例程库的详细描述请参见参考文献[3].
接口函数中最常用的是在intLib库中提供的中断连接函数intConnect()。其函数原型为
STATUS intConnect
(
VOIDFUNCPTR * vector,/*需要连接的外部中断向量*/
VOIDFUNCPTR routine,/*中断发生时调用的中断服务程序*/
int parameter /*传递给中断服务程序的参数*/
)
该函数将指定的中断服务程序routine与指定的外部事件中断向量vector相关联。当指定的外部中断事件发生时,该函数以指定的参数parameter为参数,调用中断服务程序,完成相应的中断服务。
3 MPC860的中断处理机制
MPC860[4]有三个主要组成部分:嵌入式PowerPC内核(Core)、系统接口单元(SIU,System Interface Unit)和通信处理模块(CPM, Communications Processor Module)。MPC860属于双处理器体系结构。嵌入式PowerPC内核是主处理单元,包括高速缓存(CACHE)和内存管理单元(MMU),它是一个RISC芯片,通常开发编译后的程序指令都是由它执行。通信处理模块内部也集成了一个RISC微处理器,对各种常用的通信模块进行管理。由于CPM 分担了嵌入式PowerPC内核的外围工作任务,这种双处理器体系结构功耗低于传统体系结构的处理器。系统接口单元主要提供内外总线的接口,以及一些其它功能如SIU中断的管理等。
3.1 MPC860的中断体系结构
MPC860的中断体系结构有三个模块:PowerPC内核、SIU中断控制器(SIU Interrupt Controller)和CPM中断控制器(CPM Interrupt Controller)。如图1所示。
CPM中断控制器对通信处理模块的各个中断进行管理,它接收12个外部中断源和17个内部中断源的中断请求,经过屏蔽和判优处理后,把中断请求送往SIU中断控制器。CPM中断控制器为每个中断源分配了一个中断向量号,并且分配了不同的优先级,还可以编程设定哪个中断源为最高优先级。所有的CPM中断在SIU中断控制器中产生的中断向量号都是一样的。
图1 MPC860中断体系结构
SIU中断控制器负责管理8个外部中断源(IRQ0~7)和8个内部中断源(Level0~7),其中IRQ0一般用作不可屏蔽中断,通过NMI向PowerPC内核请求中断,其余15个通过外部中断引脚IREQ请求中断。对于8个内部中断源,包括时间基准(TB)、周期性的中断定时器(PIT)、实时时钟(RTC)、PCMCIA以及CPM等,用户可以通过对寄存器的操作,把它们设定为Level0~7中的任何一级。SIU中断控制器已经设定了这16个中断源之间的优先级,其中IRQ0的优先级最高,Level0其次,IRQ1再次,依此类推,Level7的优先级最低。
PowerPC内核接收到中断请求信号后,保存内核中断现场,即将程序计数器保存到SRR0,机器状态寄存器(MSR,Machine State Register)保存到SRR1,并改变MSR相关的信息,然后按异常向量表转入外部中断偏移地址处(0x500)执行最大长度为256个字节的SIU中断服务程序,完成中断服务。
3.2 中断处理流程
MPC860的中断处理流程如图2所示。内核在收到中断请求,保存中断现场后执行SIU中断服务程序。首先保存用户中断现场,保存关键寄存器到中断堆栈,并设置堆栈入口,然后读取产生SIU中断的中断向量号,根据中断向量号判断中断源,再跳转到各个中断源相应的服务程序中执行。读到的中断向量号如果对应的是CPM,要转入CPM中断服务程序中执行。在CPM中断服务程序中,首先内核将CPM中断向量寄存器(CIVR,CPM Interrupt Vector Register)的IV位置1,然后读取CPM中断向量号,再根据中断向量号调用对应的中断服务程序。这样,所有的CPM中断源,在进入中断处理程序之前,都经过了SIU中断控制器和CPM中断控制器两级处理。另外,由于MPC860是RISC处理器,它有许多通用寄存器,在中断服务程序中应该把影响到的关键寄存器压入到堆栈中,在退出中断服务程序之前再恢复。
图2 MPC860的中断处理流程
[1]