前言:
本期介绍在将μC/OS-II移植到ARM Cortex-M0后,已创建多个任务后,怎么编写单片机外设中断服务函数。
OS调配各个任务独自运行,各任务有各自的中断服务。因此,需要将各任务的中断行为报告OS。OS需要记录下各任务进入和退出中断的行为,这样才能全面且有效地调配各个任务运行。因此带OS和不带OS的软件系统的外设中断服务函数是不一样的。
下面以外设通用计数器GPTimer0的中断服务函数为例,介绍如何编写中断服务函数。
1. GPTimer0中断服务函数源码及说明(见源码注释)
typedef unsigned int OS_CPU_SR;
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
//--------------GPTimer0 Interrupt Handler---------------
void GPTM0_IRQHandler(void)
{
OS_CPU_SR cpu_sr; // 定义CPU状态寄存器(PSR = 32bit)变量
//
OS_ENTER_CRITICAL(); // 读取CPU状态寄存器,缓存到cpu_sr
OSIntEnter(); // 告诉OS中断嵌套数加1
OS_EXIT_CRITICAL(); // 将cpu_sr更新到CPU状态寄存器
//
pGPTM0Ctrl->GPTM_ISC = pGPTM0Ctrl->GPTM_RIS; // 清除GPTimer中断状态
printf("GPTimer0 Interrupt occurred\r\n"); // GPTimer中断服务内容
//
OSIntExit(); // 中断嵌套数减1.OS根据中断优先级重新调配中断服务
}
2. 小结
从以上源码及其说明可以看出,编写带OS的软件系统的中断服务函数,必须严格使用OS定义的与中断相关的函数且按固定步骤进行。