11回答

0收藏

关于互斥信号量的问题

#开源分享 #开源分享 4809 人阅读 | 11 人回复 | 2014-02-21

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

分享到:
回复

使用道具 举报

回答|共 11 个

倒序浏览

沙发

ballack_linux

发表于 2014-2-22 00:05:30 | 只看该作者

ucos是可抢占型的系统,当更高优先级的任务就绪时,是可以抢占低优先级任务的
板凳

yilusuiyuan

发表于 2014-2-22 17:24:44 | 只看该作者

你看看前面创建任务的时候的优先级和阻塞时间就知道为什么中优先级运行。如果没有中优先级的任务的话就没有必要用互斥信号量了!
地板

735054479_3015043

发表于 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();时结果为C:\Users\Lenovo\Desktop
5#

735054479_3015043

发表于 2014-2-22 18:51:45 | 只看该作者

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

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

ballack_linux

发表于 2014-2-24 01:52:50 | 只看该作者

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

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

ballack_linux

发表于 2014-2-24 01:54:07 | 只看该作者

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

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

laoliang-67665

发表于 2014-2-24 11:24:42 | 只看该作者

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

laoliang-67665

发表于 2014-2-24 11:25:23 | 只看该作者

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

469219945

发表于 2014-3-5 15:55:08 | 只看该作者

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

本版积分规则

关闭

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