735054479_30150 发表于 2014-2-21 20:43:20

关于互斥信号量的问题

在《嵌入式实时操作系统UCOS原理与实践》中互斥信号量应用举例(154页)的仿真结果中:,在低优先级任务打印第一个数据后为何中优先级任务开始打印数据,在低优先级任务代码中,打印数据时没有涉及任务切换的代码啊?这是怎么回事捏?求解释、、、、、、

sky-Hawk where 发表于 2015-2-1 21:59:14

给个赞:victory::)

franki 发表于 2014-8-14 11:03:26

路过    围观一下      

469219945 发表于 2014-3-5 15:55:08

顶楼上      

laoliang-67665 发表于 2014-2-24 11:25:23

低优先级的任务开始运行后延时90个滴答
中优先级的任务开始运行后延时95个滴答
高优先级的任务开始运行后延时100个滴答
在时间0,三个任务被创建并运行,但是都开始延时
在时间90,低优先级的任务别唤醒,占用了互斥信号量
在时间95,OSTICKTICK将中优先级任务唤醒,而其优先级高于正在运行的任务,而获得运行
在时间100,高优先级的任务被唤醒,但是它请求互斥信号量,而互斥信号量被低优先级的任务占有
更为悲惨的是,必须等中优先级的任务运行完,低优先级的任务才能继续运行,才能去释放互斥信号量

laoliang-67665 发表于 2014-2-24 11:24:42

低优先级的任务开始运行后延时90个滴答
中优先级的任务开始运行后延时95个滴答
高优先级的任务开始运行后延时100个滴答
在时间0,三个任务被创建并运行,但是都开始延时
在时间90,低优先级的任务别唤醒,占用了互斥信号量
在时间95,OSTICKTICK将中优先级任务唤醒,而其优先级高于正在运行的任务,而获得运行
在时间100,高优先级的任务被唤醒,但是它请求互斥信号量,而互斥信号量被低优先级的任务占有
更为悲惨的是,必须等中优先级的任务运行完,低优先级的任务才能继续运行,才能去释放互斥信号量

ballack_linux 发表于 2014-2-24 01:54:07

ballack_linux 发表于 2014-2-24 01:52 static/image/common/back.gif
首先,进出临界区是不会导致任务调度的,第二,不知道楼主是否查看过UCOS的源码,知道TimeTick是怎么运作 ...

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

ballack_linux 发表于 2014-2-24 01:52:50

735054479 发表于 2014-2-22 18:48 static/image/common/back.gif
再怎么抢占优先级也得等低优先级任务运行完啊,中间没有中断,这里应该是printf中调用了OSTimeGet函数,从 ...

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

735054479_30150 发表于 2014-2-22 18:51:45

yilusuiyuan 发表于 2014-2-22 17:24 static/image/common/back.gif
你看看前面创建任务的时候的优先级和阻塞时间就知道为什么中优先级运行。如果没有中优先级的任务的话就没有 ...

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

735054479_30150 发表于 2014-2-22 18:48:35

本帖最后由 735054479 于 2014-2-22 18:49 编辑

ballack_linux 发表于 2014-2-22 00:05 static/image/common/back.gif
ucos是可抢占型的系统,当更高优先级的任务就绪时,是可以抢占低优先级任务的 ...
再怎么抢占优先级也得等低优先级任务运行完啊,中间没有中断,这里应该是printf中调用了OSTimeGet函数,从而才会发生任务调度,在INT32UOSTimeGet (void)
{
    INT32U   ticks;
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register         */
    OS_CPU_SRcpu_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();时结果为C:\Users\Lenovo\Desktop
页: [1] 2
查看完整版本: 关于互斥信号量的问题

Baidu
map