robin45853258 发表于 2013-1-25 18:25:26

对比μTenux和μC/OS-II的消息邮箱

前不久有同事将μTenux的消息邮箱实验例程写完并且在博客中简要说明了μTenux邮箱的机制及涉及到的数据结构。我想对这部分有必要重点分析一下,因为大家用习惯了μC/OS-II,使用起来μTenux难免会产生些问题。
在新版的μC/OS-III已经删掉了邮箱机制,因为μC/OS的实现机制上看,它的邮箱和队列实际上是一样的,消息队列只是一个邮箱的链表罢了。所以μC/OS-III就将消息邮箱删除了。
首先,明确一下邮箱的定义。操作系统中的邮箱就是任务或者线程间通信的一种方式(因为邮箱用到的是地址指针,进程的地址是孤立的,所以进程间用邮箱肯定不行,庆幸的是RTOS一般不会涉及到进程,只会和任务或者线程打交道)。现实生活中,我们在自己家的墙上钉一个箱子,写上邮箱编号,这就是邮箱的创建。早上醒来看看邮箱有没有信件或者报纸,这就是收取邮箱消息(如果没有一直等,或者等一段时间就不等了,或者干脆不等了,这些都是你来决定的)。有信件要邮递,就将信件放到邮箱里,这就是发送邮箱消息(有没有人取走它,什么时候取走,这些都不是你关心的问题,这就是所谓的“异步”)。把邮箱拆了就叫删除邮箱。看看邮箱的编号,这叫做查询邮箱。
不同的操作系统会有不同的固定结构来存储数据,就比如说一个固定的盒子,μTenux的邮箱结构是一个铁盒子,而μC/OS-II是一个木头盒子,钉在墙上都可以放上标号,当做邮箱,这是区别一。
不同的操作系统中对邮箱做了不一样的解释,μC/OS-II认为邮箱只能容纳一则消息,消息没有取走,但是又有一条消息来,那原来的消息链就丢失了,想要存取多条消息?可以啊,你用消息队列呗!但是,μTenux不一样,它允许你存取多条消息,消息的长度是不受限制的。问题来了!用户说,你怎么知道我的消息有多大,你说内存允许就可以存取多条,我才不信呢!明明木头盒子和铁盒子一样嘛!大小没区别,凭啥你就实现了多条消息存取?莫非你的邮箱和μC/OS-II的队列一样?
NO!我可以明确的回答你。这是他们的区别二。我要重点分析一下μTenux的邮箱实现机制。
μTenux的队列和μC/OS-II的队列还是有区别的,这个是以后要论述的内容。μTenux的邮箱到底是怎样的呢?
首先,创建邮箱,这点基本上没啥区别。
    1.μTenux的建立邮箱函数API:            
            ID mbxid = tk_cre_mbx (T_CMBX * pk_cmbx);
            这个函数中ID是INT类型,新建的邮箱ID为1,依次累加,最大不会超过配置文件里的CFN_MAX_MBXID数量。pk_cmbx参数是用户要建立的邮箱需要的相关信息。T_CMBX的数据结构如下:
         typedef    struct t_cmbx {
                   VP    exinf;      /* Extended information */
                   ATR    mbxatr;      /* Mail box attribute */
                   UB    dsname;    /* Object name */
         } T_CMBX;
          exinf是一个void*类型的参数,可以存储扩展信息,这个扩展信息用邮箱查询函数式可以查到的。应用exinf这个参数可以实现更加灵活的功能,比如需要一个更大的空间来指示用户信息,或在邮箱建立后某些信息可能需要更改,则可以为其分配一片独立的空间,将内存的数据包的地址放置到exinf中。用户尽可以展开自己的想象力和创造力!
         mbxatr是邮箱的属性,这个参考用户内核手册吧,还有dsname,我比较懒,大家别怪偶~~~~~除非你比我更懒~~~~~~O(∩_∩)O哈哈~
    2.μTenux的删除邮箱函数API:
            ER 而成的= tk_del_mbx (ID mbxid);
            这个真没什么可讲的。
    3.μTenux的发送消息到邮箱的函数API:
            ER ercd = tk_snd_mbx (ID mbxid, T_MSG *pk_msg);
         !!!~~~~!!!!****** 重点在这了!!赶紧看过来!!!!!
         μC/OS-II发送消息的时候直接给消息指针就OK了,但是μTenux不是。μTenux是带有消息头的。消息头可以是T_MSG类型,也可以是T_MSG_PRI类型,然后才是你传入的消息指针。T_MSG和T_MSG_PRI的定义如下:
          typedef struct t_msg {
                         VP    msgque;    /* Area for message queue */
          } T_MSG;

          typedef struct t_msg_pri {
                        T_MSG    msgque;      /* Area for message queue */
                        PRI    msgpri;      /* Message priority */
          } T_MSG_PRI;
         你可以用偷梁换柱的方法将pk_msg定义为:
         typedef struct u_msg {
                         VP    msgque;    /* Area for message queue,as same as T_MSG */
                        UB*usrmsg;    /* Area for message pointer */
         } U_MSG;
         然后这样用:
      U_MSG sndmsg;
      ……………………
      sndmsg.usrmsg = "test*test*test*test*test....\n";
      ………………………………
      ercd = tk_snd_mbx(MbxID_S,(T_MSG*)&sndmsg);
      详细例子大家可以参考官方的release版本软件包。但是,这种使用方式大家必须知道,原因大家可以参考核心代码,我尽量简单扼要地、提纲挈领地、不遗余力地、干干脆脆地(O(∩_∩)O哈哈~,又犯病了~~~)给大家介绍其中的奥秘。邮箱结构里记录的永远是消息的地址,μTenux在记录的地址的同时在新进来的消息头上链入的下一个消息的地址,当然,如果这条消息没有优先级,它是排在队尾的,这个时候指针指向的就是它自己。所以,消息头是操作系统维护的,虽然消息头是用户给的空间,但是请不要更改,会爆炸的!!!!bomp!!!!
         哦~~~~~~~~大家恍然大悟,原来如此是吧!!!!!!既不会让操作系统增加负担,又实现了邮箱的多存多取,只不过链表要用户来维护。这点在用户手册里写得不甚明了,害得我看源代码看了三天,惯性思维害死人啊!!!!!μTenux这点强于μC/OS,但是又让人感觉μTenux有点儿霸道。知道了μTenux的小秘密是不是觉得很爽(源代码开源的,我这可不算泄密啊O(∩_∩)O~),别人不会用,现在你会用了是不是觉得很cool?我就是喜欢这种cool的感觉,同时也喜欢μTenux的霸道!!就像昨天李娜赢了莎拉波娃那场球,活就要活出自己的样子,有时候就是要霸道一些才能堵住无聊人的嘴!!!!(才思泉涌啊~~~~~受不了了~~~~~~o(╯□╰)o)
源代码中会有些地方用了强制类型转换,反正消息头部一定是链表指针就对了,我不在这里分析了,毕竟大家会用就行了,感兴趣自己研究源代码去,T/Kernel的代码经过了30年,实现的部分很多灵巧的地方值得称赞。
    4.μTenux的接收邮箱的消息函数API:
            ER ercd = tk_rcv_mbx ( ID mbxid, T_MSG ** ppk_msg, TMO tmout );
            这个函数大家看手册吧,(都下班了,我还在加班,原谅我的懒惰吧,我饿了~~~~),消息一出来,头部的链表为NULL,就是断链了,所以之前你如果发送消息的时候没有空出消息头,那么这次取出消息你就惨了,是个NULL!!O(∩_∩)O~
    5.μTenux的查询邮箱状态函数API:
            ER ercd = tk_ref_mbx ( ID mbxid, T_RMBX *pk_rmbx);
         这个也看手册吧~~~~~~~
有很多人问,操作系统是啥?嵌入式操作系统那么多?你们做的这个有啥意义?……………………
我就不一一回答了,人都是被逼出来的。你去问问JJ.L,他为啥写μC/OS,就是因为当时他所用的操作系统不稳定,开发人员水平还有限,他干脆自己写一个算了,发展到现在20多年,结果现在美国航空航天、生命攸关的系统都用了μC/OS。我们的μTenux性能和μC/OS-II相当甚至优于μC/OS-II,而且最重要的是开源免费,国人不是不喜欢交钱的东西又想让自己拥有的东西很有价值嘛!所以,μTenux出现了。我们用的是经历了30年考验的T-Kernel内核,前身叫做ITRON,如果说μC/OS现在是v3.0,那么μTenux就是v6.0了,这么比较可能有些片面,但是,性能好坏只有用过的人才有发言权,不是吗?
希望自己的努力能够换来回报,我们的团队啥都好,就是给的实习工资太低了,抱怨一下,希望老板别看见,看见了也不说是小阿奔说的~~~~( ⊙ o ⊙ )啊!肚子好饿~~~~~好像说是要和μC/OS-II对比,没写多少μC/OS-II邮箱的实现机制,感觉应该不难理解μC/OS-II的源码吧,大家自己分析吧,我的眼睛真得开始出现圈圈了~~~~~~~
如果有误请及时告知偶~~~~~

tiancaigao7 发表于 2013-1-26 08:47:55

貌似还没有普及吧。看了官方的论坛资料也很少,连用户指南都没有找到。

robin45853258 发表于 2013-1-26 20:54:47

tiancaigao7 发表于 2013-1-26 08:47 static/image/common/back.gif
貌似还没有普及吧。看了官方的论坛资料也很少,连用户指南都没有找到。

公司主页上资料还是蛮丰富的,有源代码,用户指南和内核规范以及实验教程都在发布的软件包里。tenux的论坛确实内容很少,因为没有人气,确实还没开始普及,知道的人不多。今年主页和论坛会改版,也希望吸引一些对操作系统感兴趣的人使用。现在uTenux已经成功移植在各大芯片厂商的主推芯片上,很多芯片厂商也很重视,估计你会在例如NXP或者ATMEL的日后软件包里看到uTenux。

robin45853258 发表于 2013-1-26 21:01:21

tiancaigao7 发表于 2013-1-26 08:47 static/image/common/back.gif
貌似还没有普及吧。看了官方的论坛资料也很少,连用户指南都没有找到。

哦,对了,可能是资料都包含在release的源代码里,您没有下载下来看吧。我贴一张V1.3.00r080的软件包资料目录。
这周末会有最新版本的uTenux的release源代码包。

i55x 发表于 2013-1-26 21:03:28

tiancaigao7 发表于 2013-1-26 08:47 static/image/common/back.gif
貌似还没有普及吧。看了官方的论坛资料也很少,连用户指南都没有找到。

http://www.t-engine.org/what-is-t-kernel/mt-kernel
这里可以找到用户指南,另外这个用户手册ZLG还真出版过,可惜无人问津,绝版了。

zhonggp 发表于 2013-1-26 21:49:10

不喜欢用这种操作系统,太规范太多臃肿的东西,一般是看几个操作系统然后按照自己需要的移植或者改写。mcu空间有限没有办法

liwei_jlu 发表于 2013-1-26 21:53:57

这本书当年被周立功忽悠的我买过。
本希望有对这个系统的的介绍和应用,看完后就是一个印象:就是一本API说明书。

这个系统以前关注过,后来不关心了,公司没有实力的话用不上。

i55x 发表于 2013-1-26 21:57:06

liwei_jlu 发表于 2013-1-26 21:53 static/image/common/back.gif
这本书当年被周立功忽悠的我买过。
本希望有对这个系统的的介绍和应用,看完后就是一个印象:就是一本API说 ...

对,周立功那本书就是官网《μT-Kernel Specification》直接翻译,特别没意思的一本书,感觉zlg一点诚意都没有。

tiancaigao7 发表于 2013-1-26 22:16:30

robin45853258 发表于 2013-1-26 21:01 static/image/common/back.gif
哦,对了,可能是资料都包含在release的源代码里,您没有下载下来看吧。我贴一张V1.3.00r080的软件包资料 ...

看了介绍,但是没有发现和ucos以及RTT相比有什么优势。当然版本号高,以及本土化这些都不算是优势。而且貌似这个OS还不支持同优先级的时间片轮换吧?这点ucosIII已经支持了。我感觉要想吸引新的用户,首先要给出一些具体的优势,比如稳定性,代码体积,执行效率以及新颖的功能(RTT很早就支持同优先级,而ucos一直到III的时候才支持)。

Xplain 发表于 2013-1-26 22:17:35

怎么不有MDK自带的RTX呢?有源代码,资料也全(MDK的帮助文件),以后做小东西,考虑用RTX

robin45853258 发表于 2013-1-27 18:55:27

哈哈,这么多反馈,太好了。其实,对于操作系统的研究我也才不长时间,所以要向各位大侠学习的东西还有很多。我也很赞赏RTT,看到RTT丰富的资料也在学习和测试。只有使用的人才有发言权,希望大家可以从各个方面说出自己的想法和看法。uTenux会一直吸取大家的反馈,它的出现自然会与其他操作系统有竞争,但是最直接的是给国内用户多了一个可供选择的高性能免费操作系统,RTT也要加油喽!
另外,我把大家的问题返回给uLoong了,王总一一作了解答。列出如下:
tiancaigao7 :貌似还没有普及吧。看了官方的论坛资料也很少,连用户指南都没有找到
->不知道他看的官方论坛的网址?在www.tenux.org有用户手册等各种文档直接下载的地方,当然在源代码包中也有。

i55x:http://www.t-engine.org/what-is-t-kernel/mt-kernel 这里可以找到用户指南,另外这个用户手册ZLG还真出版过,可惜无人问津,绝版了。
->光有用户指南使用起来还是不够的,而且这个是针对微处理器的T-Kernel的用户指南,ZLG翻译的也是这个。
    针对微控制器的uT-Kernel中文用户指南可以http://www.uloong.cc/cn/download/uTenux_Kernel_Spec.pdf下载到,另外,悠龙为了方便中国用户使用,还编写了实验教程、库函数说明书、讲义等文档,都可以在www.tenux.org下载到,也可以在下载的uTenux源代码包中找到。

zhonggp :不喜欢用这种操作系统,太规范太多臃肿的东西,一般是看几个操作系统然后按照自己需要的移植或者改写。mcu空间有限没有办法
->你可能是看的T-Kernel,因为是针对微处理器的,所以,有点大,方便得话,看一下uT-Kernel的中文用户指南(http://www.uloong.cc/cn/download/uTenux_Kernel_Spec.pdf),很简洁明了的,源代码在www.tenux.org官方网站可以下载到哦。

liwei_jlu :这本书当年被周立功忽悠的我买过。
本希望有对这个系统的的介绍和应用,看完后就是一个印象:就是一本API说明书。
->目前悠龙是国内唯一有实力提供技术支持和本地换代码的公司,为了方便中国用户使用,悠龙还编写了实验教程、库函数说明书、讲义等文档,包括开源免费的代码,都可以在www.tenux.org下载到。

i55x :对,周立功那本书就是官网《μT-Kernel Specification》直接翻译,特别没意思的一本书,感觉zlg一点诚意都没有。
->ZLG没有诚意,但悠龙有呀,目前悠龙是国内唯一有实力提供技术支持和本地换代码的公司,为了方便中国用户使用,悠龙还编写了实验教程、库函数说明书、讲义等文档,包括开源免费的代码,都可以在www.tenux.org下载到。

tiancaigao7 :看了介绍,但是没有发现和ucos以及RTT相比有什么优势。当然版本号高,以及本土化这些都不算是优势。而且貌似这个OS还不支持同优先级的时间片轮换吧?这点ucosIII已经支持了。我感觉要想吸引新的用户,首先要给出一些具体的优势,比如稳定性,代码体积,执行效率以及新颖的功能(RTT很早就支持同优先级,而ucos一直到III的时候才支持)。
->有道理,后继会陆续推出和uc/OS的对比分析和测试,新功能其实很多,这篇对比μTenux和μC/OS-II的消息邮箱的帖子(http://www.tecoss.org/viewthread.php?tid=4180&extra=page%3D1)可以先看一下,算是抛砖引玉吧。

Xplain:怎么不有MDK自带的RTX呢?有源代码,资料也全(MDK的帮助文件),以后做小东西,考虑用RTX
->RTX的MDK还有有很多问题,比如只能在MDK中使用,很多芯片厂商有自己的环境,就不能使用了;还有很多人使用IAR,也不能使用。
   除了环境限制外,芯片也受限制,比如没有延伸到Cortex A上的版本,对于一个公司来说,技术会复杂化,带来成本上升。
   还有就是功能太差了,不用说和uTenux对比了,就算和uc/OS对比,都显得很弱,而现在MCU的功能逐渐复杂化,RTX已经out了。
页: [1]
查看完整版本: 对比μTenux和μC/OS-II的消息邮箱