1.1 PRIMASK寄存器
PRIMASK寄存器可以屏蔽除NMI(不可屏蔽中断)与硬件fault(硬件错误)之外的所有异常。PRIMASK关中断的汇编代码如图 11所示,PRIMASK开中断的汇编代码如图 12所示。
图11 PRIMASK关中断
图12 PRIMASK开中断
1.2 FAULTMASK寄存器
FAULTMASK寄存器可以屏蔽除NMI之外的所有异常,包括硬件fault。使用FAULTMASK寄存起开关异常的汇编代码如图 13所示。
图 13 FAULTMASK开关异常
1.3 BASEPRI寄存器
BASEPRI寄存器是常规异常的优先级阈值寄存器,其可以对中断进行更细腻的控制,其可以屏蔽优先级低于某一阈值的中断。如图 14表示屏蔽优先级不高于0x60的中断。
图14 BASEPRI寄存器使用示例
2.SylixOS屏蔽中断2.1 SylixOS中断异常处理程序屏蔽中断
SylixOS中断异常处理程序使用BASEPRI寄存器,利用优先级来屏蔽中断和异常。因为系统是用SVC异常实现中断堆栈的压栈与出栈,如果屏蔽所有中断和异常则无法相应SVC异常。
系统在进入中断异常服务程序后,会设置BASEPRI寄存器,利用优先级屏蔽中断。如图 21所示。
图 21 中断异常服务程序屏蔽中断
2.2 archIntDisable屏蔽中断
archIntDisable函数同样使用优先级屏蔽中断。同中断异常处理程序一样,需要设置BASEPRI寄存器的值,如图 22所示。
图 22 archIntDisable屏蔽中断
应该注意的是如果tick中断优先级设置过高,导致BASEPRI寄存器无法屏蔽tick中断,则会破坏系统中断服务程序的原子性。tick中断会打断其他中断,同理其他设备中断优先级设置过高也会出现无法被屏蔽的情况。