3.1.1 UC/OS-II 的中斷過程
為了記錄中斷嵌套的層數,UC/OS-II定義了一個全局變量OSIntNesting
兩個重要函數OSIntEnter()和OSIntExit()
函數OSIntEnter()的作用就是把全局變量OSIntNesting加1,被用于記錄中斷嵌套層數。
void OSIntEnter(void)
{
If(OSRunning== TRUE)
{
If(OSIntNesting < 255)
{
OSIntNesting ++;
}
}
}
函數OSIntEnter()的調用通常發生在中斷服務程式保護了被中斷任務的斷點資料之後,運作使用者中斷服務代碼之前,稱為進入中斷服務函數。
OSIntExit()的流程圖如下:
OSIntExit(void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
If(OSRunning == TRUE)
{
OS_ENTER_CRITICAL();
If(OSIntNesting > 0)
{
OSIntNesting --;
}
If((OSIntNesting ==0)&&(OSLockNesting == 0))
{
OSIntExitY =OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
If(OSPrioHighRdy != OSPrioCur)
{
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHigh ];
OSCtxSwCtr++;
OSIntCtxSw();
}
}
OS_EXIT_CRITICAL();
}
}
一個中斷服務子程式的流程圖如下所示: