<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > FreeRTOS兩種延時(shí)函數的區別是什么?

FreeRTOS兩種延時(shí)函數的區別是什么?

發(fā)布人:13261589816 時(shí)間:2022-07-19 來(lái)源:工程師 發(fā)布文章

FreeRTOS提供了兩個(gè)系統延時(shí)函數:相對延時(shí)函數vTaskDelay()和絕對延時(shí)函數vTaskDelayUntil()。

· 相對延時(shí):指每次延時(shí)都是從任務(wù)執行函數vTaskDelay()開(kāi)始,延時(shí)指定的時(shí)間結束。

· 絕對延時(shí):指每隔指定的時(shí)間,執行一次調用vTaskDelayUntil()函數的任務(wù)。


相對延時(shí)函數

函數原型:void vTaskDelay( portTickType  xTicksToDelay )

函數參數xTicksToDelay:延時(shí)的時(shí)間長(cháng)度,單位是系統時(shí)鐘節拍周期

函數用法分析:調用vTaskDelay()函數后,任務(wù)會(huì )進(jìn)入阻塞狀態(tài),持續時(shí)間由參數xTicksToDelay指定,單位是系統節拍時(shí)鐘周期。延時(shí)時(shí)間是從調用vTaskDelay()后開(kāi)始計算的相對時(shí)間。比如vTaskDelay(100),那么從調用vTaskDelay()后,任務(wù)進(jìn)入阻塞狀態(tài),經(jīng)過(guò)100個(gè)系統時(shí)鐘節拍周期后任務(wù)解除阻塞。

使用示例如下,示例中系統時(shí)鐘節拍設置為1ms,包含紅色和綠色LED兩個(gè)用戶(hù)任務(wù),綠色LED任務(wù)的優(yōu)先級最高。在綠色LED閃爍的任務(wù)中,調用vTaskDelay函數延時(shí)100ms,執行綠色LED任務(wù)需要50ms,任務(wù)再次執行的時(shí)間間隔為延時(shí)時(shí)間100ms加上任務(wù)執行花費的50ms共計150ms。低優(yōu)先級的紅色LED任務(wù)執行10ms。

圖片

圖1

圖片

圖2

因為綠色LED任務(wù)為系統中最高優(yōu)先級任務(wù),會(huì )搶占低優(yōu)先級紅色LED任務(wù)執行,所以執行過(guò)程中紅色LED任務(wù)并不會(huì )對vTaskDelay函數造成影響。綠色LED任務(wù)再次執行的時(shí)間間隔為延時(shí)時(shí)間加上任務(wù)本身所用的時(shí)間,即延時(shí)時(shí)間100ms加上任務(wù)執行時(shí)間50ms共150ms。在Tracealyzer中的跟蹤視圖中顯示的時(shí)間間隔圖3所示。

圖片

圖3

如果調用vTaskDelay()函數的任務(wù)在執行過(guò)程中被更高優(yōu)先級的任務(wù)或者中斷所打斷,那么調用vTaskDelay()函數的任務(wù)將會(huì )受到影響,此時(shí)將不能保持一個(gè)固定的時(shí)間間隔運行。

繼續上文的例子,如果我們將綠色LED任務(wù)和紅色LED任務(wù)的優(yōu)先級進(jìn)行調換,那么綠色LED任務(wù)在執行過(guò)程中將被紅色LED任務(wù)打斷,那么我們可以再分析一下此時(shí)該任務(wù)的執行情況。Tracealyzer的跟蹤視圖如圖4所示,可以看到綠色LED任務(wù)在執行過(guò)程中被紅色LED任務(wù)搶占,紅色LED任務(wù)執行了10ms,因此綠色LED任務(wù)的執行間隔增加10ms變?yōu)榱?60ms。

紅色LED是否會(huì )搶占綠色LED任務(wù),以及何時(shí)發(fā)生任務(wù)搶占都是難以預知的,因此綠色LED任務(wù)的執行間隔或頻率也變得難以預測,這是在使用vTaskDelay()函數時(shí)需要注意的事項。

圖片

圖4

如果我們想要任務(wù)以固定的時(shí)間間隔重復運行,那么可以使用絕對延時(shí)函數。


絕對延時(shí)函數

函數原型:void vTaskDelayUntil( portTickType  *pxPreviousWakeTime, portTickType  xTimeIncrement );

函數參數:

pxPreviousWakeTime:指針,指向一個(gè)變量,該變量保存任務(wù)最后一次解除阻塞的時(shí)間。第一次使用前,該變量必須初始化為當前時(shí)間。之后這個(gè)變量會(huì )在vTaskDelayUntil()函數內自動(dòng)更新。

xTimeIncrement:絕對延時(shí)時(shí)間,即任務(wù)重復執行的時(shí)間間隔。

將上述例子中的vTaskDelay()函數替換為vTaskDelayUntil()函數,紅色LED任務(wù)的優(yōu)先級同樣高于綠色LED任務(wù)。

圖片

圖5

再次運行得到的跟蹤視圖如圖6所示,可以看到此時(shí)系統中仍然發(fā)生了任務(wù)搶占,但是綠色LED任務(wù)的執行時(shí)間間隔為我們通過(guò)vTaskDelayUntil()函數指定的100ms。

圖片

調用vTaskDelayUntil()函數時(shí),絕對延時(shí)的時(shí)間包含該任務(wù)本身的執行時(shí)間,以及任務(wù)被打斷的時(shí)間。例如綠色LED任務(wù)執行所用的50ms,以及紅色任務(wù)搶占占用的10ms,都屬于絕對延時(shí)的時(shí)間范圍內。任務(wù)執行過(guò)程中被短暫打斷也不會(huì )影響絕對延時(shí),從而保證任務(wù)能夠以設定的時(shí)間周期重復運行。相對延時(shí)的時(shí)間則不會(huì )包含任務(wù)本身的執行時(shí)間和任務(wù)被打斷的時(shí)間,這一點(diǎn)是兩種延時(shí)函數之間的重要區別。

注意事項:

如果任務(wù)延時(shí)過(guò)程中被打斷的時(shí)間太長(cháng),回來(lái)之后延時(shí)都超過(guò)了,那么則會(huì )立馬執行程序,不會(huì )再執行延時(shí)操作(任務(wù)不會(huì )再阻塞延時(shí))。

上述示例中我們調用vTaskDelayUntil()函數的任務(wù)優(yōu)先級為最高優(yōu)先級任務(wù),但實(shí)際應用中可能并非如此,因此該任務(wù)依然可能被中斷或者更高優(yōu)先級的任務(wù)打斷,此時(shí)vTaskDelayUntil()函數延時(shí)時(shí)間到了之后該任務(wù)將恢復就緒狀態(tài),但無(wú)法保證該任務(wù)能夠馬上執行。

兩種延時(shí)函數都面臨可能存在的中斷或者高優(yōu)先級任務(wù)打斷的問(wèn)題,無(wú)法保證任務(wù)一定能夠以指定的時(shí)間間隔重復運行,因此實(shí)踐中還需要借助類(lèi)似Tracealyzer這樣的RTOS可視化分析工具進(jìn)一步分析來(lái)保證RTOS復雜應用的可靠性。

想學(xué)習并了解Tracezlyzer更多信息和知識,可以參考《嵌入式實(shí)時(shí)操作系統-基于STM32Cube、FreeRTOS和Tracealyzer的應用開(kāi)發(fā)》圖書(shū)!

圖片


歡迎關(guān)注微信公眾號【麥克泰技術(shù)】


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: FreeRTOS 延時(shí)函數

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>