標籤:
通常異常包括一些系統異常,以及中斷。
異常類型
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),所以其實他們的優先順序都是一樣的,並且相互不搶佔。
使用者可以配置其他可程式化優先順序,不要求是
ARM Cortex-M3 異常優先順序以及CMSIS RTOS RTX的中斷優先順序