FreeRTOS兩種延時函數的區別是什么?
FreeRTOS提供了兩個系統延時函數:相對延時函數vTaskDelay()和絕對延時函數vTaskDelayUntil()。
· 相對延時:指每次延時都是從任務執行函數vTaskDelay()開始,延時指定的時間結束。
· 絕對延時:指每隔指定的時間,執行一次調用vTaskDelayUntil()函數的任務。
相對延時函數
函數原型:void vTaskDelay( portTickType xTicksToDelay )
函數參數xTicksToDelay:延時的時間長度,單位是系統時鐘節拍周期
函數用法分析:調用vTaskDelay()函數后,任務會進入阻塞狀態,持續時間由參數xTicksToDelay指定,單位是系統節拍時鐘周期。延時時間是從調用vTaskDelay()后開始計算的相對時間。比如vTaskDelay(100),那么從調用vTaskDelay()后,任務進入阻塞狀態,經過100個系統時鐘節拍周期后任務解除阻塞。
使用示例如下,示例中系統時鐘節拍設置為1ms,包含紅色和綠色LED兩個用戶任務,綠色LED任務的優先級最高。在綠色LED閃爍的任務中,調用vTaskDelay函數延時100ms,執行綠色LED任務需要50ms,任務再次執行的時間間隔為延時時間100ms加上任務執行花費的50ms共計150ms。低優先級的紅色LED任務執行10ms。
圖1
圖2
因為綠色LED任務為系統中最高優先級任務,會搶占低優先級紅色LED任務執行,所以執行過程中紅色LED任務并不會對vTaskDelay函數造成影響。綠色LED任務再次執行的時間間隔為延時時間加上任務本身所用的時間,即延時時間100ms加上任務執行時間50ms共150ms。在Tracealyzer中的跟蹤視圖中顯示的時間間隔圖3所示。
圖3
如果調用vTaskDelay()函數的任務在執行過程中被更高優先級的任務或者中斷所打斷,那么調用vTaskDelay()函數的任務將會受到影響,此時將不能保持一個固定的時間間隔運行。
繼續上文的例子,如果我們將綠色LED任務和紅色LED任務的優先級進行調換,那么綠色LED任務在執行過程中將被紅色LED任務打斷,那么我們可以再分析一下此時該任務的執行情況。Tracealyzer的跟蹤視圖如圖4所示,可以看到綠色LED任務在執行過程中被紅色LED任務搶占,紅色LED任務執行了10ms,因此綠色LED任務的執行間隔增加10ms變為了160ms。
紅色LED是否會搶占綠色LED任務,以及何時發生任務搶占都是難以預知的,因此綠色LED任務的執行間隔或頻率也變得難以預測,這是在使用vTaskDelay()函數時需要注意的事項。
圖4
如果我們想要任務以固定的時間間隔重復運行,那么可以使用絕對延時函數。
絕對延時函數
函數原型:void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );
函數參數:
pxPreviousWakeTime:指針,指向一個變量,該變量保存任務最后一次解除阻塞的時間。第一次使用前,該變量必須初始化為當前時間。之后這個變量會在vTaskDelayUntil()函數內自動更新。
xTimeIncrement:絕對延時時間,即任務重復執行的時間間隔。
將上述例子中的vTaskDelay()函數替換為vTaskDelayUntil()函數,紅色LED任務的優先級同樣高于綠色LED任務。
圖5
再次運行得到的跟蹤視圖如圖6所示,可以看到此時系統中仍然發生了任務搶占,但是綠色LED任務的執行時間間隔為我們通過vTaskDelayUntil()函數指定的100ms。
調用vTaskDelayUntil()函數時,絕對延時的時間包含該任務本身的執行時間,以及任務被打斷的時間。例如綠色LED任務執行所用的50ms,以及紅色任務搶占占用的10ms,都屬于絕對延時的時間范圍內。任務執行過程中被短暫打斷也不會影響絕對延時,從而保證任務能夠以設定的時間周期重復運行。相對延時的時間則不會包含任務本身的執行時間和任務被打斷的時間,這一點是兩種延時函數之間的重要區別。
注意事項:
如果任務延時過程中被打斷的時間太長,回來之后延時都超過了,那么則會立馬執行程序,不會再執行延時操作(任務不會再阻塞延時)。
上述示例中我們調用vTaskDelayUntil()函數的任務優先級為最高優先級任務,但實際應用中可能并非如此,因此該任務依然可能被中斷或者更高優先級的任務打斷,此時vTaskDelayUntil()函數延時時間到了之后該任務將恢復就緒狀態,但無法保證該任務能夠馬上執行。
兩種延時函數都面臨可能存在的中斷或者高優先級任務打斷的問題,無法保證任務一定能夠以指定的時間間隔重復運行,因此實踐中還需要借助類似Tracealyzer這樣的RTOS可視化分析工具進一步分析來保證RTOS復雜應用的可靠性。
想學習并了解Tracezlyzer更多信息和知識,可以參考《嵌入式實時操作系統-基于STM32Cube、FreeRTOS和Tracealyzer的應用開發》圖書!
歡迎關注微信公眾號【麥克泰技術】
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。