ucos的時間管理機制) 收藏

來源:互聯網
上載者:User

 ucos的時間管理機制(轉) 收藏
一。時間管理機制

Ucos提供的延時基於系統時鐘。在系統初始化時,會進行系統時鐘的初始化。系統時鐘一般由硬體的某個時鐘提供,該時鐘會定時中斷,稱為一個tick。在每個tick發生時,系統進入時鐘中斷ISR。ISR 調用OSTimeTick(). OSTimeTick()對OSTCBList鏈表中的每個任務的進行延時處理,即將任務的TCB中的.OSTimeDly--。若OSTimeDly=0, 如果任務不被掛起,則將任務就緒,等待調度。OSTCBList包含了系統中所有建立的任務。

任務延時,即將任務從就緒表中刪除,將OSTimeDly置為合適的值。等待OSTimeDly=0時,再置為就緒,等待調度。

因此任務的延時,並不是要以延時任務時間長度,理想上總是tick中斷間隔的N倍。

Ucos還允許對系統時鐘tick進行計數,以計算自系統系統以來進行了多少個tick.

二、ucos提供的介面函數

void   OSTimeDly (INT16U ticks).

功能:延時ticks個系統tick時間長度。當成功延時後,進行任務調度。

INT8U   OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)

功能:提供基於毫秒,秒等容易的使用者介面。

INT8U   OSTimeDlyResume (INT8U prio);

功能:恢複延時任務

INT32U   OSTimeGet (void);

void   OSTimeSet (INT32U ticks);

功能:返回,設定系統時鐘tick計數.

三、關於延時功能的使用

雖然ucos提供了延時函數,但因為是基於系統時鐘中斷的,所有對於小於時鐘停機時間間隔的延時,並不能提供;只能通過軟體延時。

在很多情況下,可以通過訊號量、郵箱等方式取代延時功能。

特別要注意的是,在多任務的運行環境中,即使任務延時已經完畢,但由於此時有高優先順序的任務運行,此時任務仍不能運行。至任務可以運行時,實際的延時已經超過了預期的延時。

 

附:給出了OSTimeTick () 函數的具體程式

void OSTimeTick (void)   //這個節拍服務函數是在OSTickISR函數中調用的,目的是在時鐘節拍到來時,檢查每個任務的任務控制塊中的.OSTCBDly-1後是否為0,如果是,那麼表明這個任務剛才是掛起的狀態,此時應改變為就緒態
{
    OS_TCB *ptcb;

    OSTimeTickHook();                                      //
    ptcb = OSTCBList;                                      //時鐘節拍到來時,將控制塊雙向鏈表的第一個控制塊取出(並不是節拍之前啟動並執行任務)
    while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              //空閑任務處於控制塊雙向鏈表的最後一個,如果取出的控制塊為空白閑任務的控制塊,那麼已經取到最後一個了,就結束

      //        OS_ENTER_CRITICAL();
        if (ptcb->OSTCBDly != 0) {                         //
            if (--ptcb->OSTCBDly == 0) {                   //

                if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    //檢查任務是否處於強制掛起狀態,如果是,那再掛起一個時鐘節拍,否則就將它就緒

                    OSRdyGrp               |= ptcb->OSTCBBitY;

                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                } else {                                       //
                    ptcb->OSTCBDly = 1;                        //

                }                                              //
            }
        }
        ptcb = ptcb->OSTCBNext;                            //下一個任務控制塊
//        OS_EXIT_CRITICAL();
    }
    //    OS_ENTER_CRITICAL();                                   //
    OSTime++;           //節拍計數器+1
    //    OS_EXIT_CRITICAL();
}

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/zhouyujia/archive/2009/11/03/4756626.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.