概述
给调度器上锁函数OSSchedlock()(程序清单L3.9)用于禁止任务调度,直到任务完成后调用给调度器开锁函数OSSchedUnlock()为止,(程序清单L3.10)。调用OSSchedlock()的任务保持对CPU的控制权,尽管有个优先级更高的任务进入了就绪态。然而,此时中断是可以被识别的,中断服务也能得到(假设中断是开着的)。OSSchedlock()和OSSchedUnlock()必须成对使用。变量OSLockNesting跟踪OSSchedLock()函数被调用的次数,以允许嵌套的函数包含临界段代码,这段代码其它任务不得干预。μC/OS-Ⅱ允许嵌套深度达255层。当OSLockNesting等于零时,调度重新得到允许。函数OSSchedLock()和OSSchedUnlock()的使用要非常谨慎,因为它们影响μC/OS-Ⅱ对任务的正常管理。
当OSLockNesting减到零的时候,OSSchedUnlock()调用OSSched[L3.10(2)]。OSSchedUnlock()是被某任务调用的,在调度器上锁的期间,可能有什么事件发生了并使一个更高优先级的任务进入就绪态。
调用OSSchedLock()以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用。也就是说,用户程序不得调用OSMboxPend()、OSQPend()、OSSemPend()、OSTaskSuspend(OS_PR1O_SELF)、OSTimeDly()或OSTimeDlyHMSM(),直到OSLockNesting回零为止。因为调度器上了锁,用户就锁住了系统,任何其它任务都不能运行。
当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时(见第6章 任务间通讯和同步),用户不希望高优先级的任务在邮箱、队列和信号量没有得到消息之前就取得了CPU的控制权,此时,用户可以使用禁止调度器函数。
程序清单 L3.9 给调度器上锁 |
void OSSchedLock (void) |
{ |
if (OSRunning == TRUE) { |
OS_ENTER_CRITICAL(); |
OSLockNesting++; |
OS_EXIT_CRITICAL(); |
} |
} |
程序清单 L3.10 给调度器开锁. |
void OSSchedUnlock (void) |
{ |
if (OSRunning == TRUE) { |
OS_ENTER_CRITICAL(); |
if (OSLockNesting > 0) { |
OSLockNesting--; |
if ((OSLockNesting | OSIntNesting) == 0) { (1) |
OS_EXIT_CRITICAL(); |
OSSched(); (2) |
} else { |
OS_EXIT_CRITICAL(); |
} |
} else { |
OS_EXIT_CRITICAL(); |
} |
} |
} |
最后
以上就是负责萝莉为你收集整理的给调度器上锁和开锁(Locking and UnLocking the Scheduler)的全部内容,希望文章能够帮你解决给调度器上锁和开锁(Locking and UnLocking the Scheduler)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复