2017-07-03 170 views
0

我似乎無法找到關於此問題的任何信息,所以我想我會問這裏。 (無應答這裏:https://lists.zephyrproject.org/pipermail/zephyr-devel/2017-June/007743.htmlFreeRTOS vs Zephyr/Mynewt任務阻塞狀態

當驅動程序(如SPI或UART)通過 FreeRTOS操作系統使用供應商HAL調用,然後有 是等待完成後兩個選項:

1)中斷 2)忙着等待

我的問題是這樣的:

如果驅動程序是使用忙等待調用; FreeRTOS是否有任何關於忙碌等待的知識(在HAL驅動程序中發生)?該任務是否仍然獲得分配的時隙(用於忙碌等待)。這是 它是如何工作的? (假設FreeRTOS任務有一個搶先調度器)

現在在Zephyr(也可能是Mynewt)中,我可以看到當驅動程序被調用時,Zephyr跟蹤調用任務,然後暫停(阻塞狀態)直到完成。然後,驅動程序中斷例程將調用線程放入運行隊列中,準備繼續時。這樣就不會有任何循環。這是正確的理解?

感謝 安德斯

回答

0

我不明白你的問題。在FreeRTOS中,如果執行驅動程序以執行繁忙的等待(即,驅動程序不知道多線程,所以不是事件驅動的,而是使用佔用所有CPU時間的繁忙等待),那麼RTOS調度程序不知道正在發生,所以會安排任務,就好像任何其他任務一樣。因此,如果任務是最高優先級的就緒狀態任務,它將使用所有CPU時間,並且如果有其他同等優先級的任務,它將與這些任務共享CPU時間。另一方面,如果編寫驅動程序來使用RTOS(即Zephr,FreeRTOS或其他),那麼它可以利用RTOS原語來創建更高效​​的事件驅動執行模式。我看不出你提到的不同調度程序在這方面的表現會有什麼不同。例如,Zephr如何知道它不知道應用程序編寫器將要創建的任務將調用它以前不知道的庫函數,並且庫函數將使用繁忙的等待?

+0

謝謝理查德。現在更清楚了。我只是想確保我正確地理解它 - 就像你說的那樣,如果RTOS不知道驅動程序正忙等待,那麼它將爲該任務安排一個時隙,以便它可以忙於等待。這是無效的。 – Anders