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