实时嵌入式操作系统μC/OS-II的多任务信息流关键技术研究

2 、μC/OS-II的中断处理

μC/OS-II中,中断服务程序一般用汇编语言来写。以下是中断服务程序的示意代码。

用户中断服务程序:

保存全部CPU寄存器;

调用OSIntEnter或OSIntNesting直接加1;

执行用户代码做中断服务;

调用OSIntExit;

恢复所有CPU寄存器;

执行中断返回指令;

这里μC/OS-II提供了两个ISR与内核的接口函数:OSIntEnter和OSIntExit。OSIntEnter通知μC/OS-II内核,中断服务程序开始运行了。实际上,此函数做的工作是把一个全局变量OSIntNesting加1。在x86等有累加指令的CPU中,可以用指令代替OSIntEnter:

INC BYTE PTR OSIntNesting

此中断嵌套计数器可以确保所有中断处理完成后再作任务调度。另一个接口函数OSIntExit则通知内核,中断服务已结束。根据相应情况,返回被中断点(可能是一个任务或者被嵌套的中断服务程序)或由内核作任务调度。

用户编写的ISR必须被安装到某一位置,以便中断发生后,CPU根据相应的中断号运行准确的服务程序。许多实时操作系统都提供了安装、卸载中断服务程序的API接口函数,有些成熟的RTOS甚至对中断控制器的管理都有相应的API函数。但 μC/OS-II内核没有提供类似的接口函数,需要用户在对应的CPU移植中自己实现。这些接口函数与具体的硬件环境有关,接下来PC体系下的中断处理对此有详细的说明。

3 、PC体系下的中断

X86系列的处理器可支持256个中断,并用向量表的方法来关联每个中断和相应ISR的位置。在实模式下,中断向量表(IVT)存于内存的低端1K。每个向量表条目占4字节,保存一个ISR的段地址和偏移信息。PC系统使用两个级联的可编程中断控制器82C59A。一个82C59A能连接8个硬件中断,编号为IRQ0~IRQ7。 PC总共可管理15个外部中断源,PC的中断控制器如图4所示。(关于82C59A的详细使用可参见有关资料。)