#進入臨界段方式:OS_CRITICAL_METHOD==?
//OS_CRITICAL_METHOD = 1 :
//OS_CRITICAL_METHOD = 2 :
//OS_CRITICAL_METHOD = 3 :
#define OS_CRITICAL_METHOD 3
#if OS_CRITICAL_METHOD == 3
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
#endif
##方式1:
直接用處理器開關中斷指令開關中斷,這種沒有現場保護的方式造成無法進行臨界區嵌套,如果有兩層臨界區,那麼裏層退出保護時候直接開了中斷,而外層的臨界區還沒有結束。(關幾次中斷都是關中斷,開一次中斷就全開了)
##方式2:
這種方式先把中斷狀態壓入堆棧保存起來,然後關中斷。恢復中斷時,直接恢復棧中的中斷狀態。但是很少使用,看了下面這篇博文的理解是編譯器很可能無法很好的處理在臨界段內使用堆棧造成的衝突。
http://www.cnblogs.com/shafei/p/3524919.html?utm_source=tuicool&utm_medium=referral
但是又產生了新的疑惑,中斷嵌套等完好的堆棧操作對於編譯器是怎麼優化處理的。待解決
##方式3:
把中斷狀態保存在一個局部變量中,當退出臨界態時候直接恢復局部變量,但是需要內核支持對寄存器的直接讀寫。
#OS_CPU_SR_Save()與OS_CPU_SR_Restore()
OS_CPU_SR_Save
MRS R0, PRIMASK ;把PRIMASK的裝填讀取到R0中。
CPSID I ;關中斷
BX LR ;返回
OS_CPU_SR_Restore
MSR PRIMASK, R0 ;把R0的值寫入到寄存器PRIMASK中
BX LR ;返回
CPSID CPSIE 快速的開關中斷指令
CPSID CPSIE 用於快速的開關中斷。UCOSII中在
指令 參數 寄存器值 行爲
CPSID I PRIMASK=1, ;關中斷
CPSIE I PRIMASK=0, ;開中斷
CPSID F FAULTMASK=1, ;關異常
CPSIE F FAULTMASK=0, ;開異常
注:I:IRQ ; F:FIQ。在Cortex內核中沒有FIQ中斷,都按IRQ處理。