通常異常包括一些系統異常,以及中斷。
異常類型
Cortex-M3處理器支持多種類型的異常:
- RESET, NMI, HardWare Fault;
- PSV,SVC等可編程中斷;
- 其他的可編程中斷,例如timer,GPIO等。
其中第1類異常的優先級是固定,不可改變的。其他都是可以修改的。
Cortex-M3處理器提供了PRIMASK選項,用來屏蔽所有可編程的中斷;提供了FAULTMASK來屏蔽HardWare Fault和所有可屏蔽中斷。
異常優先級
Cortex-M3處理器支持NVIC的中斷處理,也就是說中斷嵌套處理。中斷的優先級由1個8bit寄存器確定,但ARM芯片廠商在實現的時候通常實現了其中的幾個bit而已。ARM要求最少實現3個bit。從寄存器的bit 7開始從高往低。
而這幾個bit還會分為搶占優先級,普通優先級。見下圖:



搶占優先級,是指如果兩個中斷的普通優先級一樣,在搶占優先級低的中斷A執行時,如果搶占優先級高的中斷B發生了,那么就會中斷B就會搶占中斷A,處理器開始執行中斷B的ISR。
普通優先級,是指如果兩個中斷的搶占優先級一樣,那么中斷之間是不會發生搶占的,也就是一個中斷不會打斷另外一個中斷的處理。但是如果兩個中斷同時發生了,普通優先級高的,先處理。
數字越小,優先級越高。
如果兩個中斷搶占優先級,普通優先級全部一樣,那么中斷號小的中斷,會先處理,但還是不會發生搶占。
異常向量
根據cortex-M3的技術文檔描述,異常向量"vector tables"是放在從地址0x4開始的地方,地址0x0處放的是MSP的初始值。
如下所示,異常向量對應的地址處直接放置的異常處理函數地址,而不是跳轉指令。
CMSIS RTOS RTX的中斷優先級
由於ARM公司后來搞了CMSIS,也就是在CMSIS層增加了對RTOS的支持。所以很多種RTOS都可以依靠CMSIS RTOS API來實現。
而ARM也把Keil RTX操作系統,也改裝成支持CMSIS了,就叫CMSIS RTOS RTX了。
在RTX里面,systick timer/SVC/PSV的中斷優先級都是0xFF(具體對應到硬件,要看芯片廠商實現了8bit優先級的幾個bit),所以其實他們的優先級都是一樣的,並且相互不搶占。
用戶可以配置其他可編程優先級,不要求是