1、primask 寄存器
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寄存器连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了一下