您的位置:首页 > 其它

uc/os-ii任务调度的锁定与解锁

2015-06-30 16:15 351 查看
调度器上锁函数
OSSchedlock()
的功能是用于禁止任务调度,使任务保持对CPU的控制权。调度器开锁函数
OSSchedUnlock()
的功能是解除对任务调度的禁止。

调度器上锁和开锁的实现原理是:对全局变量锁定嵌套计数器
OSLockNesting
进行操作,
OSLockNesting
跟踪
OS SchedLock()
函数被调用的次数,允许嵌套深度达255层。调度器上锁即对变量
OSLockNesting
进行加1操作,开锁即对变量
OSLockNesting
进行减1操作。

调度器锁定函数
OSSchedLock()


void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
OS_CPU_SR  cpu_sr = 0;
#endif

if (OSRunning == OS_TRUE) {                  /* Make sure multitasking is running                  */
OS_ENTER_CRITICAL();
if (OSIntNesting == 0) {                 /* Can't call from an ISR                             */
if (OSLockNesting < 255u) {          /* Prevent OSLockNesting from wrapping back to 0      */
OSLockNesting++;                 /* Increment lock nesting level                       */
}
}
OS_EXIT_CRITICAL();
}
}


调度器解锁函数
OSSchedUnlock()


由于
OSSchedUnlock()
函数是被某任务调用的,在调度器上锁期间,可能会有事件发生并使一个更高优先级的任务进入就绪态,因此当
OSLockNesting
减到零时,
OSSchedUnlock()
必须调用
OSSched()
函数,但是这种调用还必须满足另一个前提,也就是调用者不是中断服务子程序。

void  OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
OS_CPU_SR  cpu_sr = 0;
#endif
if (OSRunning == OS_TRUE) {                            /* Make sure multitasking is running        */
OS_ENTER_CRITICAL();
if (OSLockNesting > 0) {                           /* Do not decrement if already 0            */
OSLockNesting--;                               /* Decrement lock nesting level             */
if (OSLockNesting == 0) {                      /* See if scheduler is enabled and ...      */
if (OSIntNesting == 0) {                   /* ... not in an ISR                        */
OS_EXIT_CRITICAL();
OS_Sched();                            /* See if a HPT is ready                    */
} else {
OS_EXIT_CRITICAL();
}
} else {
OS_EXIT_CRITICAL();
}
} else {
OS_EXIT_CRITICAL();
}
}
}


最后一点注意,
OSSchedLock()
OSSchedUnlock()
必须成对调用。上锁后必须要记住解锁。使用时务必非常谨慎,因为它们影响μC/OS-Ⅱ对任务的正常管理。   

当一个任务调用
OSSchedLock()
以后,应用程序不得使用任何系统调用将该任务挂起。因为调度器一旦上锁,系统就被锁住,其它任何任务都不能运行。这些系统调用包括
OSTaskSuspend(OS_PRIO_SELF)
OSMboxPend()
OSQPend()
OSSemPend()
OSTimeDly()
OSTimeDly HMSM()
等,直到
OSLockNesting
回零为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: