帝國新聞網(wǎng)站模板近一周的新聞大事熱點(diǎn)
壓縮中斷數(shù)目--二級中斷查找
- **1 中斷信號壓縮(第一級)??**
- **?2. 二級查找中斷(第二級)??**
- ?流程?:
- ?示例
- ?優(yōu)點(diǎn)?:
- ?適用場景?:
在基于arm的MCU子系統(tǒng)中,外設(shè)中斷只有240個,因此對于要是多的中斷,只能通過二級查找,這樣做的代價是不能做到及時系統(tǒng),因?yàn)橐ㄙM(fèi)相應(yīng)讀狀態(tài)寄存器的時間;
介紹壓縮中斷數(shù)目 + 二級查找中斷的實(shí)現(xiàn)方法?。
1 中斷信號壓縮(第一級)??
?方法?:將多個中斷信號進(jìn)行邏輯 ??"或"(OR)?? 合并,但保留各自的中斷狀態(tài)。
?硬件實(shí)現(xiàn)?:
assign combined_irq = irq_source1 | irq_source2 | … | irq_sourceN;
?RO(Read-Only)狀態(tài)寄存器?:
每個中斷源的狀態(tài)(是否觸發(fā))仍然會被記錄在 ?RO(只讀)寄存器? 中。
例如:
RO_STATUS_REG = { irq_sourceN, …, irq_source2, irq_source1 }
即使多個中斷被合并成一個 combined_irq,軟件仍然可以通過查詢 RO_STATUS_REG 來區(qū)分具體是哪個中斷觸發(fā)了。
?2. 二級查找中斷(第二級)??
?方法?:在 ?ISR(中斷服務(wù)例程)?? 中,通過查詢 ?CSR(Control & Status Register)?? 來區(qū)分具體的中斷源。
?流程?:
?CPU 收到 combined_irq,進(jìn)入 ?通用 ISR。
?ISR 讀取 RO_STATUS_REG,檢查哪些中斷源被觸發(fā)。
?根據(jù) RO_STATUS_REG 的值跳轉(zhuǎn)到對應(yīng)的子 ISR,處理具體的中斷。
?清除中斷狀態(tài)?(如果需要,寫 CSR 來清除中斷標(biāo)志)。
?示例
cc運(yùn)行復(fù)制c運(yùn)行復(fù)制void combined_irq_handler() {
uint32_t status = read_csr(RO_STATUS_REG); // 讀取中斷狀態(tài)
if (status & (1 << IRQ_SOURCE1)) {
irq_source1_handler(); // 處理 IRQ_SOURCE1
clear_irq(IRQ_SOURCE1); // 清除中斷標(biāo)志
}
if (status & (1 << IRQ_SOURCE2)) {
irq_source2_handler(); // 處理 IRQ_SOURCE2
clear_irq(IRQ_SOURCE2);
}
// … 其他中斷源
}
?優(yōu)點(diǎn)?:
?減少中斷線數(shù)量?(硬件節(jié)省)。
?保持靈活性?(軟件仍能區(qū)分具體中斷源)。
?適用于低優(yōu)先級中斷合并?(如多個外設(shè)共享一個中斷線)。
?適用場景?:
?SoC 設(shè)計(jì)?(多個外設(shè)共享中斷線)。
?嵌入式系統(tǒng)?(中斷資源有限,但需要區(qū)分多個事件)。
?RISC-V / ARM Cortex-M?(類似 NVIC 的中斷管理方式)。
這樣,既壓縮了中斷數(shù)目,又能在軟件層面精確識別中斷源,提高系統(tǒng)效率。