uc/os-ii任务调度的锁定与解锁
2015-06-30 16:15
351 查看
调度器上锁函数
调度器上锁和开锁的实现原理是:对全局变量锁定嵌套计数器
调度器锁定函数
调度器解锁函数
由于
最后一点注意,
当一个任务调用
OSSchedlock()的功能是用于禁止任务调度,使任务保持对CPU的控制权。调度器开锁函数
OSSchedUnlock()的功能是解除对任务调度的禁止。
调度器上锁和开锁的实现原理是:对全局变量锁定嵌套计数器
OSLockNesting进行操作,
OSLockNesting跟踪
OS SchedLock()函数被调用的次数,允许嵌套深度达255层。调度器上锁即对变量
OSLockNesting进行加1操作,开锁即对变量
OSLockNesting进行减1操作。
调度器锁定函数
OSSchedLock()
void OSSchedLock (void) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0; #endif if (OSRunning == OS_TRUE) { /* Make sure multitasking is running */ OS_ENTER_CRITICAL(); if (OSIntNesting == 0) { /* Can't call from an ISR */ if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0 */ OSLockNesting++; /* Increment lock nesting level */ } } OS_EXIT_CRITICAL(); } }
调度器解锁函数
OSSchedUnlock()
由于
OSSchedUnlock()函数是被某任务调用的,在调度器上锁期间,可能会有事件发生并使一个更高优先级的任务进入就绪态,因此当
OSLockNesting减到零时,
OSSchedUnlock()必须调用
OSSched()函数,但是这种调用还必须满足另一个前提,也就是调用者不是中断服务子程序。
void OSSchedUnlock (void) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0; #endif if (OSRunning == OS_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) { /* See if scheduler is enabled and ... */ if (OSIntNesting == 0) { /* ... not in an ISR */ OS_EXIT_CRITICAL(); OS_Sched(); /* See if a HPT is ready */ } else { OS_EXIT_CRITICAL(); } } else { OS_EXIT_CRITICAL(); } } else { OS_EXIT_CRITICAL(); } } }
最后一点注意,
OSSchedLock()和
OSSchedUnlock()必须成对调用。上锁后必须要记住解锁。使用时务必非常谨慎,因为它们影响μC/OS-Ⅱ对任务的正常管理。
当一个任务调用
OSSchedLock()以后,应用程序不得使用任何系统调用将该任务挂起。因为调度器一旦上锁,系统就被锁住,其它任何任务都不能运行。这些系统调用包括
OSTaskSuspend(OS_PRIO_SELF)、
OSMboxPend()、
OSQPend()、
OSSemPend()、
OSTimeDly()和
OSTimeDly HMSM()等,直到
OSLockNesting回零为止。
相关文章推荐
- iOS开发拓展篇—应用之间的跳转和数据传递
- asp.net ToString()格式汇总
- Kickstart无人值守安装RHEL6.5
- Masonry源代码分析
- iOS开发拓展篇—xib中关于拖拽手势的潜在错误
- sed命令介绍2【此处应该加,不转不是程序员】
- DecalTessellation11 Sample
- C静态存储区栈堆的区别
- border:none 与border:0的区别
- CTO集体怒吼:我到底要不要继续写代码!
- Intrinsic Content Size of Multi-Line Text
- php 导出excel 常用方法
- 耦合与耦合性区别(二)
- 歌词效果制作
- 初识结构体
- 剑指offer: 不用加减乘除做加法
- iOS开发拓展篇—音频处理(音乐播放器6)
- 苹果发布ipa包的几种方式讲解
- DirectX 11 Tessellation (曲面细分)—什么是 Tessellation (曲面细分) ?它为什么能够起到如此重要的作用?
- 文章标题