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 : maskedMSR BASEPRI, R0如果需要取消BASEPRI 对中断的掩蔽,则示例代码如下:MOV R0, #0MSR BASEPRI, R0另外,你还可以使用BASEPRI_MAX这个名字来访问BASEPRI寄存器,它俩其实是同一个寄存器。
但是当你使用这个名字时,会使用一个条件写操作。个中原因如下:尽管它俩在硬件水平上是同一个寄存器,但是生成的机器码不一样,从而硬件的行为也不同:使用BASEPRI时,可以任意设置新的优先级阈值;
但是使用BASEPRI_MAX时则“许进不许出”——只允许新的优先级阈值比原来的那个在数值上更小,也就是说,只能一次次地扩大掩蔽范围,反之则不行。