【轉】STM32中的搶佔優先級、響應優先級概念

STM32(Cortex-M3)中有兩個優先級的概念——搶佔式優先級和響應優先級,有人把響應優先級稱做'亞優先級'或'副優先級',每一箇中斷源都須要被指定這兩種優先級。函數

具備高搶佔式優先級的中斷能夠在具備低搶佔式優先級的中斷處理過程當中被響應,即中斷嵌套,或者說高搶佔式優先級的中斷能夠嵌套在低搶佔式優先級的中斷中。it

當兩個中斷源的搶佔式優先級相同時,這兩個中斷將沒有嵌套關係,當一箇中斷到來後,若是正在處理另外一箇中斷,這個後到來的中斷就要等到前一箇中斷處理完以後才能被處理。若是這兩個中斷同時到達,則中斷控制器根據他們的響應優先級高低來決定先處理哪個;若是他們的搶佔式優先級和響應優先級都相等,則根據他們在中斷表中的排位順序決定先處理哪個。 io

 

看了上面的介紹後,相信你們都明白了這裏面的關係了,總結下即是:搶佔式優先級>響應優先級>中斷表中的排位順序(其中「>」理解爲比較的方向)。 總結

正是由於每一箇中斷源都須要被指定這兩種優先級,就須要有相應的寄存器位記錄每一箇中斷的優先級;在Cortex-M3中定義了8個比特位用於設置中斷源的優先級,這8個比特位能夠有8種分配方式,以下: co

1.  全部8位用於指定響應優先級 block

2.  最高1位用於指定搶佔式優先級,最低7位用於指定響應優先級 參數

3.  最高2位用於指定搶佔式優先級,最低6位用於指定響應優先級 文章

4.  最高3位用於指定搶佔式優先級,最低5位用於指定響應優先級

5.  最高4位用於指定搶佔式優先級,最低4位用於指定響應優先級

6.  最高5位用於指定搶佔式優先級,最低3位用於指定響應優先級

7.  最高6位用於指定搶佔式優先級,最低2位用於指定響應優先級

8.  最高7位用於指定搶佔式優先級,最低1位用於指定響應優先級

以上即是優先級分組的概念,可是Cortex-M3容許具備較少中斷源時使用較少的寄存器位指定中斷源的優先級,所以STM32把指定中斷優先級的寄存器位減小到4位,這4個寄存器位的分組方式以下:

第0組:全部4位用於指定響應優先級

第1組:最高1位用於指定搶佔式優先級,最低3位用於指定響應優先級

第2組:最高2位用於指定搶佔式優先級,最低2位用於指定響應優先級

第3組:最高3位用於指定搶佔式優先級,最低1位用於指定響應優先級

第4組:全部4位用於指定搶佔式優先級

這裏便對於於文章最前提到的固件庫裏相關的函數了——NVIC_PriorityGroupConfig(u32  NVIC_PriorityGroup),函數的參數共有5種:

這個函數的參數(NVIC_PriorityGroup值)有下列5種:

NVIC_PriorityGroup_0 => 選擇第0組      //就是所有爲響應優先級,全部的中斷都不能搶佔其餘中斷。

NVIC_PriorityGroup_1 => 選擇第1組     //兩個搶佔優先級

NVIC_PriorityGroup_2 => 選擇第2組     //4個搶佔優先級

NVIC_PriorityGroup_3 => 選擇第3組     //8個搶佔優先級

NVIC_PriorityGroup_4 => 選擇第4組     //16個搶佔優先級,沒有響應優先級。全部中斷到來時均能按照優先級高低搶佔其餘優先級的中斷。

這其實也很好理解,好比選擇NVIC_PriorityGroup_1,那麼搶佔式優先級便佔一位,也就是說能夠有2^1個級別,能夠設置爲0和1,而響應優先級則佔3位,也就是說能夠有2^3個選擇,能夠設置爲0~7;總共來講就能夠區別>16種優先級(爲何大於而不是等於,想一想就應該明白了)

舉個例子吧,假如如今有4個外部中斷,還有一個EXTI9_5中斷,那麼若是選擇優先級分組爲第1組,那麼搶佔式優先級便只有兩種,5箇中斷就至少有3個在搶佔式優先級上是相同的優先級上,其餘兩個在令一優先級別。接着設置響應優先級能夠有8種選擇;假如如今同時有兩個搶佔式優先級別相同的中斷髮生,那麼處理的順序是誰的響應優先級高則誰優先進入中斷,另外這點是須要注意的,若是此時進入這個中斷以後又來了一個搶佔式優先級相同可是響應優先級更高的中斷,這時也是不會打斷已有的中斷的

相關文章
相關標籤/搜索