1.Cortex M7的异常掩码寄存器

1.1 PRIMASK寄存器

    PRIMASK寄存器可以屏蔽除NMI(不可屏蔽中断)与硬件fault(硬件错误)之外的所有异常。PRIMASK关中断的汇编代码如图 11所示,PRIMASK开中断的汇编代码如图 12所示。

SylixOS屏蔽中断实现_SylixOS

图11 PRIMASK关中断

SylixOS屏蔽中断实现_SylixOS_02

图12 PRIMASK开中断

1.2 FAULTMASK寄存器

    FAULTMASK寄存器可以屏蔽除NMI之外的所有异常,包括硬件fault。使用FAULTMASK寄存起开关异常的汇编代码如图 13所示。

SylixOS屏蔽中断实现_SylixOS_03

图 13 FAULTMASK开关异常

1.3 BASEPRI寄存器

    BASEPRI寄存器是常规异常的优先级阈值寄存器,其可以对中断进行更细腻的控制,其可以屏蔽优先级低于某一阈值的中断。如图 14表示屏蔽优先级不高于0x60的中断。



SylixOS屏蔽中断实现_SylixOS_04

图14 BASEPRI寄存器使用示例

2.SylixOS屏蔽中断

2.1 SylixOS中断异常处理程序屏蔽中断

    SylixOS中断异常处理程序使用BASEPRI寄存器,利用优先级来屏蔽中断和异常。因为系统是用SVC异常实现中断堆栈的压栈与出栈,如果屏蔽所有中断和异常则无法相应SVC异常。

    系统在进入中断异常服务程序后,会设置BASEPRI寄存器,利用优先级屏蔽中断。如图 21所示。


SylixOS屏蔽中断实现_SylixOS_05

图 21 中断异常服务程序屏蔽中断


2.2 archIntDisable屏蔽中断


    archIntDisable函数同样使用优先级屏蔽中断。同中断异常处理程序一样,需要设置BASEPRI寄存器的值,如图 22所示。

SylixOS屏蔽中断实现_SylixOS_06

图 22 archIntDisable屏蔽中断


    应该注意的是如果tick中断优先级设置过高,导致BASEPRI寄存器无法屏蔽tick中断,则会破坏系统中断服务程序的原子性。tick中断会打断其他中断,同理其他设备中断优先级设置过高也会出现无法被屏蔽的情况。