曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7912|回复: 0
打印 上一主题 下一主题

给调度器上锁和开锁

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2009-4-14 00:15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、给任务上锁--> 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() 。因为在调度器上锁期间,可能有什么事情发生了,并使一个更高优先级的任务进入就绪态。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 17:59 , Processed in 0.076852 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表