首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

ARM Cortex-M3/M4 中斷優先級搶占規則:組優先級與子優先級關係圖解

     編輯:關於C語言

ARM Cortex-M3/M4 中斷優先級搶占規則:組優先級與子優先級關係圖解

ARM Cortex-M3/M4 內核(STM32、NXP LPC、TI Stellaris等)採用 NVIC 中斷控制器,其優先級機制分為組優先級(搶占優先級)和子優先級(響應優先級)。本文用最簡潔的規則總結與場景圖解,徹底理清「誰能搶誰、誰搶不了誰」的核心邏輯。

核心搶占規則(三條鐵律)

  1. 組優先級不同:高組優先級可以搶占低組優先級(發生中斷嵌套)
  2. 組優先級相同:子優先級高低均不能搶占(同級不嵌套,按子優先級排隊)
  3. 組優先級相同且子優先級相同:按中斷向量表順序(硬件固定優先級)決定

規則對照表

場景當前執行中斷新到達中斷結果
組優先級不同組級 2組級 1 (更高)新中斷搶占,嵌套執行
組優先級不同組級 1組級 2 (更低)新中斷等待,不搶占
組優先級相同組級 1,子級 0組級 1,子級 1新中斷等待,不搶占(同組不嵌套)
組優先級相同組級 1,子級 1組級 1,子級 0新中斷等待,不搶占(子級高也不行)

關鍵認知糾偏

⚠ 常見誤區:「子優先級高可以打斷子優先級低的中斷」 → 完全錯誤!

事實:只有組優先級(搶占優先級)更高才能發生搶占/嵌套。子優先級僅在多個中斷同時待響應時決定先後順序,絕不引發嵌套。

優先級分組配置影響

Cortex-M3 提供 8 位優先級位,STM32 使用高 4 位,可配置 5 種分組:

// NVIC_PriorityGroupConfig 參數
NVIC_PriorityGroup_0: 0位組 | 4位子  → 1個組級,16子級  (無嵌套)
NVIC_PriorityGroup_1: 1位組 | 3位子  → 2個組級,8子級
NVIC_PriorityGroup_2: 2位組 | 2位子  → 4個組級,4子級  ★推薦平衡
NVIC_PriorityGroup_3: 3位組 | 1位子  → 8個組級,2子級
NVIC_PriorityGroup_4: 4位組 | 0位子  → 16個組級,1子級 (純搶占)

工程配置建議

  1. 統一分組:項目啟動初期調用一次 NVIC_PriorityGroupConfig,全程不再更改
  2. 推薦 Group 2:2位組優先級(4級)+ 2位子優先級(4級),兼顧嵌套層次與優先級細粒度
  3. 關鍵中斷高組級:電機控制、通信接收、實時采樣 → 組級 0 或 1(數值越小優先級越高)
  4. 普通中斷低組級:按鍵掃描、LED閃爍、定時統計 → 組級 2 或 3
  5. 同組內區分子級:同層級多個中斷(如多路UART)按重要性分配子級 0~3

代碼配置範例

// 系統初始化早期調用
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

// 關鍵中斷:USART1 接收 - 組級0,子級0(最高)
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);

// 普通中斷:定時器3 統計 - 組級2,子級1
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);

總結

ARM Cortex-M 系列中斷搶占規則的核心只有一句話:「看組優先級定生死,同組優先級不搶占,子優先級只排隊」。牢記這一鐵律,配合合理的分組配置(推薦 Group 2)與分層優先級分配策略,即可構建確定性、可靠的實時中斷系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved