|
一、给任务上锁--> OSSchedLock()
| | 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() 。因为在调度器上锁期间,可能有什么事情发生了,并使一个更高优先级的任务进入就绪态。
|
|