讓6個任務中,6個,4個(任務)等待信號量。當信號燈處於信號,是什麼決定由RTOS做出
當信號量在RTOS中發佈或發信號時會發生什麼?
- 從等待(信號)列表
- 如果一個任務從等待名單挑挑哪個任務會出現什麼發生在剩餘的任務上,即他們什麼時候運行。
- 當已經有更高優先級的任務正在運行時。
是解決所有RTOS
讓6個任務中,6個,4個(任務)等待信號量。當信號燈處於信號,是什麼決定由RTOS做出
當信號量在RTOS中發佈或發信號時會發生什麼?
- 從等待(信號)列表
- 如果一個任務從等待名單挑挑哪個任務會出現什麼發生在剩餘的任務上,即他們什麼時候運行。
- 當已經有更高優先級的任務正在運行時。
是解決所有RTOS
相同的,如果這是一個基於優先級的,搶佔式多任務系統則RTOS調度程序將運行的最高優先級的任務就是隨時可以運行。當信號發出信號時,RTOS調度程序重新評估最高優先級的準備運行任務,並且如果它與以前運行的任務不同,則它將執行上下文切換到該任務。
當有多個任務等待同一個信號和旗語信號則:等待信號量的任務
上述情況適用於所有基於優先級的搶佔式多任務RTOS,它不一定是全部RTOS。如果RTOS不支持優先任務,那麼它可能會將信號量授予等待信號最長的任務。它也可能使用循環調度程序,以便每個任務運行在預定的時間段內,而不是允許任務異步搶佔對方。
後續: 如果您使用的是信號作爲一個事件信號,並且有消耗事件的多個任務,那麼你將不得不仔細考慮設計。我不相信這可以用一個二進制信號量完成。因爲如果最高優先級的消費者任務獲得信號量,執行其業務,然後在信號量再次發信號之前再次等待信號量,則每次發送信號時,最高優先級的消費者總是獲得信號量。優先級較低的消費者任務永遠不會運行,因爲他們永遠不會被授予信號量。
一個可能的解決方案是使用計數信號量。發生事件時,應將信號計數設置爲等於消耗任務的數量。然後每個消耗任務獲取信號並將計數減1。消耗任務不應該再次等待信號量,直到信號量減少到零。這將防止最高優先級的消費者每個事件多次獲取信號量,因此它將允許每個消費者任務只運行一次以響應事件。
您可能想要探索發佈 - 訂閱設計模式,以查看是否有更好的方法來解決這種情況。
如果最高優先級任務(由於信號燈運行而發出信號)完成其操作並開始等待信號信號,則剩餘任務將永久等待。任何提及這些概念的方法都很清楚。 – anishkumar
@anishkumar,我在回答中添加了一些後續信息。 – kkrambo
@anishkumar:如果在給出信號量時信號量的優先級較高的任務始終懸而未決,那麼優先級較低的任務將永遠不會運行。如果所有任務的優先級相同,則可能取決於實時操作系統實現,但通常是非確定性的。一些RTOS有一個semFlush(例如VxWorks),所有等待的任務都已準備就緒。它的信號量正在計數,並且任務等待任務的優先級更高,那麼您可以多次給信號量以使所有線程就緒。最後檢查你的RTOS的文檔。 – Clifford