OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5128|回复: 8

UCOSIII 内建消息队列,OSTaskQPend放置在任务中频繁调用,任务无法切换。求解决办法!

[复制链接]

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
发表于 2016-8-10 15:22:13 | 显示全部楼层 |阅读模式
10金钱
在使用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延时可以解决上述问题但是,影响任务实时性。


求大神帮忙出出主意怎么弄!

最佳答案

查看完整内容[请看2#楼]

你的设计有问题, 就算windows上,收发一般也不会放相同的线程,只有发完等待特定信息这种流程性强的才会,不过也不是必须。一般都是收发分开设计比较方便。 你的情况B负责收就好了。发可以开新的任务,接收A的消息,然后发送,也可以A处理完数据直接发送,这个看你的A任务处理数据量以及处理要求来定了。 如果A处理的数据不多,及时性不强,你都可以直接发送。对于ucos来说,其实如果对A要求高,你可能发消息都要考虑禁止任务调 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-10 15:22:14 | 显示全部楼层
你的设计有问题, 就算windows上,收发一般也不会放相同的线程,只有发完等待特定信息这种流程性强的才会,不过也不是必须。一般都是收发分开设计比较方便。
你的情况B负责收就好了。发可以开新的任务,接收A的消息,然后发送,也可以A处理完数据直接发送,这个看你的A任务处理数据量以及处理要求来定了。
如果A处理的数据不多,及时性不强,你都可以直接发送。对于ucos来说,其实如果对A要求高,你可能发消息都要考虑禁止任务调度了,不然也保证不了A的及时性。不想windows上多线程。所以我的建议A发就够了,除非很特殊。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

70

主题

6684

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12613
金钱
12613
注册时间
2012-11-26
在线时间
3701 小时
发表于 2016-8-10 15:31:35 | 显示全部楼层
我记得有个放弃CPU使用权的函数,楼主自己找下吧
回复

使用道具 举报

70

主题

6684

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12613
金钱
12613
注册时间
2012-11-26
在线时间
3701 小时
发表于 2016-8-10 15:32:38 | 显示全部楼层
另外你加延时,也该在任务最后加延时,在pend函数里加延时是什么鬼
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
 楼主| 发表于 2016-8-10 15:44:25 | 显示全部楼层
jermy_z 发表于 2016-8-10 15:32
另外你加延时,也该在任务最后加延时,在pend函数里加延时是什么鬼

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

使用道具 举报

70

主题

6684

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12613
金钱
12613
注册时间
2012-11-26
在线时间
3701 小时
发表于 2016-8-10 15:49:31 | 显示全部楼层
shaozp 发表于 2016-8-10 15:44
是在任务最后加的延时,延时刚测试在3ms可以运行,小与3ms就不行。没有在pend里面的操作。
放弃CPU使用 ...

不知道你整个框架逻辑,所以无法给出建议
学无止境
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-10 15:57:19 | 显示全部楼层
一般情况的配置OS_OPT_PEND_BLOCKING,
OS_OPT_PEND_NON_BLOCKING这个特殊用法你要看你的情况,而且还要对返回参数判断,不然OSTaskQPend没意义。
你的后续代码的执行条件到底是什么,一般都是要收到消息才会执行下去,平时都是挂起的,这个是很正常的啊。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
 楼主| 发表于 2016-8-10 16:23:14 | 显示全部楼层
ysq7120 发表于 2016-8-10 15:57
一般情况的配置OS_OPT_PEND_BLOCKING,
OS_OPT_PEND_NON_BLOCKING这个特殊用法你要看你的情况,而且还要 ...

A任务是一个数据处理任务,B是TCP客户端任务负责TCP客户端数据接收和发送。A处理完数据通过消息发送给B任务给客户端发送出去,同时B要不断的扫描TCP客户端的接收数据。要是在等待A的消息时卡在pend处,TCP接收就无法实现了!
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
 楼主| 发表于 2016-8-10 17:03:07 | 显示全部楼层
ysq7120 发表于 2016-8-10 16:58
你的设计有问题, 就算windows上,收发一般也不会放相同的线程,只有发完等待特定信息这种流程性强的才会, ...

好的!非常感谢!我这边在想想重新设计一下逻辑
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 20:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表