打印
[uCOS/RTOS]

关于互斥型信号量

[复制链接]
1044|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xuesong10210 于 2016-9-13 16:57 编辑

本人小白一个最近在学习嵌入式操作系统(ucosii),学习到互斥型信号量一节,在这对互斥型信号量一些理解和大家分享一下,如果有什么理解不对的地方,还希望有大神能给指证。
不说了先帖代码,方便大家理解;
//主函数
int main(void)
{
OSInit(); /* 系统初始化*/
/*创建消息事件*/
Semp = OSMutexCreate(1,&err);//创建信号量
/* 创建主任务*/
OSTaskCreate(MainTask, (void *)0, &MainTask_Stk[MainTask_StkSize-1], MainTask_Prio);
OSStart(); /* 开始任务调度*/
return 0;
}
/* 主任务*/
void MainTask(void *p_arg)
{
    p_arg = p_arg;
    OSStatInit(); /* 统计任务初始化*/
    //while(1)
    //{
        /* 创建其他任务*/
        OSTaskCreate(FirstTask, (void *)0, &FirstTask_Stk[FirstTask_StkSize-1], FirstTask_Prio);
        OSTaskCreate(SecondTask, (void *)0, &SecondTask_Stk[SecondTask_StkSize-1], SecondTask_Prio);
        OSTaskCreate(ThirdTask, (void *)0, &ThirdTask_Stk[ThirdTask_StkSize-1], ThirdTask_Prio);
        OSTaskCreate(FourthTask, (void *)0, &FourthTask_Stk[FourthTask_StkSize-1], FourthTask_Prio);
        //OSTimeDlyHMSM(0,0,10,0); /* 任务调度*/
        //OSTaskDel(MainTask_Prio); /* 删除主任务*/
    //}
}

/*  第一个任务*/
void FirstTask(void *p_arg)
{
    for(;;)
    {
        OSTimeDlyHMSM(0,0,1,200);
        {
            printf("FirstTask任务被调用执行!\n");
            OSMutexPend(Semp,0,&err);
            printf("FirstTask请求互斥信号量后!\n");
            OSMutexPost(Semp);
        }
        OSTimeDlyHMSM(0,0,1,200);
    }
}

/*  第二个任务*/
void SecondTask(void *p_arg)
{
    for(;;)
    {
        printf("SecondTask任务被调用执行!\n");
        OSTimeDlyHMSM(0,0,0,300);
    }
}

/*  第三个任务*/
void ThirdTask(void *p_arg)
{
    for(;;)
    {
        printf("ThirdTask任务被调用执行!\n");
        OSMutexPend(Semp,0,&err);
        printf("ThirdTask请求互斥信号量后!\n");
        for(times;times<=20000000;times++)
        {
            if((times%10000000)==0)
            {
                printf("ThirdTask的for循环中!\n");
            }
            OS_Sched();
        }
        printf("************************\n");
        OSMutexPost(Semp);
        printf("ThirdTask发送互斥信号量后!\n");
        OSTimeDlyHMSM(0,0,1,0);
    }
}

/*  第四个任务*/
void FourthTask(void *p_arg)
{
    for(;;)
    {
        printf("FourthTask任务被调用执行!\n");
        OSTimeDlyHMSM(0,0,0,200);
    }
}

未完接下

相关帖子

沙发
xuesong10210|  楼主 | 2016-9-13 16:57 | 只看该作者
本帖最后由 xuesong10210 于 2016-9-13 16:31 编辑

任务优先级如下设置:
#define MainTask_Prio 4
#define FirstTask_Prio 6
#define SecondTask_Prio 7
#define ThirdTask_Prio 8
#define FourthTask_Prio 10

如果按上面的任务优先级执行结果如下图:

      可以看到在任务ThirdTask请求互斥信号量进入for循环后在FirstTask还没有请求互斥信号量时,可以通过任务调度函数切换任务执行。但是当FirstTask请求互斥信号量后任务调度函数不能在切换其他任务执行(不管优先级高低),只有等待ThirdTask和FirstTask都调用OSMutexPost发出互斥信号量以后才能切换高优先级的任务执行。

未完续下。。。。。。。

001.png (18.78 KB )

001.png

使用特权

评论回复
板凳
xuesong10210|  楼主 | 2016-9-13 16:57 | 只看该作者
本帖最后由 xuesong10210 于 2016-9-13 16:31 编辑

另做实验设置优先级如下:(将FirstTask_Prio和ThirdTask_Prio 优先级调换 将FourthTask_Prio优先级提到前面)
#defineMainTask_Prio 4
#define FirstTask_Prio 8
#define SecondTask_Prio 7
#define ThirdTask_Prio 6
#define FourthTask_Prio 5

运行结果如下图:

当高优先及的任务申请互斥信号量后,在任务没有调用OSMutexPost函数之前,调用OS_Sched()方法低优先级的任务是不能被执行的,但是被ThirdTask_Prio优先级高的任务可以调用执行。



未完续下。。。。。。。

002.png (20.16 KB )

002.png

使用特权

评论回复
地板
xuesong10210|  楼主 | 2016-9-13 16:57 | 只看该作者
本帖最后由 xuesong10210 于 2016-9-13 16:55 编辑

分析总结得出,如果两个任务中当用到互斥信号量时,高优先级的任务如果先调用OSMutexPend函数那么在该任务未调用OSMutexPost函数以前,低优先级的任务不能够进入就绪状态被执行,但是高于该任务优先级的任务可以被执行。如果低优先级的任务先调用OSMutexPend函数那么在该任务未调用OSMutexPost函数以前,高于该优先级的任务再调用OSMutexPend函数,那么会出现优先级反转,其他所有的任务不被切换,直到低优先级任务中OSMutexPost函数被调用后其他高于高优先级任务的才能被调用,当高优先级中的OSMutexPost函数也被调用后所有任务才能按照优先级的顺序被正常调用!
补充:以上分析都是在一个互斥信号量的基础上做出的。

处女帖写的不好勿喷。。。。。大家有什么新的见解记得下面讨论。。。。。。。

使用特权

评论回复
5
hufengweixx| | 2017-1-11 13:29 | 只看该作者
顶一下!!!

使用特权

评论回复
6
还是看不穿| | 2017-1-12 14:35 | 只看该作者
才开始学,看了晕晕的,谢谢分享!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

40

帖子

0

粉丝