搜索
bottom↓
回复: 12

ucos消息队列的疑问

[复制链接]

出0入0汤圆

发表于 2010-12-2 01:28:57 | 显示全部楼层 |阅读模式
自学ucos的时候对消息队列产生了疑问,望指点一二.

我所认为的消息队列:

1.一个数组,指针组成的数组,其中包含若干个void *类型的指针.
2.消息队列里的消息,取一个就会少一个,放一个就会多一个.也就是说,如果队列里有A,B,C 3个消息,第一次取出A,那么第2次取出的就是B

向队列中 发送消息的函数格式如下 OSQPost (msgQueuename, ( void *) &msg );(有返回值的,这里不写了)
在队列中 取出消息的函数格式如下 Msg = ( char * )OSQPend ( msgQueue ,0, &err );

我一直想不通的问题就在这出现了.

如果我有3个任务:TASK1 (负责接收消息) TASK2(负责把一个结构体的指针发送到消息队列) TASK3(负责把另一个结构体的指针发送到消息队列)
假设:TASK1一直处于接收状态(有消息就能取出来) 把接收到的东西画出来
     TASK2定时的重复发送一个结构体指针 --------- 苹果
     TASK3定时的重复发送一个结构体指针 --------- 香蕉
那么:当TASK1收到消息的时候,Msg里存放的可能是 "苹果" 的指针 , 也有可能是 "香蕉" 的指针.那么当TASK1拿到Msg以后,到底是去画苹果,还是画香蕉
换句话说,TASK1怎么知道 这个这次取出的消息 就是它所需要的消息 而不是原本发送给别人的消息 "被自己误取了".

这个问题纠结了我好几天,不忙的时候总会想想....他怎么就能够这么大胆的去取消息,而不怕取到了别人的消息,而导致这个消息在队列中永远的消失,让别人永远收不到这封信.
于是我想到了一个自圆其说的解释 --- 这个队列里的所有信件(消息)都是他的...可以是很多人发给他的信,也可以是某一个人发给他的很多信.

那么是不是可以这样理解:
TASK1是一只笔,
TASK2说:我要画很多个不一样的 苹果,
TASK3说:我要画很多个不一样的 香蕉

而TASK1只有一只手,于是他用了一张纸,让TASK1和TASK2把想要画的东西按 先来后到 写在上面.于是TASK1一旦空闲就看那张纸,(已经画过的东西被勾掉)现在该画哪一个图案了.(或者 没有需要画的东西了)

这张纸是否就是消息队列............???????????  说了这么多 这就是我的疑问 我说的对吗....

(另:兄弟们推荐本ucos好书吧,邵贝贝老师的书看了,不觉得好,因为除了前面3个让人头大的例子外,没有针对每一个模块作出详细的解释和示例,与其说是一本书,倒不如说是一个API大全.... 或许我底子太差吧~~~~~ 现在的书都怎么了??前几天买了本STM32的书,上面斗大的LINUX,结果里面LINUX一个字都没讲真的...一个字都没..讲的全是STM32的库...也是一本API大全...FUCK,还好我不是网购,是在书店买的,我正需要STM32的书籍,哪怕它只一本API大全,我只是用来当手册查API,如果有ucGUI的书...求之不得...)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入42汤圆

发表于 2010-12-2 08:27:09 | 显示全部楼层
多任务或者ISR都可以给一个消息队列发送信息,消息可以被多个任务接收,至于发送的是香蕉还是发送苹果,要看你程序的意思了。

如果你不想让想拿香蕉的任务拿到苹果,那么你必须创建两个消息队列,一个专门发送香蕉,一个专门发送苹果;

接收消息的任务想拿香蕉就从香蕉的队列中取,想拿苹果就从苹果的队列中取。

出0入0汤圆

发表于 2010-12-2 08:44:53 | 显示全部楼层
task2说画苹果,task1当然会画苹果了。 task3
说画香蕉当让task1会画香蕉了。你都告诉人家画啥了,人家当然会照着做了。你的消息包含了画香蕉还是画苹果的信息。

出0入0汤圆

发表于 2010-12-2 08:59:06 | 显示全部楼层
回复【楼主位】xyqdoudou
-----------------------------------------------------------------------

我也刚开始学,发两个网上找到的好文件,一起努力

uCOS_II_2.52源码中文译注.pdfourdev_601677R2YMFG.pdf(文件大小:2.36M) (原文件名:uCOS_II_2.52源码中文译注.pdf)
μC_OS-Ⅱ中文手册.pdfourdev_601678JT4S99.pdf(文件大小:4.33M) (原文件名:μC_OS-Ⅱ中文手册.pdf)

出0入0汤圆

 楼主| 发表于 2010-12-2 16:36:52 | 显示全部楼层
谢谢 楼上3位的回复

回楼上,这两个东西我都有了。不过还是谢谢你。

出0入0汤圆

发表于 2010-12-2 16:44:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-11 08:57:47 | 显示全部楼层
?回复【5楼】wxx116zh
-----------------------------------------------------------------------

我也有同样的问题,当我们用结构数组来定义队列时,即每一个消息都是一个结构体,该如何使用消息队列呢?难道UCOS II只支持消息内容是一个字节的消息队列?

出0入0汤圆

发表于 2011-4-16 23:14:57 | 显示全部楼层
消息队列里是指针。。。可以指向结构体

出0入0汤圆

发表于 2011-4-24 01:59:20 | 显示全部楼层
使用OSQQuery,在贝贝书的P267有解释,使用这个来查询消息队列,是自己的了再取。

出0入0汤圆

发表于 2011-4-24 02:03:14 | 显示全部楼层
使用OSQQuery的风险在于:假如队列的第一个消息是香蕉,那么如果要香蕉的任务不拿走香蕉,后面的苹果就出不来。

出0入0汤圆

发表于 2011-5-31 14:35:15 | 显示全部楼层
回复【9楼】hagx  
-----------------------------------------------------------------------

那这个问题该怎么解决呢

出0入0汤圆

发表于 2011-11-8 17:47:24 | 显示全部楼层
回复【1楼】my_avr  
多任务或者isr都可以给一个消息队列发送信息,消息可以被多个任务接收,至于发送的是香蕉还是发送苹果,要看你程序的意思了。
如果你不想让想拿香蕉的任务拿到苹果,那么你必须创建两个消息队列,一个专门发送香蕉,一个专门发送苹果;
接收消息的任务想拿香蕉就从香蕉的队列中取,想拿苹果就从苹果的队列中取。
-----------------------------------------------------------------------

和我理解一样

出0入0汤圆

发表于 2011-12-3 20:55:49 | 显示全部楼层
消息队列的任务只是收发消息。至于消息的具体含义应该是取消息的任务来分析,传的指针应该指向一个结构体,结构体中有一个字段指名是画香蕉还是画苹果。甚至更简单一些,这个结构体只包含一个回调函数和回调参数。取出消息的任务直接以指定的参数调用回调函数,不用关心画什么。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 15:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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