宏函數展開為:
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中斷屏蔽寄存器中。
