1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在使用UCOSIII的内建消息队列过程中,我在A任务向B任务发送一个消息,B任务中进行消息OSTaskQPend接收。1.如果配置成OS_OPT_PEND_BLOCKING 阻塞模式,没有消息的时候任务B就会被挂起。OSTaskQPend后续的代码就一直不能执行。
2.如果配置成OS_OPT_PEND_NON_BLOCKING,OSTaskQPend()函数会被在任务的大循环中一直被调用,后续的代码也可以被执行。 3.但是OSTaskQPend函数在不断的调用过程中,OSTaskQPend函数内部不断的在OS_CRItiCAL_ENTER(); //关中断OS_CRITICAL_EXIT(); 开关中断。 4.导致的结果就是任务B一直在运行,无法切换到任务A中。 5.在OSTaskQPend中增加5ms延时可以解决上述问题但是,影响任务实时性。 求大神帮忙出出主意怎么弄! |
|
相关推荐
8个回答
|
|
你的设计有问题, 就算windows上,收发一般也不会放相同的线程,只有发完等待特定信息这种流程性强的才会,不过也不是必须。一般都是收发分开设计比较方便。
你的情况B负责收就好了。发可以开新的任务,接收A的消息,然后发送,也可以A处理完数据直接发送,这个看你的A任务处理数据量以及处理要求来定了。 如果A处理的数据不多,及时性不强,你都可以直接发送。对于ucos来说,其实如果对A要求高,你可能发消息都要考虑禁止任务调度了,不然也保证不了A的及时性。不想windows上多线程。所以我的建议A发就够了,除非很特殊。 |
|
|
|
我记得有个放弃CPU使用权的函数,楼主自己找下吧
|
|
|
|
另外你加延时,也该在任务最后加延时,在pend函数里加延时是什么鬼
|
|
|
|
|
|
|
|
不知道你整个框架逻辑,所以无法给出建议
|
|
|
|
一般情况的配置OS_OPT_PEND_BLOCKING,
OS_OPT_PEND_NON_BLOCKING这个特殊用法你要看你的情况,而且还要对返回参数判断,不然OSTaskQPend没意义。 你的后续代码的执行条件到底是什么,一般都是要收到消息才会执行下去,平时都是挂起的,这个是很正常的啊。 |
|
|
|
A任务是一个数据处理任务,B是TCP客户端任务负责TCP客户端数据接收和发送。A处理完数据通过消息发送给B任务给客户端发送出去,同时B要不断的扫描TCP客户端的接收数据。要是在等待A的消息时卡在pend处,TCP接收就无法实现了!
|
|
|
|
好的!非常感谢!我这边在想想重新设计一下逻辑
|
|
|
|
只有小组成员才能发言,加入小组>>
791 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2710 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1070浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 00:47 , Processed in 1.147158 second(s), Total 61, Slave 52 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号