1.1、编写中断服务函数:
void USART1_IRQHandler(void)
{
OSIntEnter();
//中断服务程序
OSIntExit();
}
1.2、进入中断服务函数以后使用函数OSIntEnter()
void OSIntEnter (void)
{
if (OSRunning != OS_STATE_OS_RUNNING)
{
return;
}
if (OSIntNestingCtr >= (OS_NESTING_CTR)250u)
{
return;
}
OSIntNestingCtr++;
}
1.3、退出中断服务函数时要调用函数OSIntExit()。
void OSIntExit (void)
{
CPU_SR_ALLOC();
if (OSRunning != OS_STATE_OS_RUNNING)
{
return;
}
CPU_INT_DIS();
if (OSIntNestingCtr == (OS_NESTING_CTR)0)
{
CPU_INT_EN();
return;
}
OSIntNestingCtr--;
if (OSIntNestingCtr > (OS_NESTING_CTR)0)
{
CPU_INT_EN();
return;
}
if(OSSchedLockNestingCtr > (OS_NESTING_CTR)0)
{
CPU_INT_EN();
return;
}
OSPrioHighRdy = OS_PrioGetHighest();
OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;
if(OSTCBHighRdyPtr==OSTCBCurPtr)
{
CPU_INT_EN();
return;
}
#if OS_CFG_TASK_PROFILE_EN > 0u
OSTCBHighRdyPtr->CtxSwCtr++;
#endif
OSTaskCtxSwCtr++;
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
OS_TLS_TaskSw();
#endif
OSIntCtxSw();
CPU_INT_EN();
}
OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。