嵌入式学习小组
直播中

许莹

7年用户 206经验值
私信 关注

请问OSTaskQPend放置在任务中频繁调用,任务无法切换该怎么办?

在使用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)

逯荣荣

2019-9-30 08:18:38
你的设计有问题, 就算windows上,收发一般也不会放相同的线程,只有发完等待特定信息这种流程性强的才会,不过也不是必须。一般都是收发分开设计比较方便。
你的情况B负责收就好了。发可以开新的任务,接收A的消息,然后发送,也可以A处理完数据直接发送,这个看你的A任务处理数据量以及处理要求来定了。
如果A处理的数据不多,及时性不强,你都可以直接发送。对于ucos来说,其实如果对A要求高,你可能发消息都要考虑禁止任务调度了,不然也保证不了A的及时性。不想windows上多线程。所以我的建议A发就够了,除非很特殊。
举报

贾飞小

2019-9-30 08:26:56
我记得有个放弃CPU使用权的函数,楼主自己找下吧
举报

陆焙兆

2019-9-30 08:43:37
另外你加延时,也该在任务最后加延时,在pend函数里加延时是什么鬼
举报

关欣冰

2019-9-30 08:52:16
是在任务最后加的延时,延时刚测试在3ms可以运行,小与3ms就不行。没有在pend里面的操作。
放弃CPU使用权,是让我任务运行一次放弃一次?可否给个建议!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分