【STM32】临界区进入退出宏 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()
宏函数展开为:
1 #define OS_CRITICAL_METHOD 3 2 3 #if OS_CRITICAL_METHOD == 3 4 #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} 5 #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} 6 #endif
OS_CPU_SR_Save() 和 OS_CPU_SR_Restore(cpu_sr) 在os_cpu_a.asm 中,为移植函数:
1 OS_CPU_SR_Save //PRIMASK缺省值0 中断屏蔽寄存器 =1 关闭所有可屏蔽异常 只剩下NMI和硬fault可以响应 2 MRS R0, PRIMASK //MRS指令用于将状态寄存器的内容传送到通用寄存器中 读取PRIMASK到R0中,R0为返回值 3 4 CPSID I //PRIMASK=1,关中断(NMI和硬fault可以响应 5 BX LR //返回 BX带状态切换的条状指令 6 7 OS_CPU_SR_Restore //读取R0到PRIMASK中,R0为参数 8 9 MSR PRIMASK, R0 10 BX LR
说明:
中断屏蔽寄存器
PRIMASK
这个寄存器只有一个位,置1后,将关闭所有可屏蔽中断的异常,只剩NMI和硬fault,默认值为0;
进入临界区,将关中断前的中断屏蔽状态保存到局部变量中。
退出临界区,将之前保存的中断屏蔽状态恢复到PRIMASK中断屏蔽寄存器中。