13465|6

849

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

OSSchedLock()函数透析 [复制链接]

最近网友问到OSSchedLock()这个函数的问题,当时我也搞得半昏迷状态。
    这个函数又叫上锁函数,如果在一个任务里面调用了上锁函数,那么OSSched()这个任务切换函数就不会执行也就是说不会进任务调度。

调用OSSchedLock()以后,用户的应用程序不得使用任何能将现行任务挂起的系统调用。也就是说,用户程序不得调用OSMboxPend()、OSQPend()、OSSemPend()、OSTaskSuspend(OS_PR1O_SELF)、OSTimeDly()或OSTimeDlyHMSM(),直到OSLockNesting回零为止
因为调度器上了锁,用户就锁住了系统,任何其它任务都不能运行。


本人有点不明白 ,系统被当前任务锁住了,那么在这段期间内,就只能运行当前的任务,而且是不断执行当前的任务吗?
如果当前任务正在执行的过程中,遇到了系统异常或外部中断又会发生什么情况喃?会将OSLockNesting强制转换为0吗??
。。。。请教高人。。。。。

最新回复

回复 楼主 常见泽1 的帖子 因为任务调度时一般都是通过OSTIMEDLY()来实现。在这个函数中会对当前的任务执行挂起。同时查看任务调度表中是否有优先级合适的就绪任务。如果当前任务运行时调用OSSchedLock()给调度器上锁,这样再调用OSTIMEDLY()时就会把当前任务挂起。但由于调度器上锁而不能使其他任务得到CPU的使用权。这样除了中断意外就没有任务可以运行了。除非中断中对这种情况有处理。我想调用其余两个函数也是同OSTIMEDLY()一样的道理了! 不知道这样说能否可以理解 这是版主的回复  详情 回复 发表于 2011-4-13 08:56
点赞 关注
个人签名只有想不到,没有做不到。

回复
举报

849

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
原帖由 shilaike 于 2011-4-6 11:46 发表
最近网友问到OSSchedLock()这个函数的问题,当时我也搞得半昏迷状态。
    这个函数又叫上锁函数,如果在一个任务里面调用了上锁函数,那么OSSched()这个任务切换函数就不会执行也就是说不会进任务调度。

调用O ...

现在理解一点,上锁了任务是可以中断,当中断返回时又要判断OSLockNesting是否为0,如果不为0说明系统仍被锁,直接退出中断。如果OSLockNesting为0说明系统未被锁,CPU进入任务就绪表查找优先级最高的任务。

但是有一点不明白,这个OSLockNesting这个变量的执行标准是什么喃??
先翻一下手册,再来贴。。。。。
  哪位坛友耍得好的可以上点东西。。。。
 
个人签名只有想不到,没有做不到。
 

回复

862

帖子

2

TA的资源

纯净的硅(初级)

板凳
 
怎么说,看上锁函数的代码,里边一条最重要的指令是:OSLockNesting++,跟中断类似(中断是给OSIntNesting变量加1)。个人感觉一个任务调用了调度加锁的函数后,调度器不会工作,因为OSLockNesting不为零。执行中断的时候,任务调度执行的时候,不会执行获取就绪任务列表里优先级最高的任务的“指令”,所以跟任务是否调度加锁,从某种意义上来说,没影响。
    不过看书上锁加锁函数可以嵌套,并且可达255级的深度,是否也是在自己的任务中,在函数执行过程中,的加锁、加锁、解锁、解锁...这样成对的出现,逐级加锁,逐级解锁......很难想象什么样的情况,需要这么用.......

[ 本帖最后由 wo4fisher 于 2011-4-6 13:32 编辑 ]
 
个人签名水不撩不知深浅 人不拼怎知输赢
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

4
 
原帖由 shilaike 于 2011-4-6 11:46 发表
最近网友问到OSSchedLock()这个函数的问题,当时我也搞得半昏迷状态。
    这个函数又叫上锁函数,如果在一个任务里面调用了上锁函数,那么OSSched()这个任务切换函数就不会执行也就是说不会进任务调度。

调用O ...

下面贴出这个函数的代码 :
#if OS_SCHED_LOCK_EN > 0   //这是个全局变量,在Os_cfg.h中定义
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
   
   
    if (OSRunning == TRUE) {                     /* 确认是否是多个任务在运行              */
        OS_ENTER_CRITICAL();
        if (OSLockNesting < 255) {               /* OSLockNesting最大值为255     */
            OSLockNesting++;                     /* Increment lock nesting level                       */
        }
        OS_EXIT_CRITICAL();
    }
}
#endif
从上锁函数我们可以看出,这个函数就是一个确定任务上锁级数的函数,也就是为OSLockNesting这个变量更新取值的函数。
如果我们在任务里面执行一次该函数,则上锁级数就是1。我们也可以知道,上锁函数的深度最大值为255,我们可以通过上锁到255,到逐级解锁来实现不同的应用。
但这个过程,本人从来没有实现过。
并且补充一点,在上锁函数执行后,若任务遇到中断,则中断函数的执行会为OSIntNesting变量加1,所以上锁函数执行后,CPU一直处于当前任务与中断服务函数之间的运行,直到解锁函数将OSLockNesting和OSIntNesting的值减到0时。方可解除系统锁定。。。。
不知道上面的理解正确否,大家可以说 说。。。

[ 本帖最后由 shilaike 于 2011-4-6 13:54 编辑 ]
 
个人签名只有想不到,没有做不到。
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

5
 

回复 板凳 wo4fisher 的帖子

呵呵。。。你是LF。。。你的QQ号是934016268吧,我才看到你在群里发的消息哈。。。
 
个人签名只有想不到,没有做不到。
 
 

回复

463

帖子

0

TA的资源

纯净的硅(中级)

6
 
这个问题好像回答过了。不再重复了。呵呵
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

7
 

回复 6楼 wstrom 的帖子

回复 楼主 常见泽1 的帖子
因为任务调度时一般都是通过OSTIMEDLY()来实现。在这个函数中会对当前的任务执行挂起。同时查看任务调度表中是否有优先级合适的就绪任务。如果当前任务运行时调用OSSchedLock()给调度器上锁,这样再调用OSTIMEDLY()时就会把当前任务挂起。但由于调度器上锁而不能使其他任务得到CPU的使用权。这样除了中断意外就没有任务可以运行了。除非中断中对这种情况有处理。我想调用其余两个函数也是同OSTIMEDLY()一样的道理了!
不知道这样说能否可以理解


这是版主的回复
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表