外部中断处理:uC/OS-II 与裸机之别

很多朋友在学习王道考研408模拟卷中关于点亮LED的例子后,可能对uC/OS-II下的编程,特别是外部中断处理仍抱有疑惑。实际上,uC/OS-II的中断机制与裸机并无本质区别,只是在中断服务程序(ISR)中需调用 OSIntEnterOSIntExit 函数。

OSIntEnter 用于记录中断嵌套层级。 当中断嵌套层数为0,且无高优先级任务或内核资源被占用 (OSLockNesting 为0) 时,OSIntExit 会触发任务调度。

在Cortex-M3平台上,uC/OS-II的任务切换通常设置为最低中断优先级,这意味着中断处理程序中不会进行任务切换。只有当中断处理完毕,调用 OSIntExit 后,才会进行任务调度(前提是中断嵌套层数为0且 OSLockNesting 为0,并且有更高优先级的任务进入就绪态)。

相比之下,裸机中断结束后会直接返回被中断的函数。 因此,二者的差异主要体现在中断处理的开头和结尾部分。

以下是以stm32f10x_it.c中SysTick中断为例:

void SysTick_Handler(void)
{
  OSIntEnter(); // 开头添加 OSIntEnter 
  OSTimeTick(); // 中间是中断服务程序需要处理的代码
  OSIntExit();  // 结尾添加 OSIntExit
}