进入临界和退出临界是在ucos的学习过程中遇到的,第一次接触确实不好和前面所学的单片机知识联系起来。
UCOSIII中关中断方式进出临界的三件套:
CPU_SR_ALLOC(); /* Allocate storage for CPU status register */
:
CPU_CRITICAL_ENTER(); /* cpu_sr = CPU_SR_Save(); */
:
CPU_CRITICAL_EXIT(); /* CPU_SR_Restore(cpu_sr); */
:
UCOSIII中调度器上锁方式对后两者CPU_CRITICAL_ENTER();CPU_CRITICAL_EXIT(); 进行了再次的封装,封装中包含对任务调度器的加解锁操作和对任务加锁时间的计时,处于解锁状态时OSSchedLockNestingCtr为0。
OSSchedLockNestingCtr = (OS_NESTING_CTR)0; /* Clear the scheduling lock counter */
CPU_SR_Save
MRS R0, PRIMASK ; Set prio int mask to mask all (except faults)
CPSID I
BX LR
CPU_SR_Restore ; See Note #2.
MSR PRIMASK, R0
BX LR
进入临界有什么作用呢?
防止重要数据在非中断程序执行过程被中断服务程序意外修改。
全局变量,公共访问的资源,IO,外部硬件等等串口输入函数,printf函数,内存写入等都可能用到。
需要注意的是:1.临界区内不能使用任务挂起函数 2.空闲任务不能挂起 3.中断服务任务不能挂起