实验八:嵌入式 Linux 实验
一、实验目的
让学生了解操作系统的作用,交叉编译链工具的使用;linux操作系统的使用,掌握常见的指令使用,移植Linux内核 度。
二、实验内容
(1)移植嵌入式Linux 内核
(2)Linux常见shell命令使用
(3)Linux操作系统使用
(4)交叉编译链的使用
器材:1、装有Linux操作系统的PC机一台;
2、XSBase270或XSBase255 ARM实验开发平台一套
1.移植嵌入式Linux 内核
第1步、 从/pub/linux/kernel/v2.6下载linux-2.6.22.10.tar.bz2压缩文件(或光盘中提供);
第2步、 将linux-2.6.22.10.tar.bz2压缩文件复制到Linux工作目录(如root/work目录下);
第3步、 在Linux下利用tar jxvf linux-2.6.22.10.tar.bz2命令解压linux-2.6.22.10.tar.bz2压缩文件。
第4步、 进入解压后的linux-2.6.22.10目录下,利用vi编辑工具修改linux-2.6.22.10目录下的顶层Makefile文件。
第5步、 修改linux-2.6.22.10目录下的顶层Makefile文件,设置编译linux操作系统的CPU体系架构变量ARCH 和所使用的交叉编译工具链变量CROSS_COMPILE将linux-2.6.22.10目录下的arch/arm/configs/mainstone_defconfig
xsbase270_defconfig文件。
第6步、 将实验源码目文件复制为录下的\linux-2.6.22.10_patch\arch\arm\mach-pxa目录下的xsbase270.c文件复制到linux-2.6.22.10\arch\arm\mach-pxa目录中(注:xsbase270.c从该目录下的mainstone.c修改而来)。
第7步、 修改linux-2.6.22.10\arch\arm\mach-pxa目录下的Makefile文件,增加编译xsbase270.c的编译选项,即:obj-$ (CONGIG_MACH_XSBASE270 ) += xsbase270.o。 第8步、 修改linux-2.6.22.10\arch\arm\mach-pxa目录下的Kconfig文件,增加在裁剪内核时支持对EELiod/Liod平台的选择
第9步、 将实验源码目录下的\linux-2.6.22.10_patch\drivers\mtd\maps
xsbase270-flash.c文件复目录下的制到linux-2.6.22.10\drivers\mtd\maps目录中
第10步、 修改linux-2.6.22.10\drivers\mtd\maps目录下的
Makefile文件,增加编译xsbase270-flash.c的编译选项, 即:obj-$ (CONGIG_MTD_XSBASE270 ) += xsbase270-flash.o。
第11步、 修改linux-2.6.22.10\drivers\mtd\maps目录下的Kconfig文件,增加在裁剪内核时支持对EELiod/Liod平台flash驱动的选择
第12步、 将实验源码目录下的\linux-2.6.22.10_patch\include\asm-arm\arch-pxa目录下的xsbase270.h文件复制到linux-2.6.22.10\include\asm-arm\arch-pxa目录中。
第13步、 将实验源码目录下的\linux-2.6.22.10_patch\include\asm-arm\arch-pxa目录下的xsbase270.h文件复制到linux-2.6.22.10\include\asm-arm\arch-pxa目录中。
第14步、 修改linux-2.6.22.10\include\asm-arm\arch-pxa目录中irqs.h文件,在文件最后增加EELiod/Liod平台相关中断定义,内容如下。 #define XSBEDR_USBWAKE_IRQ IRQ_GPIO(1)
#define XSBEDR_USB2_IRQ IRQ_GPIO(9)
#define XSBEDR_ETH_IRQ IRQ_GPIO(10)
#define XSBEDR_CF_DETECT_IRQ IRQ_GPIO(12)
#define XSBEDR_AC97_IRQ IRQ_GPIO(13)
#define XSBEDR_CF_IRQ IRQ_GPIO(22)
#define XSBDVK_IRQ(x) (IRQ_BOARD_START + (x)) #define XSBDVK_ETH_IRQ IRQ_GPIO(10)
#define XSBDVK_2700G_IRQ IRQ_GPIO(12) #define XSBDVK_AC97_IRQ IRQ_GPIO(13)
#define XSBDVK_CF_IRQ IRQ_GPIO(22)
#define XSBDVK_MMC_IN_IRQ XSBDVK_IRQ(0) #define XSBDVK_MMC_OUT_IRQ XSBDVK_IRQ(1) #define XSBDVK_SIM_IN_IRQ XSBDVK_IRQ(2) #define XSBDVK_SIM_OUT_IRQ XSBDVK_IRQ(3) #define XSBDVK_USB_IN_IRQ XSBDVK_IRQ(4) #define XSBDVK_USB_OUT_IRQ XSBDVK_IRQ(5) #define XSBDVK_CF_IN_IRQ XSBDVK_IRQ(6) #define XSBDVK_CF_OUT_IRQ XSBDVK_IRQ(7) #define XSBDVK_SW1_IRQ XSBDVK_IRQ(8) #define XSBDVK_SW2_IRQ XSBDVK_IRQ(9) #define XSBDVK_SW3_IRQ XSBDVK_IRQ(10) #define XSBDVK_SW4_1_IRQ XSBDVK_IRQ(11) #define XSBDVK_SW4_2_IRQ XSBDVK_IRQ(12) #define XSBDVK_SW4_3_IRQ XSBDVK_IRQ(13)
第15步、 在linux-2.6.22.10目录下执行make xsbase270_defconfig。
第16步、 在linux-2.6.22.10目录下执行make menuconfig命令,进入内核配置主菜单。
第17步、 在内核配置主菜单中选择System Type---> Intel PXA2xx Implementations ---> Select target board 选择 (X) Emdoor EELiod/Liod Development Platform,该选项对应于第9步修改的内容。
第18步、 在内核配置主菜单中选择Device Drivers---> Memory Technology Device(MTD)support ---> Mapping drivers for chip access ---> 选择 (*) CFI Flash device mapped on Emdoor EELiod board,该选项对应于第12步修改的内容。
第19步、 在内核配置主菜单中选择Boot options--->(root=/dev/nfs ip=bootp console=tyyS0,115200 mem=64)改为root=/dev/mtdblock2 rootfstype=jffs2 console=tyyS0, 115200 mem=64M
第20步、 配置完成后,在提示是否保存内核配置的提示对话框中选择<Yes>。
第21步、 配置完成后,在Linux-2.6.22.10目录下运行make zIamge编译内核,编译后的内核文件保存在Linux-2.6.22.10/arch/arm/boot/目录下。
第22步、 将编译好的内核文件zImage下载到目标平台,(必须同时要下载Linux文件系统),重新启动开发平台,查看内核启动情况(注:需要利用所提供的bootloader程序来启动linux-2.6.22.10内核)。
内核的下载
4.1.2.1 、先在PC的Linux的根目录下建立一个“tftpboot”目录。
4.1.2.2 、把“EELiod/image”目录下的“zImage和rootfs.img”文件复制到“tftpboot”目录下。
4.1.2.3 、在Linux的终端下输入“minicom”打开minicom。
4.1.2.4 、重启目标平台,然后按一下键盘上的任一键进入到BootLoader的菜单。
4.1.2.5 、按键盘的数字键“2”选中选项2 ( [2] Bootp)。测试一下PC与目标平台网络握手是否成功。当出现“bootp pachet is not received.”时,说明网络没有连通。
4.1.2.6 、用“cat”命令查看一下“ect”目录下的bootptab文件,发现返回的mac地址与这个配置文件的mac地址不匹配。
4.1.2.7 、按键盘的数字键“0”选中选项0进入到命令行状态,在命令行状态输入“set myhaddr 123456789a00”,然后回车,把目标平台的mac地址设置与bootptab文件中的mac地址一致,再输入“quit”返回到菜单模式。
4.1.2.8 、按键盘的数字键“2”选中选项2 ( [2] Bootp)。测试一下PC与目标平台网络握手是否成功。当出现“reply pachet is
received ...”时,说明网络握手已成功。
4.1.2.9 、按键盘的数字键“3”选中选项3把内核映象文件(zImage)下载到目标平台的SDRAM中。
4.1.2.10、按键盘的数字键“4”选中选项4把内核映象文件(zImage)固化到目标平台的Flash中。
4.1.2.11、如果出现“error: timed out.”的错误,
出现上述现象时,请从如下几方面来寻找解决问题的思路: (1)、PC与目标平台的网线是否连接上。 (2)、tftp协议是否安装好,Linux系统的tftp的服务是否启动。 (3)、Linux系统和Windows系统的防火墙是否已关闭。 (4)、PC的IP与目档平台的IP是否在同一网段中,同时,网卡是否激活。
2. Linux常见shell命令使用
1、串口通信参数的设置
首先运行minicom,由于minicom是通过串口来工作的,所以要通过minicom程序来对串口通信参数进行设置。启动minicom的设置窗口:在linux的终端中输入“minicom –s”,然后,按下回车键。
[root@localhost root]# minicom –s
“-s”选项调出配置信息。
(1)、串口通信口的选择
接"A"键把光标移动到Serial Device。如果串口线连在PC
机的串口1上,则把Serial device设置为/dev/ttyS0。如果连在串口2上,则把Serial device设置为/dev/ttyS1,然后按下回车键。
(2)、串口参数的设置
按"E"键来设置通信波特率、数据位、奇偶校验位和停止位。可以通过按下不同的键来设置通信参数。例如XSBase270平台需要把波特率设为115200,数据位设为8,奇偶校验位设为无,停止位设为1。可以分别通过按"I"、"V"、"L"、"W"键设置波特率、数据位、奇偶校验位和停止位。设置完后按"Esc"返回。
(3)、数据流的控制选择
按"F"键可以完成硬件流控制切换,即完成"Yes"与"No"之间的切换。按"G"键完成软件流控制切换,即完成"Yes"与"No"之间的切换。下图显示的是串口配置好的后完整信息。
(4)、设置参数的保存与退出
配置完成后,按下“Esc”键,将会出现下图的配置菜单。选择“Save setup as dfl”按ENTER键来保存,当配置保存后,按下“Esc”键完成设置。
当minicom窗口出现后,重起XSBase270将会看到启动信息。如果没有出现启动信息,请检查 mincom的设置和线缆连接是否有错。
2、利用串口通信文件传输
在与目标板连接后,可以通过串口下传一些文件到目标板,具体操作步骤如下:
(1)、在与目标正确连接后,进入[root@51board~],按下CTRL+A键后,再按Z键,系统调出minicom的命令选项菜单; 其中Send files和 Receive files两项负责文件数据的传输,所用命令使用热键进行激活。如上传文件只需按S键。
(2)、当向目标板上传文件时,按S键,系统弹出串口通信协议选项,利用方向键选中zmodem传输协议,按回车键,进入文件选择菜单。
(3)、文件传输
文件选择菜单弹出后,利用空格键选中需要上传的文件,一次可以选择多个文件,选好需要传输的文件后按回车键,便可以进行文件数据传输。当数据传输完毕,系统会弹出传输完毕提示菜单。
二、网络文件系统nfs的配置
网络文件系统nfs可以将PC机上的一部分文件系统作为目标机的资源,这样可以弥补目标机存储空间的不足。在使用网络文件之时,应对网络文件配置进行一定的设置。
1、主机(host)的设置:
在主机/mnt目录下创建nfs目录,并利用文本编辑器编辑修改/etc/exports文件,增加如下内容:
/mnt/nfs (rw,no_root_squash)
将主机的/mnt/nfs目录设置为能够通过网络文件系统访问可读写的目标,
2、重新启动nfs [root@local]$ /etc/rc.d/init.d/nfs stop
[root@local]$ /etc/rc.d/init.d/nfs start
3、目标机设置(假设主机的IP地址为 192.168.1.12) [root@51Board~]$ portmap
[root@51Board~]$ mount –t nfs 192.168.1.12:/mnt/nfs /mnt
上述设置实现将主机上的/mnt/nfs目录挂载到目标机的/mnt目录下,并作为目标机文件系统的一部分。这时,可以将需要传输的文件或需要运行的程序保存在主机的/mnt/nfs目录下,然后在目标机对主机/mnt/nfs上的文件进行运行或复制等相应的处理。
三、ftp文件传输
文件传输协议ftp(File Transimit Protocol)利用以太网实现文件的传输。ftp相对于串口传输文件来说,传输速度快,所以上传比较大的文件一般采用ftp来实现,需要上传的文件应保存到主机的/var/ftp/pub目录下。下面具体介绍ftp文件传输过程(假设主机的IP地址为192.168.0.100)。
1、在目标板的调试终端输入ftp命令
2、输入用户名和密码:用户采用匿名登陆网络(anonymous),无需输入密码。如果用户需要采用其他的用户名登陆,必须修改(脚本)
3、当用户名和密码都正确后,在调试终端显示登陆成功信息和
ftp提示符,
4、文件传输:ftp提示符下利用cd命令转到主机的pub目录下,利用get命令上传需要传输的文件。假设需要上传的文件为facedect(确保文件保存在主机的/var/ftp/pub目录下) ftp>get facedect
文件传输完毕后,ftp输出成功信息和被传输文件的字节数。(
【实验内容】
一、minicom的使用实验内容
1、将目标机与PC机相连,利用minicom –s 正确设置串口的参数,启动目标机,记录PC机显示的内容
2、关闭目标板,利用minicom –s 重新设置串口参数,启动目标机,记录PC机显示的现象
3、利用串口通信向目标机下传光盘中example目录下的hello应用程序,同时运行该应用程序。记录文件下载在目标板目录和下载文件的基本步骤。
二、网络文件系统nfs的配置及应用实验内容
1、通过网络文件系统的配置将主机的其他目录(如/root/Emdoor目录),并挂载到目标机上,记录设置的步骤。
2、将主机example目录下的ARM程序hello复制到主机的网络文件系统目录上,在目标机的挂载目录运行该程序,记录运行结果并写出你的结论
3、将目标机其他目录上的文件复制到网络文件系统挂载的目录上,然后到主机上查看文件是否完成传输。
4、将主机上其他目录上的文件复制到网络文件系统挂载的目录上,然后到目标机挂载网络文件系统的目录中将该文件复制到目标机其他目录上,重新启动目标机系统查看文件是否复制成功。最后写出你的结论。
三、ftp实验内容
1、将example目录下的文件cxcore.lib文件通过ftp直接传输到目标板的/usr/lib目录下,记录通过ftp传输文件的基本步骤,并与通过串口传输文件进行比较,写下你的结论。
2、将目标板中/usr/lib目录下的一个文件传输到主机上,记录传输的基本步骤和文件传输所在的目录。
3. Linux操作系统使用
1、驱动程序介绍
驱动程序负责将应用程序如读、写等操作正确无误的传递给相关的硬件,并使硬件能够做出正确反应的代码。驱动程序像一个黑盒子,它隐藏了硬件的工作细节,应用程序只需要通过一组标准化的接口实现对硬件的操作。
2、Linux设备驱动程序分类
Linux设备驱动程序在Linux的内核源代码中占有很大的比
例,源代码的长度日益增加,主要是驱动程序的增加。虽然Linux内核的不断升级,但驱动程序的结构还是相对稳定。
Linux系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种。字符设备是指在存取时没有缓存的设备,而块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access)。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。 网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSD unix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据传递。系统有支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。
3、驱动程序的结构
驱动程序的结构如图1所示,应用程序经过系统调用,进入核心层,内核要控制硬件需要通过驱动程序实现,驱动程序相当于内核与硬件之间的“系统调用”。
内核模块
内核模块是Linux内核的重要组成要素,内核模块能在Linux系统启动之后能够动态进行装载和卸载, 因此不需对内核进行重新编译或重启系统就可将内核的一部分替换掉,Linux内核的所有设备驱动,文件系统,网络协议等可做成模块的形式来提供。在所有的模块中需记录编译的内核版本信息,并与当前执行的内核版本一致。即,模块具有版本依赖性,如果不一样就会出错,
当然可以在模块程序中的include<linux/module.h>之前通过宏定义#define__NO_VERSION__表明不定义模块的版本信息。
内核模块程序与一般应用程序之间主要不同之处是,模块程序没有main()函数,模块程序在装载时调用init_module(void)函数添加到内核中,在卸载时调用void cleanup_module( )函数从内核中卸载。另外一个应用程序从头到尾只执行一个任务,但一个模块可以把响应未来请求的事务登记到内核中,然后等待系统调用。
4、主、从设备号
应用程序通过设备文件系统(devfs)的名字(或节点)访问硬件设备,所有的设备节点在/dev目录下。利用mknod命令生成设备文件系统的节点,但只有超级用户才能生成设备文。Mknod命令必须要有设备名和设备类型,主设备号(Major Number),次设备号(Minor Number)等3个参 数。主设备号用于内核区分设备驱动,次设备号用于设备驱动区分设备。一个设备驱动可能控制多个设备。新的设备驱动要有新的主设备号。在内核源代码的Documentation /devices.txt中定义了所有设备的主设备号。在创建设备的时候不要与常用的设备好冲突。
下面/dev/hda1是设备名,b表示block设备(c表示字符设备)。127是主设备号, 1是次设备号。次设备号可以是0 – 255之间的值,限制为8bit。
[root@localhost]$ mknod /dev/hda1 b 127 1
[root@localhost]$ ls –al /dev/hda1
[root@localhost]$ brw-rw---- 1 root disk 3 1 Mar 25 12:00 /dev/hda1
5、驱动程序基本框架
如果采用模块方式编写设备驱动程序时,通常至少要实现设备初始化模块、设备打开模块、数据读写与控制模块、中断处理模块(有的驱动程序没有)、设备释放模块和、设备卸载模块等几个部分。
6、重要结构体
打开的设备在内核内部由file结构标识,内核使用file_operation结构访问驱动程序函数。file_operation结构是一个定义在<linux/fs.h>中的函数指针数组。每个文件都与它自己的函数集相关联。这个结构中的每一个字段都必须指向驱动程序中实现特定操作的函数.
File结构
File结构代表一个打开的文件。它在open时被内核创建,并传递给在该文件上进行操作的所有函数,直到最后的close函数。在文件的所有实例都被关闭之后,内核会释放这个数据结构。 结构在/linux/fs.h定义.
驱动程序中常用的函数
int xxx_open(struct inode *inode, struct file *filp);
int xxx_release(struct inode *inode, struc file *filp);
ssize_t xxx_read(struct file *filp, char *buff,size_t count,
loff_t *offp);
ssize_t xxx_write(struct file *filp, const char *buff, size_t count , loff_t *offp);
……
dri_arh模块加载实验
编写实验代码
#include <linux/string.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/fs.h>
static int __init dri_arch_init_module(void)
{
printk("This is a simple driver-module!\r\n");
return 0;
}
static void __exit dri_arch_cleanup_module(void)
{
printk("Goodbye driver-module!\r\n");
}
module_init(dri_arch_init_module);
module_exit(dri_arch_cleanup_module);
编译make
使用Makefile文件
CC =/opt/xscalev1/bin/arm-linux-gcc
INCLUDEDIR =
/root/xsbase/Xsbase270_Linux_F/Kernel/linux-2.4.21-emdoor/include
CFLAGS = -D__KERNEL__ -DMODULE -Wall -O2
CFLAGS += -I.. -I$(INCLUDEDIR)
DEBUG =
TARGET = dri_arch
OBJS = $(TARGET).o
SRC = dri_arch.c
All: dri_arch.o
dri_arch.o: dri_arch.c
$(CC) $(CFLAGS) $(DEBUG) -c -o dri_arch.o dri_arch.c
clean :
rm -rf *.o
下载目标代码到目标板,具体的操作参考使用手册相关部分 挂载目标代码,并查看输出调试信息,本次相关操作均要求到下载的当前目录(含dri_arch.o)
$insmod dri_arch.o (挂载dri_arch)
$lsmod (查看当前已挂载模块,会看到dri_arch)
$dmesg (查看模块输出信息:This is a simple driver-module!)
$rmmod dri_arch (卸载dri_arch)
$lsmod (查看当前已挂载模块,不再看到dri_arch)
$dmesg (查看模块输出信息:Goodbye driver-module!)
4. 交叉编译链的使用
(2)、交叉编译
将光盘提供的opencv-arm压缩文件解压到工作目录中(或将
源码opencv-0.9.7.tar.gz压缩文件进行解压,并修改configure文件),利用configure对系统进行配置,然后执行编译和安装命令。
[root@localhost opencv-arm]$./configure -–host=arm-linux
[root@ocalhost opencv-arm]$make
[root@ocalhost opencv-arm]$make install
执行make install命令后,OpenCV将编译好的的库文件保存在/usr/local/lib目录下,头文件被复制在/usr/local/include/opencv目录中。主要的库文件:libhighgui.so.0.9.7、libhighgui.la、libcxcore.so.0.9.7、libcxcore.la、libcvaux.so.0.9.7、libcvaux.la、libcv.so.0.9.7、libcv.la及相应的符号链接。
2、Qt集成开发工具的使用
(1)、新建工程文件
利用Qt开发应用程序,首先应建立一个工程文件,从File菜单选中New,从对话框中选中C++ Project 图标,按OK按钮将新建工程保存为test.pro(Qt工程的扩展名为.pro);Qt集成开发平台的运行界面如图6-1所示。
(2)、建立窗体和添加控件
选中File菜单中的New菜单,双击dialog图标,建立一个对话框图形界面,可以在属性编辑栏中修改窗体或控件的相关属性。根据设计需要,在窗体上添加一些常用如按钮、文本框等控件如图6-2所示。
(3)、保存窗体
选中File菜单中的Save菜单或工具条中的保存图标将新建的界面窗体保存为test.ui,用户界面窗体文件扩展名为.ui。
(4)、main.cpp文件自动配置
如果在工程中具有ui界面文件,Qt可以自动配置生成main.cpp文件,选中File菜单中的New菜单,双击C++ Main-File图标,Qt自动将当前窗体文件作为主界面,并自动生成main.cpp文件,如图6-3所示。
(5)、Qt的uic工具的使用
在嵌入式平台中无法对ui界面文件进行编译,因此Qt提供将ui文件转换成标准的C++头文件(.h)与实现文件(.cpp)的uic工具。uic工具还可以完成C++子类继承文件的转换和将图片文件转换成头文件的形式。现介绍利用uic工具将前面建立的test.ui文件转换成标准的C++头文件和实现文件(uic具体使用方法参考qt文档)。
? 生成C++头文件
[root@localhost test]$uic –o test.h test.ui
? 生成C++实现文件(.cpp文件)
[root@localhost test]$uic –o test.cpp –impl test.h test.ui
将ui文件转换为标准C++头文件和实现文件后,便可以利用转换后的C++头文件和实现文件替代原来的ui文件。
在工程预览中选中test.ui,单击右键,从弹出的菜单中选
中”remove form from project”菜单,移除Qt界面文件test.ui,然后选中Project菜单中的Add File菜单,将转换后的C++头文件和实现文件添加到工程中。如图6-4所示
(6)Qt应用程序的编译
? 基于PC平台的Qt应用程序编译
在PC平台编译Qt应用程序,只需利用Qt提供的qmake工具生成编译应用程序所需的Makefile文件,然后利用make命令对应用程序进行编译
[root@localhost test]$qmake –o Makefile test.pro
[root@localhost test]$make
编译成功后,可利用file命令查看编译的应用程序格式(如图6-5所示)并可直接在PC终端运行编译好的应用程序(如图6-6所示)。
程序在运行之前,需对QT环境进行配置。
[root$ 51board`]# export QTDIR=/usr/qpe
[root$ 51board`]# export LD_LIBRARY_PATH=/usr/qpe/lib:$LD_LIBRARY_PATH
[root$ 51board`]# ./test -qws
? 基于ARM平台的Qt应用程序编译
在编译基于ARM开发板的Qt应用程序时,应确保交叉编译工具arm-linux-g++在环境参数PATH中和tmake工具的正确配置(具体设置可参考系统提供的Linux用户手册和Qt移植实验)。
由于嵌入式平台中无法对ui界面文件进行编译,除了将ui界面文件转换为标准的C++文件之外,还要对利用Qt集成开发平台生成的工程文件进行修改,否则无法编译,Qt集成开发平台生成的原始工程文件test.pro内容为
SOURCES += main.cpp \
test.cpp
HEADERS += test.h
unix {
UI_DIR = .ui
MOC_DIR = .moc
OBJECTS_DIR = .obj
}
TEMPLATE =app
CONFIG += qt warn_on release
LANGUAGE = C++
修改后的工程文件内容为(黑体部分为新增内容,用于支持qtopia):
SOURCES += main.cpp \
test.cpp
HEADERS += test.h
TEMPLATE =app
CONFIG += qtopia qt warn_on release
LANGUAGE = C++
工程文件修改后,然后利用tmake工具生成用于编译应用程序的Makefile文件。
[root@localhost test]$tmake –o Makefile test.pro
[root@localhost test]$make
编译后,可用file命令查看编译的应用程序格式,如图6-5所示
(7)、嵌入式Qt应用程序的运行方法
? 测试程序下载运行
将编译好的ARM格式的应用程序test下载到开发板的/usr/qpe/bin目录下,并利用chmod命令修改test的属性
[root@bin]$chmod 755 test
在目标板的/usr/qpe/applications目录下新建一个test.desktop文件:
[Desktop Entry]
Comment=A Qt test Program
Exec=test
Icon=Clock
Type=Application
Name=Test
Name[zh_CN]=Qt测试程序
重启目标板,点击qtopia界面上的“Qt测试程序”便可运行测试程序
? 通过NFS运行测试程序