UC OS II 時間管理

2021-07-05 03:28:58 字數 1681 閱讀 8680

volatile  int32u  ostime全域性變數是時間管理最重要的資料結構。

時間管理的函式都在os_time.c中定義

時間獲取和設定函式

nt32u        ostimeget               (void);

void          ostimeset               (int32u           ticks);

乙個是獲取ostime的值,乙個是修改ostime的值。

這兩個函式在都是簡單的函式,但是需要注意到的是,這兩個函式取全域性變數ostime的時候,都用到臨界區os_enter_critical( )函式。

任務時延函式ostimedly

void  ostimedly (int32u ticks)

呼叫該函式的任務將會延遲ticks個滴答週期,就是會將任務狀態轉為阻塞態,在ticks個滴答週期後又轉換為就緒態。

該函式也很簡單,將就緒表和就緒陣列中任務相關的位清零。將當前任務的任務控制塊的成員設定為需要休眠的時間,ostcbcur->ostcbdly = ticks。

之前在任務控管理部分中都有提到過。

任務按時分秒延遲任務函式ostimedlyhmsm

int8u  ostimedlyhmsm (int8u   hours,int8u   minutes,int8u   seconds,int16u  ms)

該函式功能也是任務延遲,時間引數不是按滴答數,而是根據我們日常習慣中使用的時分秒毫秒。

除了一些引數的檢查之外。該函式的重要部分在於將時分秒毫秒轉換成滴答的數量,呼叫ostimedly,將轉換得到的時間滴答的數目作為引數傳遞給ostimedly。如下:

ticks = ((int32u)hours * 3600ul + (int32u)minutes * 60ul + (int32u)seconds) * os_ticks_per_sec+ os_ticks_per_sec * ((int32u)ms + 500ul / os_ticks_per_sec) / 1000ul;

os_ticks_per_sec是1秒鐘的時間滴答數目。

延時恢復函式ostimedlyresume

int8u  ostimedlyresume (int8u prio)函式的主要功能是將還在延時阻塞的函式(延時還沒有結束的函式)提前喚醒。

若是簡單的時延,使用該函式的話,提前結束延時,任務由阻塞狀態進入就緒狀態。

若是設定了超時時間的,因等待事件而發生阻塞的任務,呼叫該函式,那麼該任務就跟等待超時的情況一樣了。

但是使用ostasksuspend而掛起的任務,使用該函式是無效的。

ostimedlyresume函式,除了前面的引數檢查以外(跟之前任務管理裡面的很多函式差不多),其核心**如下:

ptcb->ostcbdly = 0u;                                       //將任務等待延時時間清零

if ((ptcb->ostcbstat & os_stat_pend_any) != os_stat_rdy) else

if ((ptcb->ostcbstat & os_stat_suspend) == os_stat_rdy) else

uC OS II的時間管理

上一次我們談到了任務管理,今天來講一下uc os的時間管理。大家初學微控制器的時候都跑過流水燈這個例程吧,流水燈程式裡一定有延時函式delay吧,想想那時候delay是怎麼寫的 讓cpu空轉!空轉啊同學們,多麼令人心疼的事,8051核這麼經典的設計讓你們用來空轉啊 咳咳,當然了51跑多工還是比較吃力...

uC OS II系統學習筆記(7) 時間管理

任務延時函式即ostimedly 申請該服務的任務可以延時一段時間,這個時間是根據時鐘節拍的數目來定的。其入口引數為 void ostimedly int16u ticks 由以上可看出,傳入的引數是ticks,即時鐘節拍。如果時鐘節拍是1ms,那麼ostimedly 1 即為延時1毫秒,若時鐘節拍...

管理感悟 時間管理

管理感悟 時間管理 栁鯤鵬2017 12 01 關鍵字 管理 時間管理 簡介 介紹如何進行時間管理,做好工作。目錄為什麼我這麼忙,事情還沒搞好 1 重要與緊急的關係 2 維護每日工作列表 2 對重點的判斷 3 學會時間管理是很難的 3 為什麼我這麼忙,事情還沒搞好 每個人都說自己很忙。是真的忙嗎?1...