ucos是利用禁止中断来保护临界段的。
ucos给我们提供了三种方法:
一:直接关中断和直接开中断。
二:先把原来的中断状态压入栈中,然后再关闭中断。恢复时直接从栈中返回原来存储的中断状态。
三:先保存原来的中断状态到一个变量中,然后再关闭中断。
在STM32F103上移植uC/OSII采用第三种方法,代码如下:
#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
再来看底层的汇编代码
OS_CPU_SR_Save
MRS R0, PRIMASK
; Set prio int m