uc/os:時間管理

uc/os與時間管理有關的函數在os_time.c這個文件裏面,包含操做系統時間的設置及獲取,對任務的延時,任務按時分秒毫秒延時,取消任務的延時共5個系統調用,其中對任務的延時是uC/OS時間管理最主要的功能,以下圖:app

 

 

uc/os中的延時不一樣於單片機不帶系統時的延時函數,單片機延時函數大多狀況下CPU是在執行無心義的指令,下降了CPU的效率,而在uc/os中是在調用系統延時的任務的任務控制塊中寫入一個延時數ticks,而後將該任務掛起進行任務調度,釋放cpu控制權交給其餘任務,這提升了cpu的使用效率。當系統時鐘中斷來臨時,系統會將全部任務的任務控制塊的ticks數減1而後檢查ticks是否爲0,若是ticks大於0該任務就繼續被掛起等待,若是等於0就將其加入就續表中。下面貼出使用最多的OSTimeDly()源碼及註釋。函數

 

void  OSTimeDly (OS_TICK   dly,
                 OS_OPT    opt,
                 OS_ERR   *p_err)
{
    CPU_SR_ALLOC();//爲cpu狀態寄存器分配存儲區



#ifdef OS_SAFETY_CRITICAL
    if (p_err == (OS_ERR *)0) {
        OS_SAFETY_CRITICAL_EXCEPTION();
        return;
    }
#endif

#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u//檢查是否容許在ISR中調用系統函數(除了POST)
    if (OSIntNestingCtr > (OS_NESTING_CTR)0u) { // OSIntNestingCtr是中斷嵌套數           /* Not allowed to call from an ISR                        */
       *p_err = OS_ERR_TIME_DLY_ISR;
        return;
    }
#endif

    if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0u) {       /* Can't delay when the scheduler is locked               */
       *p_err = OS_ERR_SCHED_LOCKED;
        return;
    }

    switch (opt) {
        case OS_OPT_TIME_DLY:
        case OS_OPT_TIME_TIMEOUT:
        case OS_OPT_TIME_PERIODIC:
             if (dly == (OS_TICK)0u) {                      /* 0 means no delay!                                      */
                *p_err = OS_ERR_TIME_ZERO_DLY;
                 return;
             }
             break;

        case OS_OPT_TIME_MATCH:
             break;

        default:
            *p_err = OS_ERR_OPT_INVALID;
             return;
    }

    OS_CRITICAL_ENTER();//告訴系統即將進去臨界區,關閉中斷
    OSTCBCurPtr->TaskState = OS_TASK_STATE_DLY;//將任務狀態設置爲延時狀態
    OS_TickListInsert(OSTCBCurPtr,
                      dly,
                      opt,
                      p_err);
    if (*p_err != OS_ERR_NONE) {
         OS_CRITICAL_EXIT_NO_SCHED();
         return;
    }
    OS_RdyListRemove(OSTCBCurPtr);                          /* Remove current task from ready list                    */
    OS_CRITICAL_EXIT_NO_SCHED();
    OSSched();                                              /* Find next task to run!                                 */
   *p_err = OS_ERR_NONE;
}
相關文章
相關標籤/搜索