2016-08-28 164 views
-2

我已經在實時系統上使用FreeRTOS來演示RTOS的各種功能。我現在面臨的問題如下:如何使用vApplicationTickHook()函數來測量freeRTOS中的任務執行時間?

  • 在主函數中創建了兩個任務(A和B),並啓動了實時調度程序。
  • 任務B的優先級低於任務A.任務B需要每n毫秒進行一次調度,但由於任務A的優先級高於B的優先級,因此B不會每n毫秒調度一次。
  • 因此,我們需要編寫一個新的函數,它接受A和B的任務句柄,並測量任務B的執行時間。
  • 如果B的執行時間大於n ms,則會增加優先級。

我瞭解功能的功能,以提高優先級,但無法理解如何衡量任務執行時間。該問題特別要求我們使用vApplicationTickHook(void)函數來執行此操作。任何暗示將不勝感激。我也在該課程的論壇上發帖,但沒有得到任何答覆,因此發佈在這裏。

+0

有一個示例已經在FreeRTOS文件IIRC。 –

+0

嗨,我經歷了FreeRTOS文檔,但無法弄清楚。謝謝 – dwd

+0

難道你不是這個意思嗎?如果任務A(較高優先級)所花費的時間大於'n',則需要增加A的優先級? –

回答

0

首先,讓我先回答我的回答,說這個問題的要求是奇怪的,而不是我在實踐中遇到過的。這可能有助於熟悉FreeRTOS。但這不是我在一個真正的項目上做過的事情。相反,我會更明智地設計任務。

vApplicationTickHook()定期運行,每嘀一次。它從定時器ISR的上下文運行,因此即使是高優先級的任務A也會搶佔。由於它定期運行,我們可以使用它來輪詢我們需要的信息。 FreeRTOS包含許多Task Utilities,其中一個可能提供了一些相關信息。

我發現看起來有用的第一件事是vTaskGetInfo()返回一個指向TaskStatus_t結構,它包含ulRunTimeCounter,至今分配給任務總運行時間。因此,從vApplicationTickHook()您可以撥打vTaskGetInfo()輪詢任務B的總運行時間。在本地靜態變量中記住任務B的上一次運行時,並且當其運行時間未增加n毫秒時,則您將知道是時候提高任務B的優先級了。

+0

重要注意事項:此測量結果只會與您的OS刻度分辨率一樣準確,該分辨率可能低於1 ms/tick。鑑於強加的要求,這應該起作用,但有更好的方法來做到這一點。 – rjp

+1

唯一的問題是vApplicationTickHook專門聲明「vApplicationTickHook()從ISR內執行的文檔,因此必須非常短,不要使用太多堆棧,並且不要調用任何不以」FromISR「或」FROM_ISR結尾「的API函數「 - 所以不要認爲從這裏調用vTaskGetInfo是明智的... – nchaud