1.前言
嵌入式實時操作系統需要對整個系統環境產生的事件作出響應。可以采用中斷方式也可以采用輪詢方式來進行處理。如果采用中斷方式,則希望ISR(中斷服務例程)的處理時間越短越好。
注:必須說明的是,只有以”FromISR”或”FROM_ISR”結束的API 函數或宏才可以在中斷服務例程中。
2. 延遲中斷處理

圖 利用二值信號量實現中斷與任務同步

- 延遲中斷的實現
(1)通過在中斷處理中增加二值信號量,中斷發生時解除任務的阻塞狀態,讓任務得以執行,相當於讓任務與中斷同步;
(2)這樣中斷處理例程中就可以做少量的事情,大量的工作放到同步任務中完成;
(3)將工作量大的事情交給解除阻塞的同步任務來執行,從這個角度上看,中斷處理被延遲了,所以稱為延遲中斷處理。
注:二值信號量可以理解成一個深度為1的隊列。
- 延遲中斷同步任務優先級
(1)如果中斷處理特別緊急,可以將中斷退出后的同步任務優先級設為最高,保證中斷延遲處理任務隨時可以中斷其它任務;
(2)由於中斷同步任務緊跟中斷處理函數執行,相當於所有的處理都在ISR中完成一樣
注:中斷延遲是ISR give信號量,任務take信號量,且再也不用give,這種用法很類似於隊列的用法,與其它的任務同步方法有所區別
3. 相關處理流程舉例

- 處理流程介紹
(1)handler任務具有比periodic任務高的優先級,handler任務中等待信號量,在periodic任務中觸發中斷;
(2)中斷處理函數中執行give操作后,並通過一次顯示的任務調度保證切換到handler任務處理;
(3)handler任務獲取信號量后繼續執行,之后將執行periodic任務
- 上例中二值信號量的流程
1. 中斷產生。
2. 中斷服務例程啟動,給出信號量以使延遲處理任務解除阻塞。
3. 當中斷服務例程退出時,延遲處理任務得到執行。延遲處理任務做的第一件事便是
獲取信號量。
4. 延遲處理任務完成中斷事件處理后,試圖再次獲取信號量——如果此時信號量無效,
任務將切入阻塞待等待事件發生。
4.相關的API處理
| API | 說明 | 參數及返回值 |
| vSemaphoreCreateBinary | 創建二值信號量 | xSemaphore 創建的信號量 |
| xSemaphoreTake | 獲取(Obtain)”或”接收(Receive)”信號量。只有當信 |
xSemaphore 獲取得到的信號量 xTicksToWait 阻塞超時時間。如果把xTicksToWait 設置為portMAX_DELAY , 並且在 FreeRTOSConig.h 中設定INCLUDE_vTaskSuspend 為1,那么阻塞等待將沒有超時限制。 |
| xSemaphoreGiveFromISR | 是xSemaphoreGive()的特殊形式,專門用於中斷服務例程中 |
xSemaphore 給出的信號量 pxHigherPriorityTaskWoken 對某個信號量而言,可能有不止一個任務處於阻塞態在等待其有效。調用xSemaphoreGiveFromISR()會讓信 |
