????????在FreeRTOS中,當硬件中斷發生時,當前正在運行的任務會立即被掛起,處理器會跳轉到中斷相關的中斷服務程序中,在中斷服務程序執行期間,遵循以下規則:
1、中斷獨占CPU,ISR擁有最高的執行優先級,在它執行完畢并顯示退出之前,沒有任何任務能夠得到CPU時間片來運行,處理器完全用于執行ISR代碼,也就是說,任務和裸奔時的while循環一樣,內部怎么調度,那是他們自己的事兒,中斷一旦來臨,他們都靠邊站;
2、中斷嵌套,如果系統允許中斷嵌套,并且發生了更高級的中斷,那么當前ISR會被新的中斷搶占,這和裸奔沒啥區別;
3、ISR中觸發調度,中斷服務程序執行完畢以后,會發生哪些事情呢?主要取決于以下幾個方面:
(1)、中斷是否觸發了任務切換,也就是說,在中斷中,是否調用了portYIELD_FROM_ISR()接口;
(2)、FreeRTOS調度模式的配置,也就是
configUSE_PREEMPTION的配置,如果配置為1,則為搶占式,如果配置為0,則為協作式,一班情況下,都是搶占式;
(3)、是否有更高優先級的任務就緒;
以下是中斷退出后系統調度的詳細流程和規則:
(1)、中斷退出時的核心決策點
? ? ? ? 中斷退出代碼(通常是portYIELD_FROM_ISR(xHigherPriorityTaskWoken或者是portEND_SWITCHING_ISR(xHigherPriorityTaskWoken)),是調度的觸發點;
? ? ? ? 該宏的參數xHigherPriorityTaskWoken的值是關鍵的輸入;
(2)、調度邏輯
? ? ? ? 當xHigherPriorityTaskWoken的值為true時,退出中斷后,處理器不會返回到被中斷的任務,調度器會檢查就緒的任務列表,選擇優先級最高的就緒任務運行;
? ? ? ? 當xHigherPriorityTaskWoken的值為false時,退出中斷后,處理器會返回到被中斷的任務繼續執行,但是同時調度器會檢查就緒的任務列表,在下一個調度點,切換到更高優先級的任務上;
簡單的來說:這有點兒類似于籃球場上的換人,中斷退出的那一刻(類似于罰球時刻),系統會看中斷服務程序有沒有要求主動“換人”,如果portYIELD_FROM_ISR(pdTRUE),則表示主動要求“換人”,馬上就會換上優先級最高的就緒任務,否則,只能在下一個調度點(類似于暫停等停球點)換上優先級最高的就緒任務;