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