Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1683064
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: 嵌入式

2009-11-26 21:42:18

  应用学生要求,将繁复的Qtopia 的ARM版程序发布整理一下.作为一个整体的章节推出.
  首先假设阅读者已经大体知道QT类库的使用,以及QT程序命令行开发流程(uic,designer,如何编译),并且设计好一些程序在Windows 桌面机上或Qtopia X11模拟器测试通过了.
 
   现在你接下来的任务的就是怎么把程序在ARM-LINUX上运行起来.本文内容主要就是讲述如何实现这一目标.
 
在ARM-LINUX上运行程序,必然是一个交叉编译的程序.因此你需要分别在桌面LINUX的准备好编译环境,以及在ARM-LINUX开发板上准备好运行环境.
  以下是我目前的编译环境.
    OS: RHEL 5. 编译器 arm-linux-gcc 4.3.2/4.3.2 (eabi版本)
    类库 qte 2.2 for arm
 
  运行环境是 s3c2440 开发板. arm-linux 2.6.30.
 
编译环境的安装与使用
   qtopia 是一个开源产品,只负责提供源码,并无技术支持或专门集成工具(这种情况在新版本得到改善了).但为方便开发使用.我们把类库和工具集放在了arm-qtopia-all-4.3.3.tgz这样压缩包里.简单安装就可以使用.
   在使用arm-qtopia 库前请安装 arm-linux-gcc 4.3.2或者更高版本.
 
   安装. tar xvzf arm-qtopia-all-4.3.3.tgz -C /
   这样所有工具,编译好的库及源代码都安装在 /arm-qtopia之下.
 
  编译程序流程.
    1.首先要在一个终端到/arm-qtopia目录下,运行用下列命令设置环境变量
       . set-env  #注意.与set-env之间空格.
    2.检查QTDIR是否指向/arm-qtopia/qt2
           echo $QTDIR
   
    3.创建针对arm-linux-gcc的Makefile
        3.1 如果是模拟器版本移植过来的项目,简单把Makefile 里的编译工具 CC/CXX由 gcc/g++改成arm-linux-gcc/arm-linux-g++即可.
        3.2 或者直接用tmake重新生成一个Makefile .这样Makefile里一般Makefile.
               tmake -o Makefile yourproject.pro
 
      如果一个项目Makefile 创建成功,就不必重复执行这一步了.
 
    4.编译 make
        注意因为Qtopia 程序过于复杂,不能直接用arm-linux-gcc 编译,需要用专门Makefile来编译.
      如果成功,此时应该看到一个arm 的程序了.可以用file 命令查看一下CPU.
 
  回顾一下这个流程,基本上跟x86-qtopia的流程是一样的,只是编译器与类库换成ARM版的.
 
    然后下一步就是把这个arm 版的Qtopia 程序放到ARM上调试了.
 
ARM板上Qtopia 程序运行
  ARM Qtopia 程序虽然复杂,但本质上也是一个调用很多so(动态库)的gcc 程序.因此在开发板的运行主要需要同时把qtopia 的库和程序一同放到开发板上.
 
   同时Qtopia 程序也有两种运行模式.一种是作为独立程序运行,完整占有整个设备的屏幕.这个一般在封闭式产品发布都是用这个模式,如ATM机,彩票机等.
   另外一种象利用qtopia 的桌面.把开发程序在放入Qtopia 环境中.用一个图标来调用,这个一般用于PDA,或智能手机桌面上.这个程序与其它程序共享桌面.我们下面分别讲解如果在ARM板上实现这两个模式.
 
独立运行模式.
  独立运行模式只需要在开发板上传输应用程序和Qtopia 的运行库和Qtopia 所需的字体.因为启动独立程序时需要配置一大堆环境变量,所以往往需要写一个shell 脚本来调用.
    如果是调试状态,这一些文件往往是拷入某一个NFS目录当中.独立运行一般需要字体在$QTDIR/lib/fonts下面. 还有一个是libqte.so,如果使用tslib来操作触摸屏,还需要libts.so.为了简化处理。你可以直接把$QTDIR/lib下的所以文件拷贝到到一个指定的NFS路径上。然后在运行脚本的环境变量指向这个库路径就行。
   cp -ra $QTDIR/lib /home/hxy/arm-qtopia/qt
上述命令把所有库文件,字体拷入到/home/hxy/arm-qtopia/qt目录下,以后就可以重复使用。
 
   然后写一个运行脚本。来把自已程序调用起来,假设这个程序叫 dialog.每种开发板都有大体上差不多的脚本格式。变化较大的是QTopia的输入设备的配置。
   一般嵌入式设备里,采用的输入设备主要有USB键盘和鼠标,以及触摸屏。不同开发板因为驱动的关系,会使用不同的设备结点文件来操作设备。比如USB鼠标,有的开发板配成  /dev/input/mouse,有的配成/dev/input/mice. 触摸屏也经常配成不同名字,大部分配置成 /dev/input/event0,有的采用原始数据的会配成 /dev/hs3600,或/dev/hs3600_tsraw .这个可以查询开发板的产商资料或者直接查看一下开发板上/bin/qtopia这个脚本里用了哪一个。并且到/dev目录下检查一下。对应文件是否存在。
 

 

export set QT_BASE=/mnt/arm-qt
#设置qtopia 发布目录
export set QTDIR=${QT_BASE}/qt

#---跟触摸屏相关库TSLIB的配置。告诉libts.so 使用哪一些配置--

#  触摸屏的设备结点
export set TSLIB_TSDEVICE=/dev/input/event0

#tslib 的配置文件路径
export set TSLIB_CONFFILE=/usr/local/etc/ts.conf

#tslib 插件目录

export set TSLIB_PLUGINDIR=/usr/local/lib/ts

#tslib 使用触摸屏定位文件路径。
export set TSLIB_CALIBFILE=/etc/pointercal

#告诉QTOPIA使用USB键盘。
export set QWS_KEYBOARD="USB:/dev/event1"

#告诉QTOPIA使用哪一个鼠标协议
export set QWS_MOUSE_PROTO="TPanel:/dev/input/event0"


#告诉应用程序从哪里去找Qtoptia的动态库。
export set LD_LIBRARY_PATH=$QTDIR/lib 

#执行Qtopia 程序

./dialog -qws &

 
 
   其中关于QWS_MOUSE_PROTO可以用如下取值。
 
  TPanel:/dev/hs3600_tsraw .使用用hs3600设备结点,
  USE:/dev/input/mice .使用USB鼠标
 
以下是在ARM板的运行效果图,注意在运行独立程序里,最好关闭Qtopia桌面,否则两个程序会互相争夺输入设备。
 
 
 
 
Qtopia桌面发布
 
   在Qtopia 桌面发布分为两个步骤。第一是把Qtopia 桌面本发在开发板进行发布。第二步是把应用程序加入到桌面当中。
  
    主要牵涉到QTE2库和桌面库(主要是libqtopia.so)库的发布
 
    一般是在/arm-qtopia/ 执行 make install,它将会在/arm-qtopia/qtopia/image下生成
 opt/Qtopia 目录,把这个目录拷贝到开发板上。
 
    如果中间有编译不成功,可以试着手动安装,即将qtopia 目录下列子目录。  
apps      etc       i18n      pics      services
    bin       help      lib       plugins   sounds
 拷贝到安装目录里去。然后把$QTDIR/lib也拷贝到lib下面。
 
   然后编写桌面的启动脚本。这个脚本跟独立运行的脚本很像,需要配置一些环境变量,只不过qtopia 桌面的可执行文件是qpe.
 
  

export set HOME=/root

#必设,告诉桌面,其QT根目录哪,按实际安装目录写
export set QTDIR=/opt/Qtopia

#必设,告诉桌面,其QTopia 桌面根目录哪,按实际安装目录写
export set QPEDIR=/opt/Qtopia

export set KDEDIR=/opt/kde

#设置桌面用的键盘

export set QWS_KEYBOARD="USB:/dev/input/event1"

#设置桌面的鼠标
export set QWS_MOUSE_PROTO="TPanel:/dev/input/event0 USB:/dev/mouse0"

#设置tslib 的参数
export set TSLIB_TSDEVICE=/dev/input/event0
export set TSLIB_CONFFILE=/usr/local/etc/ts.conf
export set TSLIB_PLUGINDIR=/usr/local/lib/ts
export set TSLIB_CALIBFILE=/etc/pointercal

#必设,告诉桌面运行从哪里找动态库
export LD_LIBRARY_PATH=$QTDIR/lib

#必设,告诉桌面调用可执行文件,从哪里路径执行
export set PATH=${QTDIR}/bin:${PATH}

#调用桌面,这里路径按实际路径设。
./arm-qtopia/qtopia/bin/qpe -qws

 
把程序加入到Qtopia桌面
 
   
 把程序加入桌面有如下几个步骤。
1.准备桌面图标(比较麻烦,一般建议用现成图 标)
2.编写一个桌面描述文件(.desktop文件)
3.把应用程序拷贝到指定目录。
 
假设这个桌面现在安装在/opt/Qtopia目录下。
  第一步因为需要制作不同尺寸的PNG图标,并且重编译Qtopia 的资源文件,比较费时。一般建议找现成图标即可。
 
 第二步,编译桌面描述文件,可以参考如下模板改写
 

[Desktop Entry]
Comment=my first Qtopia program #程序说明
Exec=myprog #你的执行文件名称
Icon=DateBook #图标资源名,建议采用现成图标
Type=Application #类型,不变
Name=hxyDemo  #显示在英文界面的图标下方的说明。
Name[ja]=カレンダー   #显示在日文界面的图标下方的说明。
Name[no]=Avtalebok
Name[de]=Termin kalender #显示在德文界面的图标下方的说明。
Name[hu]=Naptár
Name[zh_CN]= 我的演示 #显示在中文界面的图标下方的说明。

改写完成,将其拷入Qtopia 目录下的apps/Applications 目录,这样这个图标就会在桌面第一个页下显示。在本例子就是
   cp my.desktop /opt/Qtopia/apps/Applications
 
第三步:将程序拷入bin目录。
   
   cp myprog /opt/Qtopia/bin
 
 重启桌面后,就会看到图标。点击图标即可运行相应程序。
 
 
 
 
 
 
 
 
 
 
  
 
 
 
  
 
 
   
 
  
 
 
 
 
 
 
 
   
 
   
   
 
   
 
   
 

阅读(4040) | 评论(4) | 转发(1) |
给主人留下些什么吧!~~

bluedrum2011-08-19 15:31:24

chinaunix网友: 请问怎么关闭qtopia桌面.....
用PS查看qtopia几个进程号,用kill <pid> 杀死

bluedrum2011-08-19 15:29:59

chinaunix网友: 老师;我用Qt4的程序发布到qtoia桌面上,当出现图标后点击图标,然后他说缺少一些库文件,最后我把库文件也复制进去了。在点击程序提示:QWSDisplay::Data::init.....
检查调用程序一下用了 -qws参数没有,最大可能是这种情况

chinaunix网友2010-09-02 19:29:15

老师;我用Qt4的程序发布到qtoia桌面上,当出现图标后点击图标,然后他说缺少一些库文件,最后我把库文件也复制进去了。在点击程序提示:QWSDisplay::Data::init: Invalid argument Client can't attach to main ram memory. 这个应该怎么解决?

chinaunix网友2010-08-17 11:23:12

请问怎么关闭qtopia桌面