時鍾節拍
時鍾節拍可謂是 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后會檢測函數的參
數是否合理。小時的范圍是 0到 99,分的范圍是 0到59,秒的范圍
是0到59,毫秒的范圍是0到999。
如果設置為 OS_OPT_TIME_HMSM_NON_STRICT,函數會接受
參數的范圍變大。小時的范圍是0到999,分的范圍是0到9999,秒
的范圍是0到65535,毫秒的范圍是0到4294967295。
限制小時范圍為0到999的原因是:一般是用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 () 函數的信息如下表所示。 
代碼練兵場(時間輪轉片調度方式):
在任務中一定要增加條件編譯,如下圖方框處:

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

這樣,創建相同優先級的任務,采用時間輪轉片的方式進行調度。
紅色方框處:任務的時間片節拍數(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 支持用戶在系統運行過程中使能或者禁止時間片調度,同時也支持全局的時間片設置,
也支持每個任務的單獨設置 。
