jxndsfss

导航

【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中断屏蔽寄存器中。

posted on 2019-04-22 09:21  jxndsfss  阅读(2736)  评论(0编辑  收藏  举报