1.前言
最新的 FreeRTOS 移植中允許中斷嵌套。中斷嵌套需要在 FreeRTOSConfig.h 中設置configKERNEL_INTERRUPT_PRIORITY 和configMAX_SYSCALL_INTERRUPT_PRIORITY
2.控制中斷嵌套的常量
常量 | 描述 |
configKERNEL_INTERRUPT_PRIORITY |
設置系統心跳時鍾的中斷優先級。 如 果 在 移 植 中 沒 有 使 用 常 量 configMAX_SYSCALL_INTERRUPT_PRIORITY,那么需要調用中斷安全版本 FreeRTOS API 的中斷都必須運行在此優先級上。 |
configMAX_SYSCALL_INTERRUPT_PRIORITY |
設置中斷安全版本 FreeRTOS API 可以運行的最高中斷優先級。 |
3.建立全面的中斷嵌套模型
(1)建立一個全面的中斷嵌套模型需要設置 configMAX_SYSCALL_INTERRUPT_PRIRITY為比 configKERNEL_INTERRUPT_PRIORITY 更高的優先級
如上假定常量 configMAX_SYSCALL_INTERRUPT_PRIRITY 設置為 3,configKERNEL_INTERRUPT_PRIORITY 設置為 1
(2)假定這種情形基於一個具有七個不同中斷優先及的微控制器。這里的七個優先級僅僅是本例的一種假定,並非對應於任何一種特定的微控制器架構
(3)處於中斷優先級 1 到 3(含)的中斷會被內核或處於臨界區的應用程序阻塞執行, 但是它們可以調用中斷安全版本的 FreeRTOS API 函數
(4)處於中斷優先級 4 (高於configMAX_SYSCALL_INTERRUPT_PRIRITY)及以上的中斷不受臨界區影響,所以其不會被內核的任何行為阻塞,可以立即得到執行
注:這是由微控制器本身對中斷優先級的限定所決定的。通常 需 要 嚴 格 時 間 精 度 的 功 能 ( 如 電 機 控 制 ) 會 使 用 高 於configMAX_SYSCALL_INTERRUPT_PRIRITY 的優先級,
以保證調度器不會對其中斷響應時間造成抖動
(5)不需要調用任何 FreeRTOS API 函數的中斷,可以自由地使用任意優先級
4.中斷優先級與任務優先級的區別
(1)中斷優先級是由微控制器架構體系所定義的。
(2)中斷優先級是硬件控制的優先級,中斷服務例程的執行會與之關聯。
(3)任務並非運行在中斷服務中,所以賦予任務的軟件優先級與賦予中斷源的硬件優先級之間沒有任何關系
5.參考文檔
[1] FreeRTOS中文實用教程