| Yangchun Luo さんのプロフィールAce of the ACESフォトブログリスト | ヘルプ |
|
6月1日 MiniGUI配置攻略Part 1 回顾 关键字:Linux 文件系统 好久没来更新这个东东了。主要是因为太忙加之前段时间目标不太明确,没有心情写东西。 这么写的话好像现在目标就明确了似的。等等,想一下,好像有点眉目但是又不太确定。总之,已经确定Linux是自己学习大方向了。 从上一次的日期来看已经有一个半月了。在这期间,熟悉Linux操作系统的任务基本完成,对其中一些较深入的东西也有了一定的理解。Windows和Linux的各有所长,对比它们的优缺点,可以加深对操作系统各个方面的理解。比如文件系统,熟悉Windows的人都知道,从Dos时代以来,C: D:等盘符就早已深入人心;而Linux/Unix则大相径庭。在Linux中,文件系统是一棵树而非Windows那样的“森林”。不管怎样进行分区、有多少个分区,所有的分区都是被挂载在一个目录树的结构上,而Windows的结构则像是每个逻辑盘都是一棵独立的目录树。在比如文件的权限问题,Linux继承Unix的优良传统,每个文件/目录都有一个9位的2进制数来代表其权限:头3位代表建立者自身,中间3位代表与建立者同一组的用户,最后三位代表其他用户;每3位的每个数从左到右依次代表“可读”、“可写”和“可执行”。这样系统管理员便可以有效地管理系统上每个用户的访问权限范围。 关于Linux系统暂且告一段落。
Part 2 开发与研发 关键字:如题 前端时间俱乐部内部有一次讲座,请一位研一的师兄来讲讲他在微软作实习生的见闻和经历。我觉得他最后谈到的“学些什么”对自己触动挺大的。那时我一心想做些实用的东西出来,像什么Win32下的应用程序、漂亮的图形界面,对课堂上的东西(计算机组成原理等)基础课一度觉得没啥意思,学了没啥用,又不能帮助搞开发。但是当我听到师兄讲起“开发”和“研发”两个词的时候才发现自己是多么幼稚!何谓“开发”,看看满大街的计算机软件工程师培训广告就知道了,什么叫“3个月学成Java软件工程师”等等乱其八糟的东西,不得不让人感到搞开发的门槛是如此之低啊…… 也正因为如此,才体现出“研发”的高人一等,学习一个IDE开发东西是如此之简单,但试想一下研究出一套行之有效的计算机语言呢?优化一个语言的编译器呢?或者说分析一个计算机体系的优劣呢?这显然不是几个月之内就可以速成的。这也就是那位师兄提到的“为什么外面的速成班没有教计算机体系结构,没有教汇编语言,没有教编译原理”的原因了,因为这些东西是不可能速成的!必须要有扎实的计算机基础才行。冰冻三日非一日之寒啊。软件学院和计算机学院的差别也就在此处。
Part 3 Linux嵌入式系统与MiniGUI 关键字:Intel开发板Linux 嵌入式系统 交叉编译 MiniGUI Windowsx.h 从3月份开始就接手一个Linux嵌入式系统上的开发工作。这个项目本来是我们俱乐部大四和大三的几个师兄在作,去年的暑假他们在这个系统下开发的基于无线射频标识(RFID)技术的物流管理系统参加全国比赛获得三等奖。这个比赛是由Intel公司赞助的,每两年一次,由于是在暑假的缘故,只能是当时大三的参加,而我现在大二正好赶上这个时机,当然不能错过了。 前期的工作是熟悉这套系统,至于参赛的具体课题则待定。由于是Intel赞助的,自然开发板也由Intel提供,名字叫Intel Sitsang/PAX255。从大四一师兄手上接过这个开发板的时候,第一感觉就是“好cool”的电路板啊!的确是块电路板,大部分线路都暴露在外面,上下用两个塑料板固定起来,内嵌一个触摸屏。整个大概是20cm*15cm*7cm,别看它小,但是五脏俱全,什么网卡、声卡、USB接口甚至红外线都一应俱全,据说还能支持无限网络技术,简直就是一个微型的PC机嘛! 4.1 Brief Introduction to Cross Compile 但是在上面开发程序,特别是图形界面的程序就远没有其灵巧的外观所显示的那么轻松了。首先,目标板的指令系统也PC机是不同的,所以,用普通的8x86编译器(比如gcc)生成的可执行文件在目标板上就不能执行,即使是都采用一个版本的内核的Linux。因此就需要按目标板所用的系统使用相应的编译器生成目标代码。理论上说可以在目标板上安装自身的C/C++编译器及相应的库文件,将源代码传到目标板上进行编译。但是既然身为“嵌入式操作系统”,顾名思义,系统本身所在的环境通常有一定的局限性,比如存储空间小,CPU的处理速度慢等等。所以直接目标板上进行编译是不合适的。解决的办法就是在PC机上开发源程序,并在PC上运行并调试,保证源代码级的正确性。通过之后,再利用专用的编译工具,在PC上生成目标板可以执行的代码,下载到目标板上就可以运行了。以上就是我对这种称为交叉编译的理解,由于还没学《编译原理》,可能还欠深入。 4.2 MiniGUI vs. Win32 这样的步骤完成之后,普通的字符程序就没有问题了。但是图形界面的程序本身是需要一定的库支持的,在目标板上执行也不例外。他们上次采用的图形库是Qt/Embody,但是有诸多的不便和缺点。比如Qt是基于C++的,不可避免会产生代码臃肿的问题,etc. 这次他们决定采用一种新的图形库MiniGUI来重写程序。MiniGUI是国内一家公司基于Linux开发的嵌入式系统图形库,可以运行在多种嵌入式系统上,Intel这款板子用的StrongARMS就是其中所支持的一例。官方文档上说了MiniGUI很多好处,但是我认为最吸引我的地方是MiniGUI的整体代码风格和体系是兼容Win32的!这样的好处就像雨轩所说的——一举两得。Win32下的编程是非常热门的,看看Windows所占有的市场分额就知道了。这样子学MiniGUI的API就不会觉得浪费,可以一举把Win32编程也学了,了了我一大心愿!再说市场上那么多讲解Win32编程的书中的代码只要更改少许就可以立即放到MiniGUI中编译通过,大大扩充了资料来源。很典型的一个例子就是,微软为Win32下的编程开发了windowsx.h,这个头文件包含了大量的宏定义(Macro),这些宏被设计用来处理Windows的消息,可以有效改善以往代码的可阅读性。因为窗体处理函数要处理大量的Windows消息,不可避免地会产生十分冗长的switch-case语句,严重的影响了程序的阅读。Windows.h把这些swith-case分别封装成一个个短小的宏,并使具体消息处理过程独立于主switch之外,使代码的可阅读性大为改观。(Windowsx.h的详细讲解参看SAMS公司出版的Teach Yourself Windows 95 Programming in 21 Days)但是MiniGUI的头文件中并不包含这个优雅的设计。于是本人分析MiniGUI和Win32代码的差异,发现在消息处理过程中只有唯一一个差别就是消息的定义Win32是WM_打头,而前者是以MSG_打头。于是很容易将这个头文件移植成MiniGUI可以接受的格式。而我确实是这么做的。而且在目标板上运行也通过了。小有点成就感,哈哈哈。 4.3 Building the Environment of Cross Compile for MiniGUI 其实整个过程到现在,编写程序代码并不苦难,难点也不多。最困难的地方在于在PC机上建立交叉编译环境和MiniGUI的开发环境及交叉编译环境。虽说手头上有官方文档,但是其中也有令人恼火的错误。而且这方面我一点基础一点概念都没有,可以说是白手起家,直到今天晚上之前一度非常郁闷。 小罗语录: 在错误中学习,在错误中提高。 Learn where error occurs, improve where mistake happens. 首先,将MiniGUI安装到PC机,即建立MiniGUI的PC运行环境。 这个过程完全按照Manual中的步骤进行。建立时一切正常,可是编译它提供的第一个例子就出问题了,不论如何都没法通过。后来上他们的官方论坛上查询了才知道,免费下载的版本中某些头文件并不包含,而这份Manual又是基于商业版的,其中的例子也是学要商业版中提供的头文件才能编译。无语了…… 根据论坛上的提示,找到一个供免费版使用的示例,这次编译通过了。接下来要提供MiniGUI的运行环境,一个工具叫qvfb,按照文档上的说法也是没法通过,后来我发现其中一个同名的目录中有可执行的文件,居然可以运行,考,那还干吗费心去编译它,直接用就行了。其间尝试了另外一种方法,打开了Linux对Framebuffer的支持。Ok, 第一步完成。 其次参照Intel的文档在PC的Linux环境下建立了字符界面的交叉编译环境。 这步比较顺利。不过在测试时遇到点问题,是关于目标板的。由于采用网络进行文件下载,而目标板的网卡有个毛病是对干扰非常敏感,在插上交流电源时几乎无法进行网络传输,这是我一开始完全没有想到。于是我试遍了所有可能的文件传输方法,ftp, nfs等,都是现学现用的。解决了文件传输的问题后,测试还是比较顺利,大概是这块板子上应经建立好了字符界面下的运行环境了吧。 接下来将MiniGUI的库交叉编译成目标版的格式。 这是所有步骤中最头疼的一步了!源于MiniGUI文档中一个致命的错误,使第一个操作就无法进行。为这个问题我冥思苦想了一个晚上(昨天),今天上午突然有了灵感:文档上的命令是 CC=arm-linux-gcc ./configure –target=arm-linux –prefix=/usr/local/arm-linux/arm-linux 这个命令只是指出了目标为arm-linux,而参看configure的帮助信息发现还有两个参数—build, --host。又是一番冥思,经过若干失败之后发现正确的命令应该是 CC=arm-linux-gcc ./configure –target=arm-linux –prefix=/usr/local/arm-linux/arm-linux –build=arm-linux –host=i686-pc-linux-gnu 这次算是通过configure了,紧接着make, make install. Ok pass. 用arm-linux-gcc工具交叉编译一个最简单的图形界面程序(指含一个MessageBox函数), arm-linux-gcc -o hello test.c –lminigui -lpthread 通过,窃喜。传到目标板上,运行,咦,缺少共享库,心情一下子沉下去了。 将其缺少的库从PC上拷贝过去,还是不行。还来问了师兄,原来库有一个默认的搜索路径。设置完搜索路径(/etc/ld.so.conf),运行,缺少MiniGUI的配置文件,赶紧再拷过去,运行,缺少资源文件,没辙,拷吧,运行-----------哇,居然开始有现实了,噢,我亲爱的MessageBox!!!! 当然心情的激动现在仍然记忆犹新。不过好景不长,虽然可以运行了,但是输入是个问题------程序没法接受输入!在分析文档,尝试,键盘弄出来了,但是鼠标动不了。这个地方特殊之处在于MiniGUI的配置文件中要指出鼠标的设备名称,但是目标板是采用的触摸屏,并没有鼠标,ft…… 再来研究一下硬件文档,原来/dev/input下有几个设备文件可能会对应鼠标,按文档上说的event0~event3试过了都不行,这在郁闷中的时候突然眼睛一亮,这个目录下不是还有一个叫mice的文件吗?mice?那不就是mouse吗?!晕,找了半天的mouse居然常在这么个地方,真是·#¥%……—!改完之后的结果是屏幕上用触摸板可以移动鼠标了,但是定位极不准确,而且还没有点击的功能。 以上就是到今天为止的进展情况。总体上来说的进展还是比较快的,前后在一个星期左右吧,如果能把鼠标定位和点击的问题完全解决了,再把适当的库拷到目标板上,交叉编译环境就基本上建立好了。剩下的工作就是用高级语言来实现图形界面了。这块相对比较熟悉。 Amen. コメント (6 件)
トラックバックこの記事のトラックバックの URL は次のとおりです。 http://sonic1984.spaces.live.com/blog/cns!91ACD1B2F5D8F2C7!182.trak この記事を参照しているブログ
|
|
|