中斷的分類:從來源到優(yōu)先級(jí)的維度劃分
嵌入式系統(tǒng)中的中斷類型多樣,按 “事件來源”“可屏蔽性”“處理機(jī)制” 等維度可分為不同類別,不同類型的中斷在硬件實(shí)現(xiàn)、軟件配置與應(yīng)用場(chǎng)景上存在顯著差異,理解這些差異是中斷選型與配置的基礎(chǔ)。
(一)按事件來源:外部中斷與內(nèi)部中斷
外部中斷的事件來源是 MCU 外部的外設(shè)或引腳,通常與 “外部輸入信號(hào)” 相關(guān),需要通過 GPIO 引腳或?qū)S媒涌诮邮胀獠渴录|發(fā)。最典型的外部中斷是 “GPIO 外部中斷”—— 當(dāng) GPIO 引腳的電平發(fā)生預(yù)設(shè)變化(高電平觸發(fā)、低電平觸發(fā)、上升沿觸發(fā)、下降沿觸發(fā)、雙邊沿觸發(fā))時(shí),觸發(fā)中斷,如按鍵按下(引腳電平從高變低,下降沿觸發(fā))、傳感器檢測(cè)到目標(biāo)(引腳從低變高,上升沿觸發(fā))。GPIO 外部中斷的優(yōu)勢(shì)是靈活,可通過配置不同引腳與觸發(fā)方式,適配多種外部設(shè)備;缺點(diǎn)是需要占用 GPIO 資源,且多個(gè)外部設(shè)備可能共享同一中斷線(如 STM32 的 GPIO 端口按組共享中斷,PA0-PG0 共享 EXTI0 中斷),需在 ISR 中判斷具體是哪個(gè)引腳觸發(fā)的中斷。
除了 GPIO 外部中斷,還有 “專用外部設(shè)備中斷”—— 由外部專用芯片(如觸摸屏控制器、ADC 芯片)通過特定總線(如 SPI、I2C、中斷線)向 MCU 發(fā)送中斷請(qǐng)求,例如觸摸屏檢測(cè)到觸摸時(shí),通過中斷線通知 MCU 讀取觸摸坐標(biāo);ADC 芯片完成一次采樣時(shí),通過中斷線通知 MCU 讀取采樣結(jié)果。這類中斷的優(yōu)勢(shì)是無需 MCU 持續(xù)輪詢外部芯片狀態(tài),降低功耗與算力消耗。
內(nèi)部中斷的事件來源是 MCU 內(nèi)部的模塊,無需外部信號(hào)觸發(fā),通常與 “內(nèi)部狀態(tài)變化” 相關(guān),如定時(shí)器中斷、外設(shè)中斷、異常中斷。定時(shí)器中斷是最常用的內(nèi)部中斷 —— 當(dāng)定時(shí)器的計(jì)數(shù)達(dá)到設(shè)定值(如定時(shí) 1ms)或計(jì)數(shù)溢出時(shí),觸發(fā)中斷,用于實(shí)現(xiàn)精準(zhǔn)定時(shí)(如 LED 閃爍、電機(jī) PWM 控制、數(shù)據(jù)采樣周期控制)。例如,STM32 的 TIM2 定時(shí)器可配置為定時(shí) 1ms 中斷,每 1ms 觸發(fā)一次 ISR,在 ISR 中更新系統(tǒng)時(shí)間或檢查傳感器狀態(tài)。
外設(shè)中斷是內(nèi)部中斷的另一重要類別,由 MCU 內(nèi)部的通信或功能外設(shè)(如串口 USART、SPI、I2C、DMA、USB)觸發(fā),用于處理外設(shè)的狀態(tài)變化,如串口接收數(shù)據(jù)就緒、SPI 發(fā)送完成、DMA 傳輸完成、USB 設(shè)備連接。例如,串口 USART 的接收中斷(RXNE)在接收緩沖區(qū)有數(shù)據(jù)時(shí)觸發(fā),確保 MCU 及時(shí)讀取數(shù)據(jù),避免緩沖區(qū)溢出導(dǎo)致數(shù)據(jù)丟失;DMA 傳輸完成中斷在 DMA 將數(shù)據(jù)從內(nèi)存?zhèn)鬏數(shù)酵庠O(shè)(如 SPI 發(fā)送)后觸發(fā),通知 MCU 進(jìn)行后續(xù)處理(如更新發(fā)送緩沖區(qū))。
異常中斷(Exception)是一類特殊的內(nèi)部中斷,通常與 “系統(tǒng)故障” 或 “特殊指令” 相關(guān),優(yōu)先級(jí)高于普通中斷,部分異常甚至不可屏蔽。例如,ARM Cortex-M 系列的 “HardFault” 異常(硬件故障)在發(fā)生內(nèi)存訪問錯(cuò)誤(如空指針訪問)、未定義指令、總線錯(cuò)誤時(shí)觸發(fā),用于故障診斷與系統(tǒng)保護(hù);“SysTick” 異常(系統(tǒng)滴答定時(shí)器)是內(nèi)核自帶的定時(shí)器中斷,常用于生成操作系統(tǒng)的時(shí)間片,實(shí)現(xiàn)任務(wù)調(diào)度;“SWI” 異常(軟件中斷)由執(zhí)行 SWI 指令觸發(fā),用于用戶程序調(diào)用內(nèi)核函數(shù)或操作系統(tǒng)服務(wù)。
(二)按可屏蔽性:可屏蔽中斷與不可屏蔽中斷
可屏蔽中斷(Maskable Interrupt) 是指可通過軟件配置(如中斷使能位、全局中斷使能位)禁止或允許的中斷,占嵌入式中斷的絕大多數(shù),如 GPIO 中斷、定時(shí)器中斷、串口中斷??善帘沃袛嗟暮诵奶攸c(diǎn)是 “靈活性”—— 用戶可根據(jù)需求開啟或關(guān)閉特定中斷,例如在處理重要數(shù)據(jù)(如傳感器校準(zhǔn)參數(shù)寫入 Flash)時(shí),關(guān)閉所有可屏蔽中斷,避免中斷打斷寫入過程導(dǎo)致數(shù)據(jù)損壞;在數(shù)據(jù)處理完成后,重新開啟中斷,恢復(fù)正常響應(yīng)。
不可屏蔽中斷(NMI, Non-Maskable Interrupt) 是指無論全局中斷使能位是否置位,都能強(qiáng)制觸發(fā)的中斷,優(yōu)先級(jí)最高,僅用于處理 “危及系統(tǒng)安全” 的緊急事件,如電源欠壓、硬件故障、外部緊急復(fù)位。NMI 的硬件設(shè)計(jì)通常具有 “不可屏蔽性”—— 中斷請(qǐng)求信號(hào)直接連接到 MCU 內(nèi)核,繞過常規(guī)的中斷屏蔽邏輯;軟件上也無法通過常規(guī)指令禁止 NMI(部分芯片支持 NMI 屏蔽,但需特殊權(quán)限且不推薦使用)。例如,工業(yè)控制系統(tǒng)中,當(dāng)檢測(cè)到電源電壓低于閾值時(shí),觸發(fā) NMI,在 NMI 的 ISR 中緊急保存關(guān)鍵數(shù)據(jù)(如生產(chǎn)進(jìn)度、設(shè)備狀態(tài))到 Flash,避免數(shù)據(jù)丟失;汽車電子中,當(dāng)檢測(cè)到安全氣囊觸發(fā)信號(hào)時(shí),觸發(fā) NMI,立即執(zhí)行安全氣囊展開控制,無需等待其他中斷處理。
(三)按處理機(jī)制:向量中斷與非向量中斷
向量中斷(Vectored Interrupt) 是指每個(gè)中斷都有獨(dú)立的 “中斷向量”(即 ISR 入口地址),中斷控制器可直接根據(jù)中斷類型找到對(duì)應(yīng)的 ISR 地址,無需 MCU 查詢判斷,響應(yīng)速度快,是現(xiàn)代嵌入式 MCU 的主流中斷機(jī)制。向量中斷的核心是 “中斷向量表”—— 在 MCU 的存儲(chǔ)空間中,有一塊專門的區(qū)域存儲(chǔ)所有中斷的 ISR 入口地址,每個(gè)中斷對(duì)應(yīng)一個(gè)固定的向量地址(如 STM32 的中斷向量表中,EXTI0 中斷對(duì)應(yīng) 0x00000010 地址,TIM2 中斷對(duì)應(yīng) 0x0000002C 地址)。當(dāng)中斷觸發(fā)時(shí),中斷控制器會(huì)自動(dòng)根據(jù)中斷類型,從向量表中讀取對(duì)應(yīng)的 ISR 地址,直接跳轉(zhuǎn)執(zhí)行,無需額外的查詢代碼,響應(yīng)延遲可控制在微秒級(jí)。
非向量中斷(Non-Vectored Interrupt) 是指多個(gè)中斷共享一個(gè) ISR 入口地址,中斷觸發(fā)后,MCU 需要在 ISR 中通過查詢 “中斷狀態(tài)寄存器”,判斷具體是哪個(gè)中斷事件觸發(fā),再執(zhí)行對(duì)應(yīng)的處理邏輯。非向量中斷的優(yōu)勢(shì)是硬件實(shí)現(xiàn)簡(jiǎn)單(無需獨(dú)立向量表),但響應(yīng)速度慢 —— 查詢過程會(huì)增加中斷延遲,且中斷數(shù)量越多,查詢時(shí)間越長(zhǎng),僅在早期 8 位 MCU(如 Intel 8051)或簡(jiǎn)單控制場(chǎng)景中使用。例如,8051 單片機(jī)的外部中斷 0 與外部中斷 1 共享部分查詢邏輯,ISR 中需通過查詢 TCON 寄存器的 IT0、IE0 位,判斷是否為外部中斷 0 觸發(fā)。