uC/OS-III 時鍾節拍,時間管理,時間片調度


時鍾節拍

時鍾節拍可謂是 uC/OS 操作系統的心臟,它若不跳動,整個系統都將會癱瘓。 時鍾節拍就是操作系統的時基,操作系統要實現時間上的管理,必須依賴於時基。 
時鍾節拍就是系統以固定的頻率產生中斷(時基中斷),並在中斷中處理與時間相關的
事件,推動所有任務向前運行。 時鍾節拍需要依賴於硬件定時器, 在 STM32 裸機程序中經
常使用的 SysTick時鍾是 MCU的內核定時器,通常都使用該定時器產生操作系統的時鍾節拍。
用戶需要先在os_cfg_app.h中設定時鍾節拍的頻率,該頻率越高,操作系統檢測事
件就越頻繁,可以增強任務的實時性,但太頻繁也會增加操作系統內核的負擔加重,所以用
戶需要權衡該頻率的設置。在這里采用默認的 1000 Hz(之后若無特別聲明,均采
1000 Hz),也就是時鍾節拍的周期為 1 ms

 

時間管理

OSTimeDly()

 

任務調用這個函數后就會被掛起直到期滿。這個函數可以有三種模式:相對延時模式,周期性延時模式,絕對定時模式 

1) 第一個參數是任務的延時時基數。 如果時基速率被設置為
1000Hz, 任務會每次執行都會被延時大約2毫秒。 然而, 並不是精確
地延時2個時基,因為任務被掛起后是檢測時基中斷發生的次數與任
務的延時值是否相同來判斷是否超時的。 也就是說, 當任務在時基中
斷將要到來時被掛起,那么實際的延時時基會少1個時基
2)參數為OS_OPT_TIME_DLY表明用戶選擇的相對延時模式 

 

OS_OPT_TIME_DLY

 

指定相對延遲。

 

OS_OPT_TIME_TIMEOUT

 

等同OS_OPT_TIME_DLY

 

OS_OPT_TIME_PERIODIC

 

指定周期模式。

 

OS_OPT_TIME_MATCH

 

指定任務在OSTickCtr達到指定的值時將被喚醒dly(絕對延時)

 

3)如大多數 uC/OS-III函數一樣,錯誤代號會被返回。當所有的參數都是有效時會返回OS_ERR_NONE
4) 當返回不為OS_ERR_NONE時, OSTimeDly()將不會執行延時操作

 

OSTimeDlyHMSM()

 


任務可以調用這個函數為任務設置延時,這個函數更“ 友好” 於
用戶。特別的,可以設置為小時,分鍾,秒,毫秒( HMSM由此四
個英文首字母得來)。這個函數只在相對延時模式下運行 。

 

 1)這四個參數設置了延時的時間(分別對應為時、分、秒、
毫秒)。在這個例子中,設置了延時 1秒。延時的分辨率決定於時基
頻率。例如,如果時基頻率為1000Hz那么延時的分辨率為1毫秒。
如果時基的頻率為100Hz那么延時的分辨率為10毫秒。同樣的,延時時間不會很精確 。
2)設置 OS_OPT_TIME_HMSM_STRICT后會檢測函數的參
數是否合理。小時的范圍是 099,分的范圍是 059,秒的范圍
059,毫秒的范圍是0999
如果設置為 OS_OPT_TIME_HMSM_NON_STRICT,函數會接受
參數的范圍變大。小時的范圍是0999,分的范圍是09999,秒
的范圍是065535,毫秒的范圍是04294967295
限制小時范圍為0999的原因是:一般是用32位的數記錄時基
值的。如果時基的頻率為1000Hz,那么最多能計數 4294967秒,大
1193小時。因此設置999小時為上限
3)如大多數uC/OS-III函數一樣返回一個錯誤代號
OSTimeDly()OSTimeDlyHMSM()經常被用於創建周期性的任
務。 例如, 設置任務每50毫秒掃描一次鍵盤、 每10毫秒讀取AD輸入等 。

OSTimeDlyResume()
OSTimeDlyResume () 函數用於直接結束其他任務(非當前任務)的延時。 用戶若要使用
OSTimeDlyResume () 函數,得事先將宏 OS_CFG_TIME_DLY_RESUME_EN(位於“os_cfg.h”)設為 1。 

OSTimeGet ()
OSTimeGet () 函數用於獲取當前的時鍾節拍計數值。 OSTimeGet () 函數的信息如下表所示。 

OSTimeSet ()
OSTimeSet () 函數用於設置當前的時鍾節拍計數值。 OSTimeSet () 函數的信息如下表所示。 

代碼練兵場(時間輪轉片調度方式):

在任務中一定要增加條件編譯,如下圖方框處:

並且在下圖所示文件中,使能時間片的宏:

這樣,創建相同優先級的任務,采用時間輪轉片的方式進行調度。

OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
         其中OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); 
 函數參數一:DEF_ENABLED使能調度輪轉法,DEF_DISBLED失能調輪轉法。
        參數二:用來設置時間片長度。時間長度 = 參數值*時間節拍。其中時間節拍與系統時間頻率OS_CFG_TICK_RATE_HZ,互為倒數。
第二步:創建任務時,通過設置(OS_TICK  )參數,來設置任務擁有幾個時間片。

紅色方框處:任務的時間片節拍數(0表默認值OSCfg_TickRate_Hz/10)

我們可以查看源碼如下:

1. 由於這幾個參數是全局變量,所以必須關閉中斷。
2. 根據形參設置是否使能時間片調度。
3. 變量 OSSchedRoundRobinDfltTimeQuanta 是用來設置默認的時間片個數,也就是說,如果程序中
沒有單獨配置任務的時間片個數,就會使用這個默認時間片個數。

放棄剩余時間片OSSchedRoundRobinYield ()
這個函數的主要功能就是任務在完成工作的情況下,如果還有剩余的時間片,可以放棄這些時間去執行另外的同優先級任務切記,是另外的同優先級任務) 。

1. 獲取此優先級的就緒鏈表。從而得到此優先級下任務的個數,如果同優先級下只有一個任務,將退出
這個函數。
2. 移動同優先級就緒鏈表中任務的位置,從實現同優先級下任務的切換。
3. 參數 p_tcb->TimeQuanta = 0 的時候就會使用默認的時間片個數,如果非 0,就會給這個任務的時
間片計數器賦予相應的時間片個數。

4. 執行任務調度。

 

當多個任務有相同的優先級時,μCOS-III 允許任務在切換到另一個任務前運行特定的時間,也就是大
家常說的時間片。這個過程就是 Round-Robin 調度或者時間片調度。如果任務不需要將所有的時間片用
完,可以調用上面講的函數 OSSchedRoundRobinYield (),放棄剩余時間片從而切換到同優先級的另一
個任務。 μCOS-III 支持用戶在系統運行過程中使能或者禁止時間片調度,同時也支持全局的時間片設置,
也支持每個任務的單獨設置 。

時間片輪轉調度算法的作用及原理:
作用:用於相同優先級任務的切換。
原理:在ucos iii中任務優先級是依靠一個數組變量來實現的,數組變量的每一位代表一個優先級。當某一位為1時,代表當前優先級有任務已經處於就緒狀態。等待CPU分配。當兩個處於同一優先級的任務同時就緒時,則取任務鏈表中的第一個任務執行(每個優先級都擁有一個任務鏈表,該鏈表中任務的優先級均相同)。當該任務時間片用完時,將該任務插入任務鏈表尾部。由此就能完成時間片輪轉調度了。
 
和FreeRTOS相比,ucos做得並沒有那么好,前者如果沒有使能某些配置就編譯,會報錯誤,能更好的提示編程者,不過基本原理大家都一樣。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM