5799|4

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

使用信号的任务间的切换,请给我指出错误 [复制链接]

 //创建一个信号量
        OSSemCreate ((OS_SEM*        )&MY_SEM,
                 (CPU_CHAR*        )"MY_SEM",
                 (OS_SEM_CTR)1,               
                 (OS_ERR*        )&err);
//任务1的任务函数,优先级为4
void task1_task(void *p_arg)
{
        while(1)
        {
                printf("\r\n任务1:\r\n");
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量
                memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
                delay_ms(10);
                printf("%s\r\n",share_resource);        //串口输出共享资源区数据        
                OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);                                //发送信号量
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}

//任务2的任务函数,优先级为5
void task2_task(void *p_arg)
{        
        while(1)
        {
                printf("\r\n任务2:\r\n");
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //请求信号量
                memcpy(share_resource,task2_str,sizeof(task2_str));        //向共享资源区拷贝数据
                delay_ms(10);
                printf("%s\r\n",share_resource);        //串口输出共享资源区数据               
                OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);                                //发送信号量
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
        }
}


我个人理解的任务切换过程:
1)、UCOS开始运行,任务1和任务2都处于就绪态,任务1优先级高首先得到运行,申请到信号量后,在延时函数里面执行任务切换,任务2开始运行,任务1进入等待状态,经过                        OSTimeTick(),后进入就绪态,
2)、任务2运行到申请信号量的时候,由于信号量被任务1占用,所以任务2信号量失败,在OSSemPend()内部执行任务切换,任务1开始运行,任务2进入等待状态
3)、任务1从delay_ms(10)后开始执行,释放信号量,任务2获得信号量的使用权限进入就绪态,任务1在OSTimeDlyHMSM()里面执行任务切换,任务2开始运行,任务1,任务1进入                 等待状态,经过OSTimeTick(),后进入就绪态,
4)、任务2从OSSemPend( );函数开始执行,执行到delay_ms(10)进行任务切换,任务1开始运行,任务2进入等待状态,经过  OSTimeTick(),后进入就绪态,任务1开始执行,                      在OSSemPend()里面申请信号失败,执行任务切换,任务1被挂起进入等待状态,
5)、任务2从delay_ms(10)后面开始执行,释放信号量后,任务1进入就绪状态,任务2在OSTimeDlyHMSM();进行任务切换,任务1从OSSemPend()开始执行,任务2进入等待状态,经过           OSTimeTick(),后进入就绪态,


请高手看看这个过程里面哪里有问题



最新回复

哈哈 别着急,慢慢来  详情 回复 发表于 2016-1-13 15:12
点赞 关注
 

回复
举报

28

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
delay_ms怎么实现的?是不是死等,不会释放CPU?
 
 
 

回复

554

帖子

0

TA的资源

版主

板凳
 
没看出问题,如二楼所说,delay_ms如果是死等,则这种设计不理想,但是完全可以在OSTimeDlyHMSM时进行任务切换。
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

4
 
这个代码完全没有任何实用价值,任务同步不是这样做的,共享资源copy也不是这样做的。涉及到数据copy的可以采用queue去做,加入睡眠这种函数,同步行为更不可预测。
 
 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

5
 
哈哈 别着急,慢慢来
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表