完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用ucos建立了2个任务,任务1的优先级为2,任务2的优先级为3.
新建了一个信号量,初始值为1. 哪位能给你解惑一下: 1、任务1输出3,信号量发出后,为什么任务2没有执行呢?而是任务1把4和0输出,且把自己挂起后才执行任务2呢? 2、任务1把自己挂起时,那时信号量为1,他的优先级比任务2的高(任务2已经就绪,任务1也就绪了呀),应该是任务1继续 执行的,为什么任务2却执行了? 下面是串口输出的语句:下面3行特意做了换行,原本这里是没有换行的。 012534067 8129534067 8129534067 [C] 纯文本查看 复制代码 /*****************************任务1*****************************************/static void Task1 (void *p_arg){ INT8U err; while(1) {printf("0"); OSSemPend( sem, 0, &err );printf("1"); OpenLED; //打开LEDprintf("2"); OSTimeDlyHMSM(0,0,0,100);printf("3"); OSSemPost( sem );printf("4"); }}/********************************任务2**************************************/static void Task2 (void *p_arg){ INT8U err; while(1) {printf("5"); OSSemPend( sem, 0, &err );printf("6"); CloseLED; //关闭LEDprintf("7"); OSTimeDlyHMSM(0,0,1,0);printf("8"); OSSemPost( sem );printf("9"); }} |
|
相关推荐
10个回答
|
|
|
|
|
|
回复【2楼】发烧友:
----------------------------- 原子哥,关于第二个问题我还是不明白。 按照你的说法,那么可以这么推断: 上电后程序执行到任务1,把0输出挂起自己,这是任务1就到等待里去了,此时任务2执行,输出5,挂起自己。 但是实际上输出的是012···,不是05··· 这个如何解释? 任务1把自己挂起时信号量是有效的,所以就应该继续执行任务1的,怎么又跑到任务2了呢? 这个执行顺序怎么和刚上电时的逻辑不一样呢? |
|
|
|
楼主直接单步跟踪代码去分析下吧.
|
|
|
|
|
|
|
|
嗯,是的,你要知道一点的是OSSched()函数永远是在找就绪表中已经就绪了的最高优先级的那个任务运行的。此时task1的优先级最高,而且已经就绪了,那么做任务切换的时候肯定会切换到task1的
|
|
|
|
|
|
|
|
楼主 假如运行任务2 是不是执行到任务2的ossempend()还要等待
|
|
|
|
任务2等于是没有等到sem 是吧
|
|
|
|
运行到ossempend()函数肯定要等待指定地的信号量,如果函数超时参数设置为0就一直等待,如果不为0的话就等待指定的时间。
|
|
|
|
楼主你好,发送完0125 后为什么会跳到任务1去了,此时信号量计数不是0吗,不应该什么任务都不执行吗
|
|
|
|
只有小组成员才能发言,加入小组>>
698 浏览 0 评论
1109 浏览 1 评论
2476 浏览 5 评论
2810 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2653 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
656浏览 9评论
651浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
784浏览 6评论
632浏览 5评论
672浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 22:02 , Processed in 1.226443 second(s), Total 98, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号