练习

来源:互联网 发布:jsp电子商务网站源码 编辑:程序博客网 时间:2024/04/29 07:15
给调度器上锁函数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的控制权,此时,用户可以使用禁止调度器函数。

0 0
原创粉丝点击