给调度器上锁和开锁(Locking and UnLocking the Scheduler)
来源:互联网 发布:无线直发器淘宝 编辑:程序博客网 时间:2024/05/17 06:09
给调度器上锁函数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 Byte Ranges in Files
- 调度器(scheduler)
- 调度器 Scheduler
- Yarn 调度器Scheduler
- 调度器 Scheduler
- gdb scheduler-locking
- Mysql Linux安装和事件调度器(Event Scheduler)
- Double-checked locking and the Singleton pattern
- Double-checked locking and the Singleton pattern
- Double-checked locking and the Singleton pattern
- Double-checked locking and the Singleton pattern
- Double-checked locking and the Singleton pattern
- SMS SCHEDULER 短信调度器
- cocos2d-x 调度器(scheduler)
- Yarn 调度器Scheduler详解
- maven项目修改项目名称,修改文件目录
- easymock快速入门
- 关于新浪微博粉丝关注分享消息队列等架构的调研资料
- 单元测试代码
- 点、线导出含高程值的表格
- 给调度器上锁和开锁(Locking and UnLocking the Scheduler)
- Base64编码原理与应用
- 反射学习03
- Leetcode #258 Add Digits
- 九度OJ-1202:排序
- java--接口
- const, let和var的作用域及闭包
- 保存图片到沙盒
- 转换discuz X2.5表引擎为InnoDB