打印
[STM32F3]

ucos iii 的内建消息队列是垃圾还是我不会?

[复制链接]
4262|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lanmanck|  楼主 | 2019-3-19 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ucos, GB, EMI, ip, se
内建消息队列,发送的是全局指针,假设发出去了,接收那边还没调度,然后这个指针又被修改了,那还队列个毛?
假如我自己做个环形缓冲区管理指针,那我还用你这个消息队列干毛?我 ringbuff_write,然后 semipost 唤醒一下读取任务,在其他任务里 ringbuff_read不就出来了吗?
怎么看这个消息队列都是个然并卵的东西啊。
还有那个外部消息队列,居然需要新建一个mem块,这尼玛就是另一个ringbuff,更没卵用了。


沙发
零三翟邢止胃| | 2019-3-20 11:30 | 只看该作者
不懂的啊! 帮顶住啊!

使用特权

评论回复
板凳
kingkits| | 2019-3-20 14:18 | 只看该作者
建议还是用ucosii吧

使用特权

评论回复
地板
ayb_ice| | 2019-3-20 14:22 | 只看该作者
队列又管不了你的这些行为,
明显是你自己的问题,
这种一般要使用动态内存分配

使用特权

评论回复
5
lanmanck|  楼主 | 2019-3-20 15:59 | 只看该作者
ayb_ice 发表于 2019-3-20 14:22
队列又管不了你的这些行为,
明显是你自己的问题,
这种一般要使用动态内存分配 ...

你没看懂啊?你自己内存分配怎么保证内存不会被写入覆盖?还不是我提的问题。

使用特权

评论回复
6
ayb_ice| | 2019-3-20 16:55 | 只看该作者
本帖最后由 ayb_ice 于 2019-3-20 16:57 编辑

他是把指针的值发出去了,这个值是用了消息队列自己的变量来保存的,只要这个指针指向的内存仍有效,有什么关系呢

使用特权

评论回复
评论
john_lee 2019-3-20 18:40 回复TA
算了,老弟,对那种不虚心而且出口成脏的人,不用理他。 
7
lanmanck|  楼主 | 2019-3-20 18:25 | 只看该作者
ayb_ice 发表于 2019-3-20 16:55
他是把指针的值发出去了,这个值是用了消息队列自己的变量来保存的,只要这个指针指向的内存仍有效,有什么 ...

你怎么知道指向的内容有效?中断1ms一次设置你的指针内容,处理的才10ms调度一次,你说你调度时内容都更新了n遍了,还队列个毛?

使用特权

评论回复
8
xtoolbox| | 2019-3-20 20:15 | 只看该作者
本帖最后由 xtoolbox 于 2019-3-20 20:18 编辑

生产者消费者模式,生产者负责申请内存,把内存指针挂队列。消费者负责从队列上取数据,用完后释放。

使用特权

评论回复
9
ayb_ice| | 2019-3-21 08:15 | 只看该作者
lanmanck 发表于 2019-3-20 18:25
你怎么知道指向的内容有效?中断1ms一次设置你的指针内容,处理的才10ms调度一次,你说你调度时内容都更 ...

什么东西都需要事先约定的
一个指针,你要乱指,乱用,谁也没有办法

使用特权

评论回复
10
lanmanck|  楼主 | 2019-3-21 08:51 | 只看该作者
ayb_ice 发表于 2019-3-21 08:15
什么东西都需要事先约定的
一个指针,你要乱指,乱用,谁也没有办法

你真是个2货哦,举个例子:
buf[2],在中断的时候,你
buf[0] = 0;
然后 OSTaskQPost(buf[0]),相当于把buf[0]的指针排到队列。
然后你没来得及OSTaskQPend,中断又buf[1]=1,buf[0]=3,这样你
OSTaskQPend的时候就是buf[0] buf[1]的指针,但是呢,数据不是0、1,而是3、1。这样你的内容就被冲掉了,因为你没有判断你的内容而糊里糊涂往里面仍数据。
解决方法就是:把buf[2]做成一个fifo,然后增加head/tail这样的变量作为队列判断。
问题就来了,我们已经做成了fifo,还要OSTaskQPost做什么?
如果OSTaskQPost内部带一个buffer,然后排队的时候buffer[0] = buf[0]可以缓存进去,那就非常好了,这个就是外部消息队列。
你听懂了吗?

使用特权

评论回复
11
ayb_ice| | 2019-3-21 09:29 | 只看该作者
lanmanck 发表于 2019-3-21 08:51
你真是个2货哦,举个例子:
buf[2],在中断的时候,你
buf[0] = 0;

你NB好不好,我认输

使用特权

评论回复
12
strang| | 2019-3-21 09:51 | 只看该作者
我晕了,楼主你请教别人问题,@ayb_ice大神好心回答你,你还骂人家,你这么牛X,还能有什么不会的吗?

使用特权

评论回复
13
eydj2008| | 2019-3-21 12:25 | 只看该作者
队列改了 也是向后面追加啊 不影响

使用特权

评论回复
14
eydj2008| | 2019-3-21 12:25 | 只看该作者
队列改了 也是向后面追加啊 不影响

使用特权

评论回复
15
li880wert| | 2019-3-21 14:08 | 只看该作者
ayb_ice说得是对的,消息队列缓存的是指针,一般搞单片机喜欢把这指针搞成全局变量,
所以 楼主 把这指针放进消处队列,然后 对方还没收到,又被你改成其他的了。

搞单片机的不太注重 算法,有些算法用起来是很**肋,明明我自己就知道那地址 为啥要从队列去取,
楼主就是这种感觉了

使用特权

评论回复
16
li880wert| | 2019-3-21 14:11 | 只看该作者
OS 消息队列 要配合 malloc 使用,每生成一个数据包malloc 一个指针,然后丢进队列。
接收方从消息队列取得指针,
只有这样在应用中 就不会被中间某个进程改变,

使用特权

评论回复
17
嘿嘿大闸蟹| | 2019-3-21 14:19 | 只看该作者
有道理

使用特权

评论回复
18
lanmanck|  楼主 | 2019-3-21 14:50 | 只看该作者
li880wert 发表于 2019-3-21 14:11
OS 消息队列 要配合 malloc 使用,每生成一个数据包malloc 一个指针,然后丢进队列。
接收方从消息队列取得 ...

你这个也是方法之一,但是每次都malloc/free肯定对单片机来说是噩梦。
@li880wert 这位兄弟也还是没理解问题。

使用特权

评论回复
19
caijie001| | 2019-3-21 20:58 | 只看该作者
本帖最后由 caijie001 于 2019-3-21 21:01 编辑

、。。。。。。。。

使用特权

评论回复
20
caijie001| | 2019-3-21 21:05 | 只看该作者
如果用全局变量,你怎么使用阻塞机制,怎么保证这些变量访问是安全的。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:跟阿里云拼了: http://www.qcloud.com/redirect.php?redirect=1001&cps_key=361a94179534e81fbc22912619cc97ef

153

主题

397

帖子

3

粉丝