1、primask 寄存器
作用
- 屏蔽所有可屏蔽中断:
- 当
PRIMASK
设置为1
时,所有优先级大于0
的中断都会被屏蔽(禁止触发)。 - 优先级为
0
的中断仍然可以触发。 - 系统异常(如 NMI 和 HardFault)不会受到影响,仍然可以触发。
- 当
- 允许所有中断:
- 当
PRIMASK
设置为0
时,所有中断按照优先级正常触发。
- 当
PRIMASK用于禁止除NMI和HardFalut外的所有异常和中断,使用方法:
cpsid i ; //设置primask (禁止中断)
cpsie i ; //清除primask (使能中断)
也可以
movs r0,#1
msr primask r0; //将 1写入primask禁止所有中断
movs r0,#0
mar primask r0 //将0写入primask使能中断
2、faultmask寄存器
作用
- 屏蔽所有中断和异常:
- 当
FAULTMASK
设置为1
时,除了 NMI,所有其他中断和异常都会被屏蔽(禁止触发)。
- 当
- 允许所有中断和异常:
- 当
FAULTMASK
设置为0
时,所有中断和异常按照优先级正常触发。
- 当
faultmask寄存器连HardFault都可以屏蔽掉,使用方法和primask类似:
cpsid f ; //设置faultmask (禁止中断)
cpsie f ; //清除faultmask (使能中断)
或者:
movs r0,#1
msr faultmask r0; //将 1写入fault mask禁止所有中断
movs r0,#0
mar faultmask r0 //将0写入faultmask使能中断
3、basepri寄存器
basepri寄存器的做法更细腻,可以屏蔽优先级低于某个阈值的中断(中断优先级号越低代表的优先级越高),例如:要屏蔽优先级不高于0x60的中断:
mov r0,#0x60
msr basepri, r0
取消对中断的屏蔽,可以直接将basepri清零
mov r0,#0
mar basepri,r0
FreeRtos的开关中断就是通过basepri寄存器实现的
例如: portDISABLE_INTERRUPTS()
在这个中断里面打了个断点,debug了一下,当前系统中configMAX_SYSCALL_INTERRUPT_PRIORITY是0x10
然后portENABLE_INTERRUPTS()开中断
debug了一下