打印

消息邮箱和队列使用指针的原因??

[复制链接]
5107|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
datreexia|  楼主 | 2010-12-13 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 datreexia 于 2010-12-13 16:25 编辑

uc的消息机制有些地方还是没有领悟,不怕拍砖,说说我的观点。
    粗略看了uc的源代码,发现所谓的消息邮箱和队列使用的都是指针    既然是指针就必须要有一个实际的地址,就要为这个数据开辟存储空间,在不需要存储的应用中显得多此一举。
    如,某任务接收串口的数据,来一个数据就传走一个数据,没必要存储,使用局部变量即可。而在uc中就要先定义一个静态的变量,将它的指针发送给消息邮箱或队列。还要额外注意这个静态变量是否被修改的问题。若直接传送数据就不必考虑这么多。
    又如,串口任务接收一些数据包,由于数据包种类很多,包长度不固定,另一个任务接收这些数据,若消息队列并不是指针的话,我可以直接将这些数据放到队列中,先入先出的读走。  而消息队列是指针的话我就要先建立一个缓冲区,还要想办法将这个数包的长度告诉接包的任务。感觉这样使用不流畅。(呵呵,可能是我没找到好的解决方法,侮辱了OS的作用。)
    我问过几个同事,他们说vxworks等操作系统的消息和队列也是指针,我开始考虑用指针的好处。
1、便于移植
    因为实际的数据长度不定,而对于同一个系统指针长度是固定的,所以移植时不需要改动代码;
2、一次 “传递”的数据多(效率高)
   如,可以传输一个字符串;
3、待补充...




缺点:
1、有些应用占用资源多,因为每个消息都要开辟存储空间;
2、存在潜在的危险,在消息传递过程中数据被修改;

相关帖子

沙发
ayb_ice| | 2010-12-13 16:04 | 只看该作者
他们一般使用动态内存分配,当然要用指针了,特别是邮箱
传递指针效率高啊

使用特权

评论回复
板凳
zhangf1021| | 2010-12-13 16:09 | 只看该作者
局部变量不占用空间?
直接存储应该比指针费的空间多多了

使用特权

评论回复
地板
datreexia|  楼主 | 2010-12-13 16:15 | 只看该作者
2# ayb_ice
传递指针效率高,一次传递数量大。
动态内存没考虑过,应该也是一个重要的方面

使用特权

评论回复
5
datreexia|  楼主 | 2010-12-13 16:21 | 只看该作者
3# zhangf1021 局部变量也占用空间,但局部变量可以暂存数据,前后来两个数据时,可使用同一个变量,因为这个数据已经传递出去了,若使用指针就必须使用两个静态变量。
   当然这个暂存用的变量也可以是全局的,但没必要。

使用特权

评论回复
6
zhangf1021| | 2010-12-13 16:28 | 只看该作者
你怎么能确定数据就传递出去了呢,使用邮箱之类本来就是来解决异步通信的,完全有可能来新数据时老数据还没处理完成。
同时,按你举例的串口数据,比如我串口来很多包,最大的1K+字节,最小的只有几字节,你局部变量要开多大的空间呢,只能按最大的开吧,当来的是小包时,那些空间不久浪费了吗?

使用特权

评论回复
7
datreexia|  楼主 | 2010-12-13 17:33 | 只看该作者
本帖最后由 datreexia 于 2010-12-13 17:34 编辑

6# zhangf1021
我不能确定传递出去啊,所以我用队列,但这个队列不是指针,而是存储的事实的数据。
我只要把这个队列的长度稍长一点即可,因为我是一边往里存,一边取来分析,所以队列也根本不需要1k的存储空间。全局变量只用了一个字节。

另外:
怎么问题跑到全局变量和局部变量上了,如果用全局变量的话不一样要开辟一个最长的数组吗,不照样有浪费?

当然数据太长用指针是最方便的,效率也高。我在优点也提到过。

使用特权

评论回复
8
areshan| | 2010-12-13 18:59 | 只看该作者
你会发现UCOS在优先级查找是做的表格竟然是256个字节!!!!!!那个UNMAP竟然是外部全局变量!有时候可能要牺牲掉RAM来满足设计上的要求(时间的确定性)!

使用特权

评论回复
9
datreexia|  楼主 | 2010-12-13 21:33 | 只看该作者
8# areshan
当然要用全局变量了,每个任务都要用

使用特权

评论回复
10
zhangf1021| | 2010-12-14 08:39 | 只看该作者
本帖最后由 zhangf1021 于 2010-12-14 08:45 编辑

7# datreexia
去了解下动态分配吧,不是只有局部变量和全局变量的

使用特权

评论回复
11
datreexia|  楼主 | 2010-12-14 09:05 | 只看该作者
10# zhangf1021
即使是动态内存分配,在上述问题上也不会节省空间啊。

回答问题就好好回答,丢下一句话显示一下自己的水平,简直就是很多做技术的通病。

使用特权

评论回复
12
cloudreaching| | 2010-12-14 13:28 | 只看该作者

使用特权

评论回复
13
cloudreaching| | 2010-12-14 13:31 | 只看该作者
应该移植和维护。比如说不同平台的cpu间的移植,比如说如果他要升级这个组件功能,

使用特权

评论回复
14
deng560| | 2010-12-14 14:10 | 只看该作者
不知道你有看过linux内核源码吗?mmap为什么也要指针呢?? 少去了拷贝的过程,直接传递数据地址。工作效率提高很多。

使用特权

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

本版积分规则

12

主题

91

帖子

0

粉丝