LINUX嵌入式实验报告

更新时间:2024-03-27 00:52:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

LINUX嵌入式实验报告

目录

目录 ............................................................................................................. 1 实验一:嵌入式Linux开发流程 ............................................................. 2 实验二:嵌入式Linux开发环境搭建 ..................................................... 6 实验三:串行端口程序设计实验四:实验五:图形界面应用程序设计实验六:内核与根文件系统实验实验七:驱动程序设计实验实验八:无线通信实验

.................................................................. 11 A/D D/A接口实验 ................................................................... 16 .......................................................... 18 .......................................................... 23 .................................................................. 29 .......................................................................... 33

- 1 -

实验一:嵌入式Linux开发流程

一. 实验目的

了解嵌入式Linux的开发流程,会进行简单的开发。 二. 实验内容

进行Linux的开发流程的简单介绍。 三. 实验步骤

嵌入式Linux开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过以下过程:

建立开发环境,操作系统一般使用REDHAT-LINUX,版本7到9都可以,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(比如arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。 使用Linux的Red Linux 9的开发界面截图如下:

- 2 -

配置开发主机,配置MINICOM,一般参数为波特率115200,数据位8位,停止位1,无奇偶校验,软硬件控制流设为无。在WINDOWS下的超级终端的配置也是这样,MINICOM软件的作用是作为调试嵌入式开发板信息输出的监视器和键盘输入的工具;配置网络,只要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。 系统配置截图如下:

- 3 -

建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据自己具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如三星的ARM7、ARM9系列芯片,这样就需要编写烧写开发板上的flash的烧写程序,网络上有免费下载的WINDOWS下通过JTAG并口简易仿真器烧写ARM外围flash芯片程序。 ViVi运行的截图如下:

- 4 -

开发应用程序,可以下载到根文件系统中,也可以放在YAFFS、JFFS2文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于UCOS-II的方式。烧写内核,根文件系统,应用程序,发布产品。

- 5 -

实验二:嵌入式Linux开发环境搭建

一、 实验目的

了解并且掌握Linux的开发环境搭建方法。 二、 实验内容

进行嵌入式Linux开发环境搭建 三、 实验步骤

1. REDHAT LINUX 9.0的安装

在一台PC上安装RedHat LINUX9.0,选择Custom定制安装,在选择软件Package时最好将所有包都安装,需要空间约2.7G,如果选择最后一项:everything,即完全安装,将安装3张光盘的全部软件,需要磁盘空间大约5G。因此建议提前为REDHAT LINUX的安装项,留大约5—15G的空间,具体视用户的磁盘空间大小来确定,在安装完Redhat后还要安装Linux的编译器和开发库以及ARM-Linux的所有源代码,这些包安装后的总共需要空间大约为800M。 安装如下:

安装好的Linux如下;

- 6 -

2. 开发工具软件的安装

安装环境搭建如上。 3. 开发环境配置

配置网络,包括配置IP地址、NFS服务、防火墙。网络配置主要是要安装好以太网卡,对于一般常见的RTL8139网卡,READHAT9.0可以自动识别并自动安装好,完全不要用户参与,因此建议使用该网卡。然后配置宿主机IP为192.168.0.121。如果是在有多台计算机使用的局域网环境使用此开发设备,IP地址可以根据具体情

- 7 -

况设置,如图所示:

双击设备eth0的蓝色区域,进入以太网设置界面

对于REDHAT9.0,它默认的是打开了防火墙,因此对于外来的IP访问它全部拒绝,

- 8 -

这样其它网络设备根本无法访问它,即无法用NFS mount它,许多网络功能都将无法使用,因此网络安装完毕后,应立即关闭防火墙。

Minicom的配置如下:

- 9 -

四、实验总结

通过本次实验我学会了关于Linux配置的一些基本的应用,感觉收获特别大,这就算入门了。

- 10 -

实验三:串行端口程序设计

一、实验目的

了解在Linux环境下串行程序的基本方法。

掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用。 学习使用多线程完成串口的收发处理。 二、实验内容 读懂程序源代码,学习终端I/O函数的使用方法,学习将多线程编程应用到串口的接受和发送程序设计中。 三、预备知识 有C语言的基础

掌握在Linux下常用编辑器的使用。 掌握Makefile的编写和使用。

掌握Linux下的程序编译与交叉编译过程。 四、实验原理

异步串行I/O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连接线,最后用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。

上图给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶检验位将所传字符中“1”的位数凑成奇数个数或偶数个数。也可以也可以约定不要奇偶校验位,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才有发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50.95,110,150,300,600,1200,2400,4800,9600等。

接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误: 奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。 帧格式错:一个字符从起始位到停止位的总尾数不对。

- 11 -

溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。每一种错误都会给出相应的出错信息,提示用户处理。一般串口调试都使用空的MODEM连接电缆,其连接方式如下:

五、程序分析

本实验的代码如下: #include #include #include #include

#include #include

#define BAUDRATE B115200 #define COM1 “/dev/ttyS0” #define COM2 “/dev/ttyS1”

#define ENDMINITERM 27 /*ESC to quit miniterm*/ #define FAL SE 0 #define TRUE 1

volatile int STOP=FALSE; volatile int fd;

void child_handler(int s) {

print(“stop!!!\\n”); STOP=TRUE;

- 12 -

}

/*__________________________________________*/ Void* keyboard(void* date) {

Int c; For(;;){

c=getchar();

if(c=ENDMINITERM){ STOP=TURE; Break; } }

Return NULL; }

/*____________________________________________*/ /*modem input handle*/ Void* receive(void* date) {

Int c;

Printf(“read modem\\n”); While(STOP==FALSE) {

Read(fd,&c,1);/*com port*/ Write(1,&c,1);/*stdout*/ }

Printf(“exit form reading modem\\n”); Return NULL; }

/*__________________________________________________*/ Void* send(void* date) {

Int =’0’;

Printf(“send date\\n”);

While(STOP==FALSE)/*modem input handler*/ { C++; C%=255;

Write(fd,&c,1);/*stdout*/ Usleep(100000); }

Return NULL;}

/*_______________________________________________________*/ Int main (int argc,char**argv) {

- 13 -

Struct termios oldtio,newtio,oldstdio,newstdio; Struct sigaction sa; Int ok;

Pthread_t th_a;th_b,th_c; Void *retval* If(argc>1)

Fd=open(COM2,O_RDWR); Else

Fd=open(COM1,O_RDWR);//|O_NOCTTY|O_NONBLOCK); If(fd<0){

Error(COM1); Exit(-1); }

Tcgetattr(0,&oldstdio);

Tcgetattr(fd,&oldtio); /*save current modem settings*/ Tcgetattr(fd,&newstdio); /*get working stdio*/

Newtio.c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD; /*ctrol flag*/ Newtio.c_iflag=IGNPAR; /*input flag*/ Newtio.c_oflag=0; /*output flag*/

Newtio.c_lfag=0; Newtio.c_cc[VMIN]=1; Newtio.c_cc[VTIME]=0;

/*now clean the modem line and activate the settings for modem*/

Tcflush(fd,TCIFLUSH);

Tcsetattr(fd,TCSANOW,&newtio); /*set attrib*/ Sa.sa_handler=child_handler; Sa.sa_flags=0;

Sigaction(SIGCHLD,&sa,NULL);

Pthread_creat(&th_a,NULL,keyboard,0); Pthread_creat(&th_b,NULL,receive,0); Pthread_creat(&th_c,NULL,send,0); Pthread_join(th_a,&retval); Pthread_join(th_b,&retval); Pthread_join(th_c,&retval);

Tcsetattr(fd,TCSANOW,&roldtio); /*restore old modem setings*/ Tcsetattr(0,TCSANOW,&oldstdio); /*restore old tty setings*/ Close(fd); Exit(0); }

六、实验步骤 1.阅读理解源码

进入exp\\basic\\03_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。 2.编译应用程序 3.下载调试

- 14 -

切换到minicom终端窗口,使用NFS mount开发主机的/arm2410s到/host目录。进入exp\\basic\\03_tty目录,运行term,观察运行结果的正确性。 [root@zxt root]#minicom

[/mnt/yaffs] mount -t nfs -o nolock 192.168.0.56:/arm2410s /host [/mnt/ysffs]cd/host/exp/basic/03-tty/ [/host/exp/basic/03_tty].term Read modem

Send date

123456789:;<=>?@ABCDEFGHIGHLMNOPQRSTUVWX

由于内核已经将串口1作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。

Ctrl+c可使程序强行退出。

注意:如果在执行./term时出现下面的错误,可以通过我们前文提到的方法建立一个连接来解决。

/dev/ttySO:No such file or directory 解决方法:

[/mnt/yaffs]cd /dev

[/dev] ln -sf /dev/tts/0 ttySO (注意首字母是1,不是数字1)

- 15 -

实验四:A/D D/A接口实验

AD部分

一 实验目的

了解在LINUX环境下对S3C2410芯片的8通道10位A/D的操作与控制 二 实验内容

学习AD接口远离,了解实现AD系统对于系统的软件和硬件要求,阅读ARM芯片文件,掌握ARM的AD相关寄存器的功能,熟悉ARM系统硬件的AD相关接口uliyong外部模拟信号编程实现ARM循环采集全部前4路通道,并且在超级终端上显示。 三 实验步骤

1.进入/arm2410s/exp/basic/04_ad 目录,使用vi编辑器或者其他编辑器悦读理解源代码。 2.变异应用程序

运行make 产生ad可执行文件

[root@zxt/]#cd/arm2410s/exp/basic/04_ad/ [root@zxt04_ad]#make

armv41-unknown-linus-gcc-c-o main.o main.c

armv41-unknown-linux-gcc-o../bin/ad main.o-lpthread armv41-unknown-linux-gcc-o ad main.o-lpthread [root@zxt04_ad]#1s

Ad hardware.h main.oMakefile.bak s3c2410-adc.h Bin main.cMakefile readme.cxt src 3 下载调试

换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host 目录 [root@zxtroot]#minicom

[/mnt/yaffs]mount-tnfs-o nolock 192.168.0.56:/arm2410s/host [/mnt/yaffs]cd/host/esp/basic/04_ad/ [/host/exp/basic/04_ad]./ad Press Enter key exit!

a0=0.0032a1=3.2968a2=3.2968

我们可以通过调节开发板上的三个黄色的电位器,来看a0,a1,a2,的变化 DA部分 一 实验目的

学习DA转换原理

掌握MAX504DA转换芯片的使用方法

掌握不带有DA的CPU扩展DA功能的主要方法 了解DA驱动程序加入内核的方法 二 实验内容

学生DA接口原理,了解实现DA系统对于系统的软件和硬件的要求 三 实验步骤 1 阅读理解源码

进入/arm2410s/exp/basic/05_da 目录,使用vi编辑器或者其他编辑器阅读理解源代码 2. 编译应用程序

- 16 -

运行make 产生da可执行文件da_main [root@zxt/]#cd/arm2410s/exp/basic/05_ad/ [root@zxt04_ad]#make

armv41-unknown-linus-gcc-c-o main.o main.c armv41-unknown-linux-gcc da_main.o-o da_main [root@zxt05_da]#1s

da_main da_main.c da_main.o doc driversMakefile s3c44b0-spi.h 3.下载调试

切换到minicom终端窗口,使用NFS mount 开发主机的/arm2410s到/host目录然后进入 /host/exp/05_da/drivers目录,用insmod exio.o命令插入DA驱动,并且用1smod 命令 查看是否已经插入

[/mnt/yaffs]cd/host/esp/basic/05_ad/ [/host/exp/basic/05_ad]cd drivers/

[/host/exp/basic/05_ad、drivers]insmod exio.o Using exio.o

[/host/exp/basic/05_ad/drivers]1smod Module Sive Used bu Not tainted Exio 23840(unused)

I2c-tops2 141040(unused)

进入/host/exp/basic/05_da 目录,运行./da_main 观察运行结果的正确性, 在输入./da_main后会出现下面的提示信息 [/host/exp/basic/05_da]./da_main Error parameter Input as:

[~]./ad_main da_id num da_id:select between 0 and 1 num:range0.0~4.096

这是由于我们没有制定参数造成的,他的格式为./da_main[da的id号][数字],我们可以通过选择0或1来决定输出到开发板上的哪个DA接口,同时还需要在0.0~4.096V之间来选择一个输出电压,下面的例子是用了开发板上的DA0且输出1V的电压,我们可以使用万用表对其进行测量。

[/host/exp/basic/05_ad]./da_main0 1 CurrentVoltage is 1.000000v 四.实验总结

通过本次实验我了解到一些关于DA AD 的相关知识。

- 17 -

实验五:图形界面应用程序设计

一、实验目的

1. 了解在Linux下安装Qt以及Qt/Embedded的基本步骤; 2. 学会在Qt/E平台下使用Virtual framebuffer显示程序结果。

二、实验内容

1. 在Linnux下编译和使用Qt/E平台;

2. 在Qt/E平台下编译和运行一个程序使用Virtual framebuffer 显示运行结果。

三、实验步骤

该在Trolltech公司的网站上可以下载该公司所提供的Qt/Embedded的免费版本,在安装产品光盘以后,本次实验目录下已有要下载的文件,在/arm2410s/gui/Qt/src下。在做实验钱吧本次实验用到的三个文件拷贝到/root/2410sQt目录下。 [root@BC root]#cd/root/

[root@BC root]#mkdir2410sQt

[root@BC root]#cd/arm2410sQt/gui/Qt/src

[root@BC src]#cp-arftmake-1.13.tar.gz qt-embedded-2.3.10-free.tar.gz Qt-x11-2.3.2tar.gz/root/24110sQt 安装编译器arm-linux-gcc-3.4.1:

[root@BC src] #cd/arm2410s/gui/Qt/tools

[root@BC tools]#tar xjvfarm-linux-gcc-3.4.1.tar.bz2-C./

[root@BC tools]#vi/root/.bash profile//打开文件,将该文件中的PATH变亮改为PATH=$PATH:$HOME/bin:/arm2410s/gui/Qt/tools/usr/local/arm/3.4.1/bin/,存盘后退出。 [root@BC tools]#source/root/.bash profile

如果要正确安装的话,在任意路径下输入ar后按Tab键即可列出编译器文件。 Qt/Embedded平台的搭建需要以下几步: 1、安装Tmake

cd~/2410Qt—tar-xzftmake-1.13.tar.gz---exportTMAKEDIR=$PWD/tmake-1.13 2、安装Qt2.3.2

cd~/2410sQt—tar-xzftqt-2.3.2.tar.gz---exportTMAKEDIR=$PWD/qt-2.3.2 3、安装Qt/Embedded

cd~/2410sQt—tar-xzftqt-2.3.10-free.tar.gz---exportTMAKEDIR=$PWD/qt-2.3.10

环境变量的设置是非常重要的,它关系到能否正确的安装及编译这些安装包,下面介绍一下这些环境变亮:

TMAKEDIR:只想用于编译Qt/Embedded的Tmake工具 QT2DIR::指向qt-2.3.2的文件夹 QTEDIR::指向qt-2.3.10的文件夹 第二步,编译Qt/Embedded 1.Build Qt2.3.2 cd$QT2DIR

export TMAKEPATH=4TMAKEDIR/lib/linux-g++

- 18 -

exportQTDIR=$QT2DIR

export PATH=$QTDIR/bin:$PATH

exportLD_LIBbin/RARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH/configure-no-xft//出现选项时都要输入yes make

cp-artbin/uic$QTEDIR/bin/./configure是对Qt进行配置,它包括很多选项,例如可以通过添加“-no-opengl”等,如果想要进一步了解可以通过键入。/configure—help来获得更多的帮助信息。编译完成后需要将生成的/bin/uic复制到¥QTEDIR下创建的目录bin,因为在随后的编译Qt/Embedded的时候会用到这个工具。 2、Build Qvfb

export TMAKEPATH=$TMAKEDIR/lib/linux-g++ export QTDIR=$QT2DIR

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$ LD_LIBRARY_PATH

cd $QTESIR/tools/qvfb/root/2410s/tmake-1.13/bin/tmake-o Makefile qvfb.pro make

mv qvfb $QTEDIR/bin/

这一步build qvfb并建立了从Qt/Embedded2.3.10到Qt/Embedded2.3.2的静态的链接。其中qvfb工具用来生成Virtual framebuffer,这是一个非常有用的工具,它可以模拟在开发板上的显示情况,如果在Virtual framebuffer中运行没有问题的话,可以直接通过交叉编译在开发板上运行。

3. Build Qt/Embedded cd $QTEDIR

export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++ export QTDIR=$QTEDIR

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$ LD_LIBRARY_PATH ./CONFIGURE-NO-XFT-QVFB-DEPTHS4.8,16,32 YES

4. make在配置./configure中-qvfb用来支持Virtual framebuffer-depths4,8,16,32支持4位,8

位,16位,32位,的显示深度,此外还可以添加如-syestem-jpeg和-gif来提供对jpeg和gif的支持。配置系统同时还支持对特定平台系统选项的添加,但一般来讲,凡是支持framebuffer的linux系统都可以使用“linux-generic-g++”平台。详细的配置信息可以通过运行./configure—help命令来查看。

第四步,查看运行结果,如果上面各步都能够成功的编译通过,下面就可以通过运行Qt/Embedded自带的demo来查看结果。 在Virtual framebuffer上运行; export QTDIR=$QTEDIR

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$ LD_LIBRARY_PATH

cd $QTESIR/examples/launcher/qvfb-width640-height 480&sleep 10./launcher-qws 运行结果如下:

- 19 -

将上面的步骤完成后,沃恩就已经建立好了在本机上开发Qt应用程序的环境,下面我们通过编写一个“hello embedded”的程序来了解Qt 程序设计。 [root@BCqt-2.3.10]#cd/root/2410sQt/ [root@BC2410sQt]#mkdir exp [root@BC2410sQt]#cd exp [root@BC exp]#vi hello.cpp

使用VI编写文件hello.cpp,程序代码如下: //hello.cpp

#include #include

Int main(int argc,char**argv) {

QApplication app(argc,argv);

QLabel*hello=new QLabei(“hello qt/embedded”,0); App.setMainWidget(hello); Hello->show(); Return app.exec(); }

现在开始逐行讲解一下每一句的意思,中我了这些以后可以帮助我们更加了解QT的程序设计。

第1行和第二行包含了两个头文件,这两个头文件中包含qapplication和qlabel类的定义。 第5行创建了一个qapplication对象,用于管理整个程序的资源,它需要两个参数,因为qt本身需要一些明林行的参数。

第6行创建了一个用来显示hello qt/embedded!的部件。在QT中,都是一个可视化的用户接口,按钮,菜单,滚动条都是部件的实例。部件可以包含其他部件,例如,一个应用程序窗口通常是一个包含QMenuBar,QToolBar,QStatusBar和其他的部件。

- 20 -

在QLable含糊中的参数0表示,这是一个窗口而不是嵌入到其他窗口中的部件。 第7行设置hello部件为程序的主部件,当用户关闭主部件后,应用程序将会被关闭。 如果没有主部件的话,即使用户关闭了程序也会在后他继续运行。

第8行使hello部件可视,一百年来说部件被创建后都是被隐藏的,因此可以显示在前根据需要来定制部件,这样的好处是可以避免部件创建所造成的闪烁。第9行把程序的控制权交还给Qt,这时候程序就进入就绪模式,可视随时被用户行为激活,例如点击鼠标,敲击键盘等。

下面我们哟啊让我们的程勋运行起来,首先要让它能够在Virtual framebuffer中显示出来,然后再通过交叉编译在开发板上运行。要在本机的Virtual framebuffer中显示结果,下面几个步骤是必须的:

1. 生成工程文件(.pro)每一个qt程序都对应一个工程文件,因为tmake工具要借此

工程生成相应makefile文件。生成工程文件使用progen工具,他的位置在$tmakedir/bin下使用progen生成工程文件的方法如下:

$TMAKEDIR/bin/progen-tapp.t-hello.pro生成的这个hello.pro工程文件是可以被修饰的,可以编辑里面的头文件,源文件等内容。 2. 生成makefile文件

3. QT提供生成makefile文件的工具tmake,这极大地方便了应用程序的开发,节省了

大量的时间,而且还可根据不同平台的需要生成适合于不同平台的makefile文件。 在使用tmake工具前,必须查看相应的环境便令是否正确,由于我们要编译在本机上运行的QT程序,所以指定的编译器应为“linux-x86-g++”,在命令行中输入下面的命令来检查环境变量是否正确:

echo$TMAKEPATH查看返回的结果的结尾字符是否是“……/qws/linux-x86-g++”,如果不是的话,需要在命令行中重新设置TMAKEPATH export TMAKEPATH=/tmake的安装路径(如$TMAKEDIR)/lib/qws/linux-x86-g++此外还要使QTDIR指向QT/EMBEDDED的安装路径,如:export QTDIR=$QTEDIR或者直接指定路径export QTDIR=…/qt-2.3.10完成了上面的环境变量的设置,并用echo命令检查无误以后,就可以以使用tmake工具来生生我们需要的makefile文件,在命令行中如下命令:$TMAKEDIR/bin/tmake-0 Makefile hello.pro

完成上面的步骤以后就可以在当前的目录中生成一个makefile文件,关于makefigure文件的功能和结构这里就不在做过多的介绍了,可以参考前面的张杰来了解makefile。 最后在命令行中输入“make”命令就可以对整个程序惊醒编译连接了。最后生成一个二进制的可执行文件hello。用Virtual framebuffer显示效果如下:

我们可以通过对QLabel*hello QLabel(“Hello Qt/Embedded!”,0)这句话进行修改使我们的

- 21 -

程序显示起来更为美观,修改如下:QLabel*hello QLabel(“

Hello””Qt/Embedded!

”,0); 修改后显示效果如图所示:

四.实验总结

通过本次实验我学会GUI的基本设计,收获颇多。

- 22 -

实验六:内核与根文件系统实验

一.实验目的

了解Linux的内核与根文件的概念,学会他们的烧写。 二.实验内容

结合实验指导书进行内核与根文件系统的烧写。 三.实验内容

烧写Linux内核程序。

首先安装驱动程序,需要进行相关驱动的安装,点击添加硬件,如图所示:

选择下一步,截图如下:

- 23 -

添加Giveio

点击下一步安装

安装好了截图如图所示:

- 24 -

好了之后,需要烧写VIVI 使用CMD打开烧写程序

在此后出现的三次要求输入参数,第一次是让选择Flash,,选0,然后回车如图所示:

- 25 -

第二次是选择jtag对flash的两种功能,也选0,然后回车,如图所示:

第三次是让选择起始地址,选0,然后回车,等待大约3-5分钟的烧写时间,如图所示:

- 26 -

当VIVI烧写完毕后选择参数2,退出烧写。如图所示:

至此内核烧写完毕 四.烧写根文件系统

在vivi状态下,输入烧写根文件的命令为:tftp flash root root.cramfs. 如图所示:

- 27 -

至此根文件系统烧写完毕! 四.实验总结

通过本次的实验我学会了Linux内核的烧写和根文件系统的烧写,感觉linux学起来很难,以后会继续努力。

- 28 -

实验七:驱动程序设计实验

一.实验目的

学习在LINUX下进行驱动设计的原理; 掌握使用模块方式进行驱动开发调试的过程。 二.实验内容

在PC机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。 三.实验步骤

Linux中的驱动设计是嵌入式Linux开发中十分重要的部分,他要求开发者不仅要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口关系、考虑系统中对设备的并发操作等等,而且还要非常熟悉所开发硬件的工作原理。这对驱动开发者提出了比较高的要求,这个实验主要是给大家进入驱动设计提供一个简单入门的实例,并不需要提供太多与硬件相关的内容,这部分应该是通过仔细阅读芯片厂家提供的资料来解决。

驱动程序的作用是应用程序与硬件之间的一个中间软件层,驱动程序应该为应用程序展现硬件的所有功能,不应该强加其他的约束,对于硬件使用的权限和限制应该由应用程序层控制。但是有时驱动程序的设计是跟所开发的项目相关的,这时就可能在驱动层加入一些与应用相关的设计考虑,主要是因为在驱动层的效率比应用层高,同时为了项目的需要可能只强化或优化硬件的某个功能,而弱化或关闭其他的

- 29 -

一些功能;到底需要展现硬件的那些功能全都由开发者根据需要而定。驱动程序有时会被多个进程同时使用,这时我们要考虑如何处理并发的问题,就需要调用一些内核的函数使用互斥量和锁等机制。 驱动程序主要需要考虑下面三个方面:提供尽量多的选项给用户,提高驱动程序的速度和效率,尽量使驱动程序简单,使之易于维护。 Linux的驱动开发调试有两种方法,一种是直接编译到内核,再运行新的内核来测试;二是编译为模块的形式,单独加载运行调试。第一种方法效率低,但在某些场合是唯一的方法。模块方式调试效率很高,它使用insmod工具将编译的模块直接插入内核,如果出现故障,可以使用rmmod从内核中卸载模块。不需要重新启动内核,这使驱动调试效率大大提高。我们的实验在PC机和UP-NETARM2410-S上都可以运行,编译时使用不同的编译器就可以了。 1.阅读和理解源代码

进入/arm2410s/exp/drivers/demo,使用vi编辑器或其他编辑器阅读理解源代码。

2.编译驱动模块及测试程序

上面介绍了在Makefile中有两种编译方法,可以在本机上使用gcc也可以使用交叉编译器进行编译。 3.测试驱动程序

如果使用gcc编译的话,需要通过下面的命令来建立设备节点,如果使用交叉编译器的话,不需要建立设备节点。 #mknod/dev/demo c 2540

- 30 -

首先要插入驱动模块demo.o,然后可以用lsmod命令来查看模块是否已经被插入,在不使用该模块的时候还可以用rmmod命令来将模块卸载。

[root@zxt demo]#insmod demo.o

Warning:loading demo.o will taint the kernel:no license

See http://www.tux.org/lkml/#export-tainted for information about tainted modules

Module demo loaded,with warnings

下面使用测试程序来进行测试,按照上面步骤成功后会出现下面的结果:

[root@zxt demo]#./test demo Write 32 bytes data to /dev/demo 0:0 1 2 3 1:4 5 6 7 2:8 9 10 11 3:12 13 14 15 4:16 17 18 19 5:20 21 22 23 6:24 25 26 27 7:28 29 30 31

Read 32 bytes data from /dev/demo 0:31 30 29 28

- 31 -

1:27 26 25 24 2:23 22 21 11 3:12 13 14 15 4:16 17 18 19 5:20 10 9 8 6:7 6 5 4 7:3 2 1 0

如果模块没有成功插入的话,会出现下面的情况: [root@zxt demo]#./test demo ####DEMO device open fail####

在驱动模块成功插入后,会在/dev下面建立一个叫做demo的设备文件,我们也可以使用cat命令来直接调用read函数,来测试读过程。 [root@zxt demo]# cat/dev/demo Device open success!

- 32 -

实验八:无线通信实验

一.实验目的 掌握GPS通讯原理

学习NMEA0183 ASCII接口协议格式

学习Linux下对GPS通讯信息采发集的编程方法 二.实验内容

学习GPS通讯原理,阅读GPS模块的产品说明,了解模块的电气指标、串行接口连接方式、NMEA语句格式。通过软件来设置GPS模块的波特率、输出语句和初始化经纬度等内容。

编程实现对GPS通讯信息的采集方法,将接收到的数据进行语义的分析,并在LCD上显示当前的地理位置信息。 学习Linux GPS数据的解析过程。

GPS(Global Positioning System——全球定位系统)是美国从本世纪70年代开始研制,历时20年,耗资200亿美元,具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。 GPS的主要优点包括: (1)全球、全天候工作:

能为用户提供连续,实时的三维位置,三维速度和精密时间。不受天气的影响。 (2)定位精度高:

单机定位精度优于10米,采用差分定位,精度可达厘米级和毫米级。

- 33 -

(3)功能多,应用广:

目前已广泛的应用于大地测量、工程测量、航空摄影测量、运载工具导航和管制、地壳运动监测、工程变形监测、资源勘察、地球动力学等学科领域。

GPS由三个独立的部分组成:

空间部分:21颗工作卫星,3颗备用卫星。

地面支撑系统:1个主控站,3个注入站,5个监测站。

用户设备部分:接收GPS卫星发射信号,以获得必要的导航和定位信息,经数据处理,完成导航和定位工作。GPS接收机硬件一般由主机、天线和电源组成。

GPS定位原理:GPS定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置。如图所示,假设t时刻在地面待测点上安置GPS接收机,可以测定GPS信号到达接收机的时间

,再加上接收机所接收到的卫

星星历等其它数据可以确定以下四个方程式:

- 34 -

上述四个方程式中待测点坐标x、y、z和Vt为未知参数,其中

0di?c?ti(i?1,2,3,4)。di(i=1,2,3,4)分别为卫星1,卫星2,卫星3,

卫星4到接收机之间的距离。?ti?(i?1,2,3,4)分别为卫星1,卫星2,卫星3,卫星4的信号到达接收机所经历的时间。C为GPS信号的传播速度(即光速)。

四个方程式中各个参数意义如下: x,y,z为待测点坐标的空间直角坐标。

Xi,yi,zi(i=1,2,3,4)分别为卫星1,卫星2,卫星3,卫星4在t时刻的空间直角坐标,可由卫星导航电文求得。Vti(i=1,2,3,4)分别为卫星1,卫星2,卫星3,卫星4的卫星钟的的钟差,由卫星星历提供。Vt0为接收机的钟差。由以上四个方程即可解算出待测

- 35 -

点的坐标x,y,z和接收机的钟差Vt0.

目前GPS系统提供的定位精度是优于10米,而为得到更高的定位精度,通常采用差分GPS技术:将一台GPS接收机安置在基准站上进行观测。根据基准站已知精密坐标,计算出基准站到卫星的距离改正数,并由基准站实时将这一数据发送出去。用户接收机在进行GPS观测的同时,也接收到基准站发出的改正数,并对其定位结果进行改正,从而提高定位精度。 三.实验步骤 1.检查跳线

确定试验平台扩展槽上方JP1102/JP1103跳线位于2、3之间,跳线位为EXPORT;确定GPS/GPRS模块的JP201/JP202跳线位于模块外侧GPS端。 2.接入设备

关闭2410-S平台,将GPS天线连接到GPS/GPRS模块上,天线接收端置放在能良好接收室外信号的地方,比如说窗台,将模块插入2410-S扩展插槽。 3.编译程序

[root@localhost/]#cd /arm2410s/exp/basic/07_gps/ [root@localhost 07_gps]#make

armv41-unknown-linux-gcc -c -o mian.o mian.c armv41-unknown-linux-gcc -c -o gps.o gps.c

armv41-unknown-linux-gcc -o../bin/gps main.o gps.o-lpthread

- 36 -

4.运行程序

启动minicom,执行以下指令。

[/mnt/yaffs]mount -t nfs 192.168.0.33:/arm2410s /host //挂载主机目录,IP地址可变。

[/mnt/yaffs]cd/host/exp/basic/bin [/host/exp/basic/bin]./gps

此时可直接在minicom中看到试验结果。 通讯实验

确定试验平台扩展槽上方JP1102/JP1103跳线位于2,3之间,跳线为EXPORT;确定GPS/GPRS模块的JP201/JP202跳线位于模块上,将任意可用GSM手机SIM卡插入模块背面SIMCARD插槽内,将模块插入2410-S扩展插槽 编译程序

[root@localhost /]# cd /arm2410s/exp/basic/08_gprs/ //进入实验所在目录

[root@localhost 08_gprs]#make //编译实验内容生成可执行文件 armv41-unknown-linux-gcc -c -o main.o main.c armv41-unknown-linux-gcc -c -o tty.o tty.c armv41-unknown-linux-gcc -c -o gprs.o gprs.c armv41-unknown-linux-gcc -c -o keyshell.o keyshell.c

armv41-unknown-linux-gcc -o ../bin/gprs main.o tty.o gprs.o keyshell.o ../keyboard/key

- 37 -

board.o ../keyboard/get key.o -lpthread 5.观看实验结果 [1]give a call //拨号 [2]respond a call //接电话 [3]hold a call //挂断

[4]send a msg //发送短信(已定) [**]help menu Keyshell

- 38 -

本文来源:https://www.bwwdw.com/article/n19r.html

Top