陈大煊吧 关注:379贴子:34,209
  • 18回复贴,共1

基于ARM9的嵌入式Qtopia-2.2.0开发环境的搭建和使用

只看楼主收藏回复

一、引言
绞车控制盒GUI界面显示绞车实时参数与视频监控,显示系统基于ARM9平台,预装嵌入式Linux操作系统。下面介绍Linux嵌入式开发中的桌面系统的移植与开发。
本移植是在TQ2440 ARM9平台上进行,系统Linux 2.6.30.4内核移植已经成功的基础上进行Qt桌面系统的移植。
Qt是一个完整的C++应用程序开发框架,具有良好的跨平台特性,其 API在所有平台上具有相同的调用形式。所以,Qt的程序开发与平台无关。
Qtopia-2.2.0是免费且自带桌面系统的版本,之后的Qtopia开始收费且与最新的Qt4库不兼容,应用代码需要重写。
Qt4库和Qt-Embedeed(以下简称QtE)是不带桌面系统的,如果需要桌面需要自己写。Qt4是没有桌面系统的,也就没有大家熟悉的桌面图标,只能通过Shell命令行运行。如果有桌面Qtopia的话,双击就能自动运行了。
最新版的Qt4只有一个类库(qt-everywhere),就是说不管你是在PC机还是在嵌入式平台上,不管在Windows还是X11 Linux还是Mac,用的都是同一个源码包,你可以根据需要用不同的配置选项,编译成某个平台上的版本。
由于Qt开发与平台无关,则PC平台上开发的程序能在ARM构架的芯片上运行,则需要交叉编译。


IP属地:上海1楼2013-06-21 10:56回复
    二、交叉编译环境建立
    2.1交叉编译环境简介
    交叉编译,简单的说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是,所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
    交叉编译是嵌入式开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成,一般把前者称为目标机(Host),后者称为主机(Target)。采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。
    我们在主机平台上开发程序,并在这个平台上运行交叉编译器,编译我们的程序;而由交叉编译器生成的程序将在目的平台上运行。当然,生成的程序在主机上是没法运行的。
    如下图,由file指令查看编译生成的x86平台程序RXpc和ARM平台程序RX的信息。可见,一个是Intel 80386,另一个是ARM平台,这两种格式是不能混用的。


    IP属地:上海2楼2013-06-21 10:57
    回复


      IP属地:上海3楼2013-06-21 11:04
      回复


        IP属地:上海4楼2013-06-21 11:05
        回复

          2.2 建立交叉编译链
          在业界广泛使用嵌入式 Linux 操作系统的今天,大多数交叉编译过程都是在 Linux PC 平台上完成。在某个运行 Linux 操作系统的 PC 上安装交叉编译工具链,并使用 GNU 提供的开发工具方便地开发和调试嵌入式应用软件。
          建立自己的交叉编译链,可以使用已经编译好的二进制格式文件,可以直接运行;也可以下载源码进行手动编译。
          最主要的是,建立的交叉编译工具版本号要与编译嵌入式Linux内核的交叉编译链版本号相同,否则,编译程序没法运行。
          本机预装Linux编译器版本为arm-linux-gcc-4.3.3,且出去应用角度考虑,这里下载已编译好的二进制格式使用。这里使用新版的arm-none-linux-gnueabi-gxx。4.3.3的交叉编译器使用EABI(Embedded Application Binary Interface)技术,它针对软件浮点数计算进行了优化,使用它编译出来的应用程序运行效率更高,但与老版本ABI(OABI)不兼容了,需要重新编译所有的程序。
          把交叉编译器的库(lib)的路径和头文件索引目录添加到系统PATH变量。在Bash Shell 下运行指令arm-linux-g++ -v,根据输出结果判断移植是否成功。


          IP属地:上海5楼2013-06-21 11:05
          回复

            三、Qt4的编译
            Qt是一个跨平台的开发工具,具有很好的移植性,它所依赖的库文件在PC机上和在ARM上是不一样的 ,所以,第一:ARM的CPU的指令集和PC的CPU指令集肯定是不一样的,也就是需要交叉编译。第二:由于Qt所依赖的库文件不一样,在不同的指令集得CPU里,库是需要移植的。很简单,就得重新编译已经写好的Qt程序。
            qt-everywhere-opensource-src-4.8.4.tar.gz为Qt的源码包,用来编译各种Qt的库等,这里需要编译三次,分别为x11版本,embedded版本和arm版本。编译x11版只是为了得到qvfb工具,至于qvfb的用途后面自会说明;embedded版本为Qt 的嵌入式版本,将来和qvfb配合使用;arm版本很好理解,即要放到开发板上的东西。


            IP属地:上海6楼2013-06-21 11:05
            回复

              3.1 x11平台Qt4.8.4编译
              首先编译x11版本。主机系统安装了Ubuntu 13.04系统。
              安装步骤:
              (1) Step 1: Unpacking the Archive解压源文件
              cd ~/tmp
              tar zxvf qt-everywhere-opensource-src-4.8.4.tar.gz # unpack it
              则在当前目录建立了目录tmp文件夹,解压文件到/tmp/qt-everywhere-opensource-src-4.8.4文件夹。
              (2) Step 2: Building the Library 创建Qt库
              cd ~/tmp/qt-everywhere-opensource-src-4.8.4
              ./configure
              这个步骤时间比较快,大约4分钟时间完成。配置没有错误的情况下,则入下一步指令创建Qt库、编译example demo等:
              make
              make指令执行时间比较长,具体与个人电脑配置有关,如果没有错误,大约2-3个小时完成。
              以上步骤正确完成的情况下,安装Qt。软件默认安装位置/usr/local/Trolltech/Qt-4.8.4。如果需要变更安装位置,则在配置阶段使用—prefix指定目标安装位置即可。执行:
              sudo make install
              根据要求输入用户密码安装即可。
              (3) 添加系统路径PATH变量
              为应用中方便,把Qt路径添加到系统PATH是有必要的,比如qmake指令,添加PATH之后直接输入qmake –v即可查看发行版本号,如果不添加PATH,则要使用绝对路径来使用命令。
              根据Ubuntu 13.04的特点,在用户登陆阶段添加用户变量即可。在当前用户目录下有.pdofile文件,这个Bash脚本文件在用户登录时运行一次。在其文件尾部添加如下指令:
              PATH=/usr/local/Trolltech/Qt-4.8.4/bin:$PATH
              export PATH
              x11版本Qt安装成功。Qt Creator安装后进行相关的配置即可。


              IP属地:上海7楼2013-06-21 11:06
              回复

                3.2 ARM平台Qt4.8.4编译
                与x11平台编译相同,但需要修改一些配置参数来达到交叉编译的目的。Configure参数如下:
                ./configure -prefix/usr/local/Trolltech/QtEmbedded-4.8.4-arm -release -shared -little-endian -no-qt3support -no-libtiff -no-libmng -qt-libjpeg -qt-gif -qt-zlib -qt-libpng-no-freetype -no-openssl -nomake examples -nomake demos -nomake tools-optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 4,8,16,32 -qt-mouse-tslib-I/usr/local/tslib/include -L/usr/local/tslib/lib
                其中关键设置在-xplatform qws/linux-arm-g++ 和 -embedded arm,其它的表示Qt相关模块的选择,可根据应用需求进行裁剪。
                -xplatform 参数制定需要的系统,有qws文件夹有相关平台的编译选项,ARM平台编译器设置为arm-linux-gxx,修改文件内容为:
                # modifications to g++.conf
                QMAKE_CC = arm-linux-gcc
                QMAKE_CXX = arm-linux-g++
                QMAKE_LINK = arm-linux-g++
                QMAKE_LINK_SHLIB = arm-linux-g++
                # modifications to linux.conf
                QMAKE_AR = arm-linux-ar cqs
                QMAKE_OBJCOPY = arm-linux-objcopy
                QMAKE_STRIP = arm-linux-strip
                当然,这里可以正确找到指令的前提是在交叉编译链环节设置了正确的路径。编译时间与x11平台差不多。


                IP属地:上海8楼2013-06-21 11:06
                回复


                  IP属地:北京12楼2013-06-21 12:39
                  收起回复
                    有本事把我优盘修好?


                    来自Android客户端13楼2013-06-21 12:48
                    收起回复


                      IP属地:陕西15楼2013-06-21 17:04
                      回复


                        16楼2013-06-22 18:56
                        回复


                          IP属地:上海17楼2013-06-29 10:38
                          收起回复