嵌入式Linux自学阶段性总结(1)

2019-07-12 18:15发布


嵌入式Linux自学阶段性总结
Leo Chang QQ:278475286 MSN:zhenzhen365@hotmail.com 欢迎从事嵌入式linux图形及设备驱动开发的朋友交流!
最近自学嵌入式linuxqt/e qtopia和设备驱动开发,短短的几个月,遇到了一大堆问题,查找资料然后思考,消耗了大量的脑细胞,不过还是有收获的,最终把路终于走通了就好。最终还没有来得及实现s3c24xx-uda1341-iis-L3alsa驱动,但是内核和设备驱动的概念也慢慢清晰了,希望有大虾帮助我,加快自己的进度。致谢! 下面把自己一些新的简要的说说,希望对也和我一样的新手有所帮助,别向我一样绕了大圈子才找到路。 qt/eqtopia移植及编译
  1. qt/x11, qt/eqtopia coreqtopia的关系

一般意义上的qt指的是依赖x11库,不依赖于framebuffer,直接运行在x86等主机上的qt版本,我下载使用的是qt-x11-opensource-src-4.4.3.tar.gz qt/e,qt for embedded linux版本,是不依赖x11库,运行在支持framebuffer的嵌入式系统上的版本,底层直接在framebuffer上绘制图像,同时可以根据硬件环境定制是否支持窗口UI部件、图形、图片等功能,或者他们的显示样式,这样来减小qt/e体积,提高运行效率。这些feature可以在src/corelib/global/目录中,仿照qfeatures.h中的宏定义来配置,还可以使用qt/x11源码下tools/qconfig/下工程编译出来的qt/x11可执行程序qconfig来图形化配置qt/e的特征。 qtopiaqt/e的关系,类似于微软的Visual C++Win32 APIVC开发的应用可以在在Windows窗口环境运行,而基础是Win32 API,VC是开发SDK或者IDEQtopia是一个运行在主机上用于开发嵌入式图形环境下应用程序的开发环境,而这个嵌入式图形环境,就是交叉编译Qtopia时编译出来的可执行文件qpeqpe 是嵌入式系统上的图像外壳,包含了许多现成的工具,比如文件管理、记事本、播放器等,采用qt/e开发。它的核心是qtopia core,也就是qt/e。不过对于手机和PDA等嵌入式产品,这个qt/e中,相比较qt/x11,删减了很多复杂的UI部件和显示样式。最终qtopia交叉编译后,生成了可执行程序qpe(qt phone edition, qtopia4之前有pdaphone两个版本,现在只有phone版本的qpe,典型的就是greenphone). 我们可以基于qt/e开发应用,脱离qtopia直接运行在嵌入式linuxframebuffer上,x需要linux内核支持framebuffer.这个在linux内核中make menuconfig图形化配置的时候,需要在graphic display中选择上。普通的qte应用程序和qpe, 不同的是运行命令不同,运行基于qt/e的程序,ourapp -qws, 而运行qtopia /qtopiadir/bin/qpe -qws,当然运行前要设置库等环境变量。qt/e包含qt/e交叉编译的库,qtopia需要包含qtopia交叉编译的库。这下就能理解qt core/qte开发的程序怎么样在开发板的linux上跑了,和运行qpe是类似的。当然,也可以开发运行在qtopia上跑的应用,比如运行在greenphone上的,这种程序的界面就不如普通的qte开发的丰富,显而易见,手机界面没有那么多按键. 在主机上开发qt/eqtopia应用,交叉编译的方法命令也不一样,qt/e用: qmake make qtopia应用开发: qtopiamake make make install 最后一个make install,可以直接把你的qtopia应用安装到编译出来的嵌入式图形环境中,使得在Applications窗口下,可以出现你的程序图标,双击运行。注意,这些命令make的时候,都不需要指定交叉编译起连接器,例如:make CC_FOR_BUILD="arm-linux-gcc" CC="arm-linux-gcc" LD="arm-linux-ld" CPP="arm-linux-g++ -E" AR="arm-linux-ar rc",应为这个选项已经应编码到了qmakeqopiamake中,在其生成的Makefile中已经自己设置好了。
下载相关原代码地址: ftp://ftp.trolltech.com/qt/source/ qt-x11-opensource-src-4.4.3.tar.gz qt-embedded-linux-opensource-src-4.4.3.tar.gz qtopia-opensource-src-4.3.2..tar.gz
  1. -prefix -image -sdk三个路径理解

在配置qtopia-4.3.2时,理解configure -image /opt/qtopia/target -prefix /opt/qtopia/target -sdk /opt/qtopia/sdk/4.3.2/qq2440三个路径非常重要。查看源码doc/下的文档,-image指定了在交叉编译的主机上存放将来要nfs挂载或者烧到开发板上去所有文件的目录,-prefix指定了qtopia编译出来的qpe在运行目录,也就是要把-image目录下的所有东西挂载或者考到开发板上的-prefix目录才能正常运行,注意,这个-prefix已经硬编码到了程序中,不可以改变。另一个-SDK目录,指定了主机上用于开发qtopia应用所必须的工具链和库的一个基准路径,就是说,指定了这个目录,运行-SDK下的qmake或者qtopiamake,就不用自己设置系统的环境变量中包含其他的库了。如果只设置了-prefix目录,那么默认的-image也是,-SDK默认的是编译build的目录。此build目录不能为源码目录,应该在其他新建的目录中运行源码包中的configure配置脚本。
  1. 交叉编译器和主机编译器的问题
嵌入式开发中,要时刻注意编译器的版本问题,否则一连串莫名其妙的问题会使人崩溃。仔细看看qtopia或者qt/e的文档,选择推荐的编译器版本。ubuntu8.10自带的GCC4.3.2版本太高,对于代码的错误处理过于严格。于是重新安装qtopia4.3.2推荐的GCC3.4/GCC4.1(uses symbol visibility): apt-get install g++-4.1 rm /usr/bin/gcc ln -s /usr/bin/gcc-4.1 /usr/bin/gcc rm /usr/bin/g++ ln -s /usr/bin/g++-4.1 /usr/bin/g++
注意:如果只把gcc版本换掉,还使用原有的g++,也会出现问题,可以直接安装g++-4.1,附带着就安装了相同版本的gcc.然后把/usr/bin/gccg++的软连接从原来的gcc4.3.2换到新的上。交叉编译器,我采用当下流行的arm-linux-gcc-3.41版本,没有出大问题。