primask, faultmask 和basepri
primask 當它置1 時,就關掉所有可遮蔽的異常,只剩下nmi和硬fault 可以響應。它的預設值是0,表示沒有關中斷。
faultmask 當它置1 時,只有nmi 才能響應,所有其它的異常,包括中斷和fault,通通閉嘴。它的預設值也是0,表示沒有關異常。
basepri 最多有9 位(由表達優先順序的位數決定)。它定義了被遮蔽優先順序的閾值。
當它被設成某個值後,所有優先順序號大於等於此值的中斷都被關(優先順序號越大,優先順序越低)。
但若被設成0,則不關閉任何中斷,0 也是預設值。
為了快速地開關中斷,cm3 還專門設定了一條cps 指令,有4 種用法
cpsid i ;primask=1, ;關中斷
cpsie i ;primask=0, ;開中斷
cpsid f ;faultmask=1, ;關異常
cpsie f ;faultmask=0 ;開異常
basepri暫存器
在更精巧的設計中,需要對中斷掩蔽進行更細膩的控制——
只掩蔽優先順序低於某一閾值的中斷——
它們的優先順序在數字上大於等於某個數。
那麼這個數儲存在**?就儲存在basepri中。不過,如果往basepri中寫0,
則另當別論——basepri將停止掩蔽任何中斷。
例如,如果你需要掩蔽所有優先順序不高於0x60的中斷,則可以如下程式設計:
mov r0, #0x60 ; pri >= 0x60 : masked
msr basepri, r0
如果需要取消basepri 對中斷的掩蔽,則示例**如下:
mov r0, #0
msr basepri, r0
另外,你還可以使用basepri_max這個名字來訪問basepri暫存器,它倆其實是同乙個暫存器。
但是當你使用這個名字時,會使用乙個條件寫操作。個中原因如下:
儘管它倆在硬體水平上是同乙個暫存器,但是生成的機器碼不一樣,從而硬體的行為也不同:
使用basepri時,可以任意設定新的優先順序閾值;
但是使用basepri_max時則「許進不許出」——只允許新的優先順序閾值比原來的那個在數值上更小,
也就是說,只能一次次地擴大掩蔽範圍,反之則不行。
Cortex M3異常筆記
異常型別 cortex m3編號為1 15對應系統異常,大於等於16的全部是核心級額外部中斷,除個別異常 復位,nmi,硬fault 的優先順序被定死之外,其他異常優先順序都是可以程式設計的。如果乙個發生的異常不能即刻響應,就稱它被 懸起 pending 少數異常時不能被懸起的。乙個異常被懸起的原因...
Cortex M3核心異常與外部中斷剖析
本文所有的測試是基於stm32f103測試的,因為stm32f103是cortex m3核心的晶元,而且恰好我手裡有這個晶元,所以就用它了。為了清晰明了,全部使用暫存器方式測試。在使用cortex m3系列核心晶元的時候必須掌握其中的nvic中斷向量控制器。必須搞清楚其中的每乙個細節。nvic管理2...
cortex m3核心中斷
m3核心中有乙個r w 中斷暫存器陣列 該陣列記錄了外部從0到239個中斷的名字pri 0 239,中斷暫存器位址,中斷的優先順序 8位,stm32用了其中的高4位,復位之後是0 如下 另外還有乙個應用中斷控制與復位暫存器r w aircr 這裡面記錄了優先順序分組方法 10 8 對應著前面陣列暫存...