曲径通幽论坛

标题: 给调度器上锁和开锁 [打印本页]

作者: beyes    时间: 2009-4-14 00:15
标题: 给调度器上锁和开锁
一、给任务上锁--> OSSchedLock()
 
#if OS_SCHED_LOCK_EN > 0
void  OSSchedLock (void)
{
#if
    OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif  
  
  
    if (OSRunning == TRUE) {                     /* 确保多任务已经启动,调用过OSStart() */
        OS_ENTER_CRITICAL();
        if (OSLockNesting < 255) {               /*OSLockNesting 为字节变量,确认嵌套没越界(255) */
            OSLockNesting++;                     /* 锁嵌套+1 */
        }
        OS_EXIT_CRITICAL();
    }
}
#endif
说明
调用 OSSchedLock() 后,用户不能再调用可能会使当前任务挂起的系统功能函数,如:OSFlagPend()
OSMboxPend(), OSMuitexPend(), OSQPend(), OSSemPend(), OSTaskSuspend( OS_PRIO_SELF ),
OSTimeDly(), OSTimeDlyHMSM(), 直到 OSLockNesting 回 0 为止。因为,OSSchedLock() 给调度器上锁,不让其它任务运行,假如运行中的任务再挂起,就无法切换任务,因此会锁住了系统。
二、给任务上锁---> OSSchedUnlock()
#if OS_SCHED_LOCK_EN > 0
void  OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif  
  
  
    if (OSRunning == 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) && (OSIntNesting == 0)) { /* See if sched. enabled and not an ISR */
                OS_EXIT_CRITICAL();
                OS_Sched();                                    /* See if a HPT is ready                */
            } else {
                OS_EXIT_CRITICAL();
            }
        } else {
            OS_EXIT_CRITICAL();
        }
    }
}
#endif
说明
在 OSLockNesting 还没回0 或者 仍处于中断嵌套中( OSIntNesting != 0 ),那么将不得调用 OS_Sched() 。
所有嵌套的函数执行完后,希望允许调度器运行,于是在任务级调用一次  OSSchedUnlock() 。因为在调度器上锁期间,可能有什么事情发生了,并使一个更高优先级的任务进入就绪态。





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2