#if OS_CRITICAL_METHOD == 3 #define OS_ENTER_CRITICAL() do{cpu_sr=CriticalEnter();}while(0) #define OS_EXIT_CRITICAL() do{CriticalExit(cpu_sr);}while(0) #endif
#define CRITICAL() for(OS_CPU_SR cpu_sr=CriticalEnter(),__ToDo=1; __ToDo;__ToDo=0,CriticalExit(cpu_sr))
OS_CPU_SR CriticalEnter(void) { asm( "mrs r0,primask
" "cpsid i
" "bx lr
" ); return 1; }
void CriticalExit(OS_CPU_SR cpu_sr) { asm( "msr primask,r0
" ); }
“方法3”,的优点: 1.临界段写法更加灵活方便。 除了一般写法,还可以 CRITICAL() { ……………… }
2.cpu_sr是一个参数,含义可以自己定义。 为软非屏蔽中断(不受操作系统管理中断)提供了接口。 cpu_sr=CriticalEnter() //保存系统管理中断状态,关闭系统管理中断 CriticalExit(cpu_sr) //恢复系统管理中断状态
这样非系统管理中断可以不受临界段影响。
另外,并不是不能嵌套。嵌套只需cpu_sr作用域不同就行了。 更方便的嵌套是: CRITICAL() { CRITICAL() { } } 还可以 CRITICAL() { NONCRITICAL() { //非临界段 } }
|