查看: 4269|回复: 11

关于互斥信号量的问题

[复制链接]
  • TA的每日心情
    开心
    2014-7-6 08:47
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-2-21 20:43:20 | 显示全部楼层 |阅读模式
    分享到:
    在《嵌入式实时操作系统UCOS原理与实践》中互斥信号量应用举例(154页)的仿真结果中:

    仿真结果

    仿真结果
    ,在低优先级任务打印第一个数据后为何中优先级任务开始打印数据,在低优先级任务代码中,打印数据时没有涉及任务切换的代码啊?这是怎么回事捏?求解释、、、、、、

    对应代码

    对应代码

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-11-5 20:26
  • 签到天数: 262 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-2-22 00:05:30 | 显示全部楼层
    ucos是可抢占型的系统,当更高优先级的任务就绪时,是可以抢占低优先级任务的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-1-28 10:03
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-2-22 17:24:44 | 显示全部楼层
    你看看前面创建任务的时候的优先级和阻塞时间就知道为什么中优先级运行。如果没有中优先级的任务的话就没有必要用互斥信号量了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-6 08:47
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

     楼主| 发表于 2014-2-22 18:48:35 | 显示全部楼层
    本帖最后由 735054479 于 2014-2-22 18:49 编辑
    ballack_linux 发表于 2014-2-22 00:05
    ucos是可抢占型的系统,当更高优先级的任务就绪时,是可以抢占低优先级任务的 ...

    再怎么抢占优先级也得等低优先级任务运行完啊,中间没有中断,这里应该是printf中调用了OSTimeGet函数,从而才会发生任务调度,在INT32U  OSTimeGet (void)
    {
        INT32U     ticks;
    #if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
        OS_CPU_SR  cpu_sr = 0u;
    #endif



        OS_ENTER_CRITICAL();
        ticks = OSTime;
        OS_EXIT_CRITICAL();
        return (ticks);
    }
    #endif
    中实行了临界区的进出,可能这里导致了任务调度。
    void usertask1(void *pParam)
    {
        int sum=1;
            for(;;){
                    OSTimeDly(100);
            printf("@@@@task5 after sleep,本任务调度次数%d,FlagEn=%d\n",sum++,FlagEn)  ;
            }
    }
    void usertask2(void *pParam)
    {
        int sum=1;
            unsigned int i,j;
            for(;;){

                    for(i=0;i<65535;i++)
                            for(j=0;j<1000;j++);
    //                OSTimeGet();
                    printf("task6 after sleep,本任务调度次数%d,FlagEn=%d\n",sum++,FlagEn) ;
            }
    }在这两个任务中task5优先级为5,task6优先级为6,当屏蔽OSTimeGet();时结果为C:\Users\Lenovo\Desktop

    屏蔽OSTimeGet

    屏蔽OSTimeGet

    当不屏蔽OSTimeGet();时结果为C:\Users\Lenovo\Desktop

    不屏蔽OSTimeGet

    不屏蔽OSTimeGet
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-7-6 08:47
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

     楼主| 发表于 2014-2-22 18:51:45 | 显示全部楼层
    yilusuiyuan 发表于 2014-2-22 17:24
    你看看前面创建任务的时候的优先级和阻塞时间就知道为什么中优先级运行。如果没有中优先级的任务的话就没有 ...

    可能是调用了OSTimeGet(),导致了一次任务调度,具体见楼上的回复
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-11-5 20:26
  • 签到天数: 262 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-2-24 01:52:50 | 显示全部楼层
    735054479 发表于 2014-2-22 18:48
    再怎么抢占优先级也得等低优先级任务运行完啊,中间没有中断,这里应该是printf中调用了OSTimeGet函数,从 ...

    首先,进出临界区是不会导致任务调度的,第二,不知道楼主是否查看过UCOS的源码,知道TimeTick是怎么运作的不? 在Tick中断退出时,会调用OSIntExit函数,里面会判断当前就绪的最高优先级任务是否是当前正在运行的任务,如果不是,则发生任务调度。
    至于你运行的结果,等我抽个时间仿真一个给你看看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-11-5 20:26
  • 签到天数: 262 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-2-24 01:54:07 | 显示全部楼层
    ballack_linux 发表于 2014-2-24 01:52
    首先,进出临界区是不会导致任务调度的,第二,不知道楼主是否查看过UCOS的源码,知道TimeTick是怎么运作 ...

    再补充一个,楼主的这句话“再怎么抢占优先级也得等低优先级任务运行完啊”,说明楼主不知道何为抢占型内核
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-8 15:51
  • 签到天数: 22 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-2-24 11:24:42 | 显示全部楼层
    低优先级的任务开始运行后延时90个滴答
    中优先级的任务开始运行后延时95个滴答
    高优先级的任务开始运行后延时100个滴答
    在时间0,三个任务被创建并运行,但是都开始延时
    在时间90,低优先级的任务别唤醒,占用了互斥信号量
    在时间95,OSTICKTICK将中优先级任务唤醒,而其优先级高于正在运行的任务,而获得运行
    在时间100,高优先级的任务被唤醒,但是它请求互斥信号量,而互斥信号量被低优先级的任务占有
    更为悲惨的是,必须等中优先级的任务运行完,低优先级的任务才能继续运行,才能去释放互斥信号量
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-1-8 15:51
  • 签到天数: 22 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-2-24 11:25:23 | 显示全部楼层
    低优先级的任务开始运行后延时90个滴答
    中优先级的任务开始运行后延时95个滴答
    高优先级的任务开始运行后延时100个滴答
    在时间0,三个任务被创建并运行,但是都开始延时
    在时间90,低优先级的任务别唤醒,占用了互斥信号量
    在时间95,OSTICKTICK将中优先级任务唤醒,而其优先级高于正在运行的任务,而获得运行
    在时间100,高优先级的任务被唤醒,但是它请求互斥信号量,而互斥信号量被低优先级的任务占有
    更为悲惨的是,必须等中优先级的任务运行完,低优先级的任务才能继续运行,才能去释放互斥信号量
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-3-5 15:38
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-3-5 15:55:08 | 显示全部楼层
    顶楼上      
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 02:41 , Processed in 0.185543 second(s), 34 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.