xyqdoudou 发表于 2010-12-2 01:28:57

ucos消息队列的疑问

自学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的书...求之不得...)

my_avr 发表于 2010-12-2 08:27:09

多任务或者ISR都可以给一个消息队列发送信息,消息可以被多个任务接收,至于发送的是香蕉还是发送苹果,要看你程序的意思了。

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

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

lsea 发表于 2010-12-2 08:44:53

task2说画苹果,task1当然会画苹果了。 task3
说画香蕉当让task1会画香蕉了。你都告诉人家画啥了,人家当然会照着做了。你的消息包含了画香蕉还是画苹果的信息。

cyytz5021 发表于 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)

xyqdoudou 发表于 2010-12-2 16:36:52

谢谢 楼上3位的回复

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

wxx116zh 发表于 2010-12-2 16:44:42

mark

sunzjb 发表于 2011-4-11 08:57:47

?回复【5楼】wxx116zh
-----------------------------------------------------------------------

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

l503iu 发表于 2011-4-16 23:14:57

消息队列里是指针。。。可以指向结构体

hagx 发表于 2011-4-24 01:59:20

使用OSQQuery,在贝贝书的P267有解释,使用这个来查询消息队列,是自己的了再取。

hagx 发表于 2011-4-24 02:03:14

使用OSQQuery的风险在于:假如队列的第一个消息是香蕉,那么如果要香蕉的任务不拿走香蕉,后面的苹果就出不来。

woshishiyanshj 发表于 2011-5-31 14:35:15

回复【9楼】hagx
-----------------------------------------------------------------------

那这个问题该怎么解决呢

unic 发表于 2011-11-8 17:47:24

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

和我理解一样

himm007 发表于 2011-12-3 20:55:49

消息队列的任务只是收发消息。至于消息的具体含义应该是取消息的任务来分析,传的指针应该指向一个结构体,结构体中有一个字段指名是画香蕉还是画苹果。甚至更简单一些,这个结构体只包含一个回调函数和回调参数。取出消息的任务直接以指定的参数调用回调函数,不用关心画什么。
页: [1]
查看完整版本: ucos消息队列的疑问