RTX5 | 时间延时
文章目錄
- 一、前言
- 二、API
- 2.1、osDelay()
- 2.2、osDelayUntil()
一、前言
RTX5提供兩個延時API函數:
無論哪一種時間延遲方式都難以避免線程被延時執行。當各個線程的優先級不一樣時,RTX5執行可剝奪型線程管理。某個線程的延時時間到達時,很有可能有其他更高優先級的線程處于就緒態,或者產生ISR中斷回調處理,此時線程就會被推遲執行。線程被推遲的時間肯定會波動的,比如某一次延時時間達到時,系統上并沒有優先級更高的線程正處于就緒態,或者也沒有ISR中斷回調需要執行,這個理想的條件下,線程不會被推遲執行。所以,要計算每一次線程被推遲的時間比較困難。
兩種延時方式也許看不出區別,但實際上兩者是不同的。絕對延時OsDelayUntil()需要與另一個API函數osKernelGetTickCount()配合使用。相對延時osDelay()非常簡單,在需要延時的地方直接調用它即可。相對延時osDelay()在系統負荷較重時有可能會少一個節拍,RTX5官方手冊也有說明。使用絕對延時osDelayUntil()也很難避免被推遲,但它總會和預期的“匹配值”同步(osKernelGetTickCount()獲取),因此,一般推薦使用“絕對延時”來實現長時間運行的周期性延時。比如,線程A在CPU上電時就被創建,創建之后一直以5ms的周期運行,永不停止。
二、API
2.1、osDelay()
總的來說,當調用osDelay()時,當前線程進入WAIT_DELAY(BLOCKED)狀態,調度器將運行下一個已經處于就緒態(READY)的線程。當計時時間到達,調用osDelay()的線程從WAIT_DELAY(BLOCKED)狀態切換到就緒態(READY),如果沒有其他更高優先級的線程,那么當前線程就直接進入運行態(RUNNING),繼續執行下面的代碼。
使用舉例:
2.2、osDelayUntil()
總的來說,osDelayUntil()基于一個絕對時間來延時,這個絕對時間來自osKernelGetTickCount()。調用osDelayUntil()使線程進入阻塞態(BLOCKED)并立刻進行上下文切換,當計時時間達到時,線程從阻塞態(BLOCKED)切換到準備態(READY),如果當前沒有更高優先級的其他線程的話,那么線程直接進入運行態(RUNNING)。
總結
以上是生活随笔為你收集整理的RTX5 | 时间延时的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语言编写正反星星_厉害!浙理工师生原创短
- 下一篇: CAN总线技术 | 数据链路层04 -