OpenEdv-开源电子网

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

求解释STM32F4 UCOS开发手册_V3.0的信号量例程

[复制链接]

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
发表于 2016-2-26 16:21:44 | 显示全部楼层 |阅读模式
1金钱
对STM32F4 UCOS开发手册_V3.0的10.3.1中的例程有信号量的使用不明白:

//任务 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); //请求信号量(1)
memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
delay_ms(200);
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSSemPost (&MY_SEM,OS_OPT_POST_1,&err); //发送信号量 (2)
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); //请求信号量(3)
memcpy(share_resource,task2_str,sizeof(task2_str)); //向共享资源区拷贝数据
delay_ms(200);
printf("%s\r\n",share_resource); //串口输出共享资源区数据
OSSemPost (&MY_SEM,OS_OPT_POST_1,&err); //发送信号量 (4)
LED1 = ~LED1;
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时 1s
}
}

在任务1从串口输出字符"任务1"后请求得到信号量,然后将字符串拷贝到共享区,再进入延时,此时应该会引起任务切换到任务2吧?接着应该会从串口输出“任务2”再由于请求信号量不成功而等待,又进入任务1输出[size=13.333333015441895px]"First task Running!"啊?我的分析哪里有错误?
[size=13.333333015441895px]

最佳答案

查看完整内容[请看2#楼]

刚试了下,确实如此。修改代码如下后解决: //任务1的任务函数 void task1_task(void *p_arg) { OS_ERR err; u8 task1_str[]="First task Running!"; while(1) { OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量 printf("\r\n任务1:\r\n"); LCD_Fill(0,110,239,319,CYAN); memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据 delay_ms(300); printf("%s ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2015-11-16
在线时间
31 小时
 楼主| 发表于 2016-2-26 16:21:45 | 显示全部楼层
刚试了下,确实如此。修改代码如下后解决:
//任务1的任务函数
void task1_task(void *p_arg)
{
        OS_ERR err;
        u8 task1_str[]="First task Running!";
        while(1)
        {
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量
                printf("\r\n任务1:\r\n");
                LCD_Fill(0,110,239,319,CYAN);
                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)
        {
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量
                printf("\r\n任务2:\r\n");
                LCD_Fill(0,110,239,319,BROWN);
                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
        }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 06:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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