|
自学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周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|