? ? ?在ARM cortex-M系列的CPU中,連接在一起的稱為NVIC(Nested Vectored Interrupt Controller),cortex-A/R系列的CPU中使用的GIC(Globe Interrupt Controller), 而在RISC-V中,也有相應的一套中斷控器稱為CLINT(Core-Local Interruptor)+CLIC/PLIC(platform-level interrupt controller)。
? ? ?由于篇幅有限,本文重點介紹NVIC與CLINT。NVIC的結構如下圖所示:
? ? ? ?
之所以稱之為嵌套中斷向量控制器,從“nested”二字可以看出該中斷具備中斷嵌套的,其實GIC/CLINT也支持中斷嵌套,但是NVIC最為特殊,因為它相比GIC/CLINT,一旦產生中斷后,CPU總中斷不會被硬件關閉,在中斷里面允許更高優先級中斷打斷,而GIC/CLINT觸發中斷時,CPU會關閉總中斷,在中斷處理過程中,不會響應任何中斷,包括更高優先級中斷,因為總中斷是關閉著的, 因此想要在GIC/CLINT上達到和NVIC相同的效果,軟件必須主動開啟總中斷。從“vectored”可以看出,NVIC 的中斷是向量類型的,原來中斷還有很多講究,分為向(矢)量類型和非向量類型。對于GIC來說,中斷則是非向量類型的。而作為ARM的后來者RISC-V則表現出了非常靈活的一面,既支持向量類型,也支持非向量類型,軟件可配。
? ? ?對于向量類型中斷而言,CPU一旦響應中斷,則會從 各個中斷編號的固定的地址入口跳轉運行,如下圖STM32中斷向量表所示。其中前1~15(SysTick_Handler)號向量中斷屬于cortex-M CPU特有的,任何芯片設計公司都會遵從這個約定,而15號以后的(WWDG_IRQHandler)則是各家芯片設計公司自己定義的一套。
?

?其中0~15號中斷編號也是RISC-V固定的,而15(有些可能更靠后,16/17)號以后的也是各家芯片設計公司自己定義的一套中斷。一個比較有意思的是cortex-M的15號中斷Sys tick和RISC-V的1/3號 S/Mtspend中斷非常類似,都是core timer,通常用在RTOS中的時間片調度。但是CLINT只能管理0~15號CPU core中斷,而15號以后的還需要依賴另外一個中斷控制器CLIC或PLIC(Platform ),如下圖所示, CLINT管理的是CPU core中斷,而PLIC(和GIC非常非常類似,支持多clustor,SMP)。比如某家芯片設計公司設計的SOC芯片使用的是RISC-V CPU,他們設計的SOC IP中斷請求信號(UART,IIC,SPI,TIMER等)只能連在PLIC或者CLIC上,而不能連在CLINT上, 因為CLINT是core上的中斷控制器。


總結:
? ? 通常使用RISC-V CPU的芯片設計公司在設計中低端芯片時,會使用CLINT + CLIC搭配方式,等價于ARM cortex-M系列的NVIC;在設計中高芯片時,會使用CLINT + PLIC搭配方式,等價于ARM的cortex-A系列GIC。
關注公眾號,加星標,回復1024獲取學習資料,每天進步一點點。
聲明:
本號原創、轉載的文章、圖片等版權歸原作者所有,如有侵權,請聯系刪除。
關注、點贊、在看、轉發,支持優質內容!
?