OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5324|回复: 5

UCOSIII使用信号量访问共享资源区时,任务调用及执行顺序不太理解

[复制链接]

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2018-7-16
在线时间
22 小时
发表于 2019-6-17 17:51:50 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 Rayc 于 2019-6-17 21:37 编辑

在原子哥UCOSIII使用信号量访问共享资源区的程序中,创建的信号量默认为1。我理解的运行顺序是这样的:
首先执行task1,串口输出“任务1:”,再运行到delay_ms(300)时会引起任务调度,这时候切换到task2,串口输出“任务2:”,但是task2中的OSSemPend()信号量为0导致阻塞,task2被挂起, 继续切回到task1,串口输出“First task Running!”,task1发送信号量后,切换到task2。以此类推。。。。
因此串口输出执行结果如下:

任务1:
任务2:
First task Running!
任务1:
Second task Running!


但实际的执行结果如下图:
1560764578(1).jpg

这应该是我对任务调度和信号量的相关内容还理解的不透彻,但一直没找到是哪个地方没理解到位,请大神指点,谢谢。


相关代码如下:

[mw_shl_code=c,true]//任务1的任务函数
void task1_task(void *p_arg)
{
        OS_ERR err;
        u8 task1_str[]="First task Running!";
        while(1)
        {
                printf("\r\n任务1:\r\n");
                LCD_Fill(0,110,239,319,CYAN);
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量
                memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
                delay_ms(300);
                printf("%s\r\n",share_resource);        //串口输出共享资源区数据        
                OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);                                //发送信号量
                LED0 = ~LED0;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}

//任务2的任务函数
void task2_task(void *p_arg)
{        
        OS_ERR err;
        u8 task2_str[]="Second task Running!";
        while(1)
        {
                printf("\r\n任务2:\r\n");
                LCD_Fill(0,110,239,319,BROWN);
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量
                memcpy(share_resource,task2_str,sizeof(task2_str));        //向共享资源区拷贝数据
                delay_ms(300);
                printf("%s\r\n",share_resource);        //串口输出共享资源区数据               
                OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);                                //发送信号量
                LED1 = ~LED1;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}[/mw_shl_code]




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-6-18 02:06:33 | 显示全部楼层
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-7-21
在线时间
4 小时
发表于 2019-7-21 23:42:21 | 显示全部楼层
我也是新手,也是看到这里同样感觉不理解
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-7-21
在线时间
4 小时
发表于 2019-8-10 00:54:33 | 显示全部楼层
我之前也遇到了楼主一样的困惑,后来实验了一下发现结果和自己想的不一样,想了想肯定是自己理解的有问题。 然后仔细看了代码,发现在任务中有两个延时,一个是delay_ms(300);另一个是OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); 楼主没有理解到位的应该是在这里,两个延时都回发生任务调度,但是因为1S的延时比300ms的延时长很多,所以300ms延时的时候会发生任务调度,但是当前没有任务延时时间到,所以不会发生任务切换,300ms延时时间到了之后还是当前任务继续执行。。。。。。。。 这个问题楼主可以将 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   这条语句注释掉,运行的结果就和你分析得是一样 了。。。。。 我也是新手刚学这个,如果分析得不对,还希望大家多多指点。。。。
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-7-21
在线时间
4 小时
发表于 2019-8-10 00:55:08 | 显示全部楼层
我之前也遇到了楼主一样的困惑,后来实验了一下发现结果和自己想的不一样,想了想肯定是自己理解的有问题。
然后仔细看了代码,发现在任务中有两个延时,一个是delay_ms(300);另一个是OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); 楼主没有理解到位的应该是在这里,两个延时都回发生任务调度,但是因为1S的延时比300ms的延时长很多,所以300ms延时的时候会发生任务调度,但是当前没有任务延时时间到,所以不会发生任务切换,300ms延时时间到了之后还是当前任务继续执行。。。。。。。。



这个问题楼主可以将 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   这条语句注释掉,运行的结果就和你分析得是一样 了。。。。。



我也是新手刚学这个,如果分析得不对,还希望大家多多指点。。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-8-12 03:31:29 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表