日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RTX5 | 时间延时

發(fā)布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTX5 | 时间延时 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、前言
  • 二、API
    • 2.1、osDelay()
    • 2.2、osDelayUntil()

一、前言


RTX5提供兩個延時API函數(shù):

  • 相對延時osDelay(uin32_t ticks)
  • 絕對延時osDelayUntil(uint32_t ticks)
  • 無論哪一種時間延遲方式都難以避免線程被延時執(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í)行下面的代碼。

    #include "cmsis_os2.h"void Thread_1 (void *arg) { // 線程函數(shù)osStatus_t status; delayTime = 1000U; // 延時1000個Systick while(1){..... //其他代碼.....status = osDelay(delayTime); // 延時} }

    使用舉例:

    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)。

    #include "cmsis_os2.h"void Thread_1 (void *arg) { // 線程函數(shù)uint32_t tick;tick = osKernelGetTickCount(); // 獲取當(dāng)前系統(tǒng)的時間while(1){tick += 1000U; // 絕對延時1000個SystickosDelayUntil(tick);// ...} }

    總結(jié)

    以上是生活随笔為你收集整理的RTX5 | 时间延时的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。