天天看點

學習FreeRTOS之第六章——中斷管理

嵌入式作業系統需要對來自環境的事件進行響應,通過回答下面三個問題來判斷作業系統的響應政策是否最佳。

1,事件是如何偵測的?通常通過中斷,但是輪詢也可以。

2,如果通過中斷,對于事件的處理,怎麼配置設定在ISR之中和之外的處理時間?通常情況下,在ISR中的處理時間越短越好。

3,事件如何與主程式進行通信?如何建構代碼,以解決異步通信問題?

為了使任務代碼和中斷代碼更高效,中斷入口更簡潔,FreeRTOS提供了兩種API,一種給任務使用,另一種給中斷使用,中斷使用的名字的結尾為“FromISR”。

如果将configUSE_PREEMPTION配置為1,在任務中調用API時,任務會自動切換到更高優先級的其他任務。而在中斷中調用“FromISR”API時,在中斷結束後,不會自動切換到更高優先級的其他任務。調用“FromISR”API時,會更新該API的xHigherPriorityTaskWoken參數,然後通過調用下圖的兩個API進行任務的切換。建議在ISR的最末尾調用下面兩個API。

學習FreeRTOS之第六章——中斷管理

 建議在下面三種情況下,将中斷相關的處理程式放到任務中執行,并且這樣的任務叫作deferred interrupt processing。

1,中斷相關的處理比較複雜。例如,存儲ADC的采樣結果,放在ISR中進行處理。如果ADC的采樣結果要進行軟體濾波,這樣将處理程式放在任務中進行更好。

2,ISR中不友善進行處理的情況。例如,寫入到console,配置設定記憶體。

3,中斷相關的處理時間不确定。

ISR和deferred interrupt processing進行同步可以通過以下四種方式:

1,二進制信号量

學習FreeRTOS之第六章——中斷管理
學習FreeRTOS之第六章——中斷管理
學習FreeRTOS之第六章——中斷管理

二進制信号量進行同步在中斷發生頻率較低的情況下使用,當中斷不可預測以及發生次數不能預測時,會丢失中斷事件。

2, 計數信号量

配置configUSE_COUNTING_SEMAPHORES為1.

學習FreeRTOS之第六章——中斷管理

3,使用xTimerPendFunctionCallFromISR() API——centralized deferred interrupt processing

 使用centralized deferred interrupt processing的優勢和劣勢:

優勢:因為不用建立任務,有更低的資源開銷;更友善使用。

劣勢:該任務的優先級由configTIMER_TASK_PRIORITY決定,是以靈活性差;如果定時器指令隊列中有有其他指令,這将影響該任務的确定性。

學習FreeRTOS之第六章——中斷管理
學習FreeRTOS之第六章——中斷管理

4,使用隊列進行任務同步和資料通信

學習FreeRTOS之第六章——中斷管理
學習FreeRTOS之第六章——中斷管理

隊列提供了一種簡便的方法,将資料從ISR傳輸到任務,但是當資料傳輸速率很高時,這種方法不高效。 建議使用下面的三種更高效的資料傳輸方式:

a:使用DMA傳輸資料,然後通過任務通知的方式unblock任務。

b:将接收到的資料複制到線程安全的RAM區,然後通過任務通知的方式unblock任務。

c:在ISR中進行資料處理,将資料處理結果通過隊列傳輸給任務。

關于中斷嵌套的介紹:

學習FreeRTOS之第六章——中斷管理

 例如:

學習FreeRTOS之第六章——中斷管理

繼續閱讀