優先順序 讓我頭疼好久啊
轉一篇文章,這裡還有不明白的望高手指教!
被我用紅色注釋的部分的值怎樣選擇??
(一)中斷優先順序概念
stm32(cortex-m3)
中有兩個優先順序的概念——搶占式優先順序和響應優先順序,有人把響應優先順序稱作'
亞優先順序'
或'副優先順序'
,每個中斷源都需要被指定這兩種優先順序。
(二)中斷響應次序
(1)具有高搶占式優先順序的中斷可以在具有低搶占式優先順序的中斷處理過程中被響應,即中斷巢狀,或者說高搶占式優先順序的中斷可以巢狀低搶占式優先順序的中斷。
(2)當兩個中斷源的搶占式優先順序相同時,這兩個中斷將沒有巢狀關係,當乙個中斷到來後,如果正在處理另乙個中斷,這個後到來的中斷就要等到前乙個中斷處理完之後才能被處理。
(3)如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先順序高低來決定先處理哪乙個;如果他們的搶占式優先順序和響應優先順序都相等,則根據他們在中斷表中的排位順序決定先處理哪乙個。
(三)中斷的優先順序
在cortex-m3
中定義了8
個位元位用於設定中斷源的優先順序,這8
個位元位可以有8
種分配方式,如下:
所有8位用於指定響應優先順序
最高1位用於指定搶占式優先順序,最低7
位用於指定響應優先順序
最高2位用於指定搶占式優先順序,最低6
位用於指定響應優先順序
最高3位用於指定搶占式優先順序,最低5
位用於指定響應優先順序
最高4位用於指定搶占式優先順序,最低4
位用於指定響應優先順序
最高5位用於指定搶占式優先順序,最低3
位用於指定響應優先順序
最高6位用於指定搶占式優先順序,最低2
位用於指定響應優先順序
最高7位用於指定搶占式優先順序,最低1
位用於指定響應優先順序
cortex-m3
允許具有較少中斷源時使用較少的暫存器位指定中斷源的優先順序,因此stm32
把指定中斷優先順序的暫存器位減少到4
位,這4
個暫存器位的分組方式如下: 第0
組:所有4
位用於指定響應優先順序 第1
組:最高1
位用於指定搶占式優先順序,最低3
位用於指定響應優先順序 第2
組:最高2
位用於指定搶占式優先順序,最低2
位用於指定響應優先順序 第3
組:最高3
位用於指定搶占式優先順序,最低1
位用於指定響應優先順序 第4
組:所有4
位用於指定搶占式優先順序
(四)具體設定
可以通過呼叫stm32
的韌體庫中的函式nvic_prioritygroupconfig()
選擇使用哪種優先順序分組方式,這個函式的引數有下列5種:
nvic_prioritygroup_0 =>
選擇第0組
nvic_prioritygroup_1 =>
選擇第1組
nvic_prioritygroup_2 =>
選擇第2組
nvic_prioritygroup_3 =>
選擇第3組
nvic_prioritygroup_4 =>
選擇第4組
(五)舉例
接下來就是指定中斷源的優先順序,下面以乙個簡單的例子說明如何指定中斷源的搶占式優先順序和響應優先順序:
// 選擇使用優先順序分組第1組
nvic_prioritygroupconfig(nvic_prioritygroup_1); //這裡的group0-4怎麼選擇
// 使能exti0中斷
nvic_initstructure.nvic_irqchannel = exti0_irqchannel;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 1; //
指定搶占式優先級別1
nvic_initstructure.nvic_irqchannelsubpriority = 0; //
指定響應優先級別0
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
// 使能exti9_5中斷
nvic_initstructure.nvic_irqchannel = exti9_5_irqchannel;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; //
指定搶占式優先級別0
nvic_initstructure.nvic_irqchannelsubpriority = 1; //
指定響應優先級別1
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
(六)注意事項 1
)如果指定的搶占式優先級別或響應優先級別超出了選定的優先順序分組所限定的範圍,將可能得到意想不到的結果; 2
)搶占式優先級別相同的中斷源之間沒有巢狀關係; 3
)如果某個中斷源被指定為某個搶占式優先級別,又沒有其它中斷源處於同乙個搶占式優先級別,則可以為這個中斷源指定任意有效的響應優先級別。
現在解答我最初的問題
如何設定nvic_irqchannelpreemptionpriority 和 nvic_irqchannelsubpriority 兩項的值。
這個根據應用程式的需要,
例如3個任務,任務1最緊急(它到來的時候必須打斷其他任務),任務2和任務3一般(即不必打斷對方,但是如果同時到來需要先執行任務2),你可以設定成第1組(第1組:最高1位用於指定搶占式優先順序,最低3位用於指定響應優先順序)
然後做以下配置:
nvic_initstructure.nvic_irqchannel = 任務1;
//主優先順序為0,最高
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;
nvic_initstructure.nvic_irqchannelsubpriority = 1;
nvic_initstructure.nvic_irqchannel = 任務2;
//主優先順序為1,低於任務1(能被任務1打斷)
nvic_initstructure.nvic_irqchannelpreemptionpriority = 1;
//次優先順序為0,
nvic_initstructure.nvic_irqchannelsubpriority = 0;
nvic_initstructure.nvic_irqchannel = 任務3;
//主優先順序為1,低於任務1(能被任務1打斷)
nvic_initstructure.nvic_irqchannelpreemptionpriority = 1;
//次優先順序為1,低於任務2(不被任務2打斷,但同時到來先執行任務2)
nvic_initstructure.nvic_irqchannelsubpriority = 1;
中斷優先順序
中斷優先順序有兩種,一種是搶占優先順序,一種是固有優先順序,先介紹搶占優先順序。中斷搶占優先順序 ip 這個暫存器的每一位,表示對應中斷的搶占優先順序,每一位的復位值都是 0,當我們 把某一位設定為 1 的時候,這一位的優先順序就比其它位的優先順序高了。比如我們設定了 pt0 位為 1 後,當微控制...
NVIC中斷優先順序管理
1.stm32的中斷分組 每個中斷設定乙個搶占優先順序和乙個響應優先順序值,分組配置是在暫存器scb aircr中配置。注意 一般情況下,系統 執行過程中,只設定一次中斷優先順序分組 數值越小所代表的優先順序就越高。1 高優先順序的搶占優先順序可以打斷正在進行的低搶占優先順序中斷的。2 搶占優先順序...
NVIC中斷優先順序管理
1 參考資料 stm32f1開發指南 庫函式版本 4.5 小節 中斷優先順序分組管理 stm32中文參考手冊v10 第9章 中斷和事件 2 nvic中斷優先順序分組 cm3核心支援256個中斷,其中包含了16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定。stm32並沒有使用cm...