freeRTOS中文實用教程3--中斷管理之延遲中斷處理


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)”信號量。只有當信
號量有效的時候才可以被獲取。在經典信號量術中,SemaphoreTake()等同於一次P()操作。不能在中斷服務例程中調用

 xSemaphore

獲取得到的信號量

xTicksToWait

阻塞超時時間。如果把xTicksToWait 設置為portMAX_DELAY , 並且在

FreeRTOSConig.h 中設定INCLUDE_vTaskSuspend 為1,那么阻塞等待將沒有超時限制。

 xSemaphoreGiveFromISR  

是xSemaphoreGive()的特殊形式,專門用於中斷服務例程中

 xSemaphore

給出的信號量

pxHigherPriorityTaskWoken

對某個信號量而言,可能有不止一個任務處於阻塞態在等待其有效。調用xSemaphoreGiveFromISR()會讓信
號量變為有效,所以會讓其中一個等待任務切出阻塞態。如果調用SemaphoreGiveFromISR()使得一個任務解除阻塞,並且這個任務的優先級高於當前任務(也就是被中斷的任務),那么SemaphoreGiveFromISR()會在函數內部將*pxHigherPriorityTaskWoken 設為
pdTRUE。如果xSemaphoreGiveFromISR() 將此值設為pdTRUE,則在中斷退出前應當進行一次上下文切換。
這樣才能保證中斷直接返回到就緒態任務中優先級最高的任務中(否則會切換到被中斷的任務)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM