2017-05-12 97 views
0

我在使用FreeRTOS二進制互斥鎖時遇到了一些問題。在我的應用程序中,有多個具有相同優先級的線程(任務),其中兩個對mutex採取和mutex釋放中的文件I/O函數的訪問。FreeRTOS具有相同優先級的互斥鎖多任務

取決於某些時機,一個任務正在對另一個做飢餓。那可能嗎?

FreeRTOS考慮到等待資源的任務有多少時間?

謝謝

+0

爲什麼要在臨界區內進行文件I/O操作?這聽起來像個壞主意。 –

+0

是多線程安全的。 – jabella

+0

還有其他方法可以線程安全。避免飢餓的最好方法是讓互斥體儘可能小:不要做任何超過幾個CPU週期的事情,並且不要做任何可能阻塞調用方的事情(例如,不要做文件I/O)。保持I/O線程安全的最好方法是隻讓一個線程訪問任何特定的設備。我不知道你的程序與哪個存儲設備對話,但它可能只有一個「端口」或「接口」,所以沒有性能的理由讓多個線程對話。這只是你選擇如何組織你的程序的問題。 –

回答

3

您是否在多任務中使用緊密循環中的互斥鎖?如果是這樣,那麼爲什麼一個任務可能會持續比您想象的時間更長的邏輯原因。如果任務A和B具有相同的優先級,則A持有該互斥體並且B正在等待該互斥體,則當A向互斥體返回時不會發生上下文切換,因爲B具有與A相同的優先級(它會發生if B具有更高的優先級,但如果任務切換髮生在同等優先級的任務上,則會違反調度算法和風險任務顛簸)。在那裏,如果A在一個循環中,則將該互斥量返回,然後立即再次獲取該互斥量,每當B嘗試獲取該互斥量時,就會發現A仍然保持該互斥量,因此,如果B也處於循環中,它將阻止再次在互斥體上。這種情況很容易解決 - 但建議您閱讀免費提供的書中描述這一章的章節:http://www.freertos.org/Documentation/RTOS_book.html

+0

是的,你是對的。這是SD卡已滿並且重試嘗試做出您描述的場景的情況。我在重試時延遲了1毫秒。 de mutex釋放後的taskYield也可以解決這個問題,但在我看來,延遲更爲清晰。這種行爲在操作系統上是否正常?我在想當一個互斥調用被調用時,操作系統會檢查哪個任務正在等待更多時間。 – jabella