天天看點

UC/OS-II的中斷和時鐘

3.1.1 UC/OS-II 的中斷過程

UC/OS-II的中斷和時鐘

為了記錄中斷嵌套的層數,UC/OS-II定義了一個全局變量OSIntNesting

兩個重要函數OSIntEnter()和OSIntExit()

函數OSIntEnter()的作用就是把全局變量OSIntNesting加1,被用于記錄中斷嵌套層數。

void OSIntEnter(void)

{

    If(OSRunning== TRUE)

{

    If(OSIntNesting < 255)

    {

        OSIntNesting ++;

}

}

}

函數OSIntEnter()的調用通常發生在中斷服務程式保護了被中斷任務的斷點資料之後,運作使用者中斷服務代碼之前,稱為進入中斷服務函數。

OSIntExit()的流程圖如下:

UC/OS-II的中斷和時鐘

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();

}

}

一個中斷服務子程式的流程圖如下所示:

UC/OS-II的中斷和時鐘