完善资料让更多小伙伴认识你,还能领取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接收就无法实现了!
|
|
|
|
|
|
好的!非常感谢!我这边在想想重新设计一下逻辑
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1018 浏览 1 评论
1849 浏览 0 评论
1830 浏览 1 评论
3254 浏览 5 评论
3581 浏览 9 评论
1021浏览 1评论
1850浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1360浏览 1评论
1852浏览 0评论
1178浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 05:02 , Processed in 0.748044 second(s), Total 58, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1377