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