LINUX嵌入式实验报告.docx
《LINUX嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《LINUX嵌入式实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
![LINUX嵌入式实验报告.docx](https://file1.bdocx.com/fileroot1/2023-6/16/21439e8b-3b2a-4b10-8968-de1c5072e31d/21439e8b-3b2a-4b10-8968-de1c5072e31d1.gif)
LINUX嵌入式实验报告嵌入式实验报告LINUX嵌入式实验报告LINUX嵌入式实验报告实验一:
嵌入式Linux开发流程一实验目的了解嵌入式Linux的开发流程,会进行简单的开发。
二实验内容进行Linux的开发流程的简单介绍。
三实验步骤嵌入式Linux开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过以下过程:
建立开发环境,操作系统一般使用REDHAT-LINUX,版本7到9都可以,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(比如arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。
使用Linux的RedLinux9的开发界面截图如下:
配置开发主机,配置MINICOM,一般参数为波特率115200,数据位8位,停止位1,无奇偶校验,软硬件控制流设为无。
在WINDOWS下的超级终端的配置也是这样,MINICOM软件的作用是作为调试嵌入式开发板信息输出的监视器和键盘输入的工具;配置网络,只要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。
系统配置截图如下:
建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据自己具体芯片进行移植修改。
有些芯片没有内置引导装载程序,比如三星的ARM7、ARM9系列芯片,这样就需要编写烧写开发板上的flash的烧写程序,网络上有免费下载的WINDOWS下通过JTAG并口简易仿真器烧写ARM外围flash芯片程序。
ViVi运行的截图如下:
开发应用程序,可以下载到根文件系统中,也可以放在YAFFS、JFFS2文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于UCOS-II的方式。
烧写内核,根文件系统,应用程序,发布产品。
实验二:
嵌入式Linux开发环境搭建一、实验目的了解并且掌握Linux的开发环境搭建方法。
二、实验内容进行嵌入式Linux开发环境搭建三、实验步骤1.REDHATLINUX9.0的安装在一台PC上安装RedHatLINUX9.0,选择Custom定制安装,在选择软件Package时最好将所有包都安装,需要空间约2.7G,如果选择最后一项:
everything,即完全安装,将安装3张光盘的全部软件,需要磁盘空间大约5G。
因此建议提前为REDHATLINUX的安装项,留大约515G的空间,具体视用户的磁盘空间大小来确定,在安装完Redhat后还要安装Linux的编译器和开发库以及ARM-Linux的所有源代码,这些包安装后的总共需要空间大约为800M。
安装如下:
安装好的Linux如下;2.开发工具软件的安装安装环境搭建如上。
3.开发环境配置双击设备eth0的蓝色区域,进入以太网设置界面对于REDHAT9.0,它默认的是打开了防火墙,因此对于外来的IP访问它全部拒绝,这样其它网络设备根本无法访问它,即无法用NFSmount它,许多网络功能都将无法使用,因此网络安装完毕后,应立即关闭防火墙。
Minicom的配置如下:
四、实验总结通过本次实验我学会了关于Linux配置的一些基本的应用,感觉收获特别大,这就算入门了。
实验三:
串行端口程序设计一、实验目的了解在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等。
接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:
奇偶错:
在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。
帧格式错:
一个字符从起始位到停止位的总尾数不对。
溢出错:
若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。
每一种错误都会给出相应的出错信息,提示用户处理。
一般串口调试都使用空的MODEM连接电缆,其连接方式如下:
五、程序分析本实验的代码如下:
#include#include#include#include#include#include#defineBAUDRATEB115200#defineCOM1“/dev/ttyS0”#defineCOM2“/dev/ttyS1”#defineENDMINITERM27/*ESCtoquitminiterm*/#defineFALSE0#defineTRUE1volatileintSTOP=FALSE;volatileintfd;voidchild_handler(ints)print(“stop!
n”);STOP=TRUE;/*_*/Void*keyboard(void*date)Intc;For(;)c=getchar();if(c=ENDMINITERM)STOP=TURE;Break;ReturnNULL;/*_*/*modeminputhandle*/Void*receive(void*date)Intc;Printf(“readmodemn”);While(STOP=FALSE)Read(fd,&c,1);/*comport*/Write(1,&c,1);/*stdout*/Printf(“exitformreadingmodemn”);ReturnNULL;/*_*/Void*send(void*date)Int=0;Printf(“senddaten”);While(STOP=FALSE)/*modeminputhandler*/C+;C%=255;Write(fd,&c,1);/*stdout*/Usleep(100000);ReturnNULL;/*_*/Intmain(intargc,char*argv)Structtermiosoldtio,newtio,oldstdio,newstdio;Structsigactionsa;Intok;Pthread_tth_a;th_b,th_c;Void*retval*If(argc1)Fd=open(COM2,O_RDWR);ElseFd=open(COM1,O_RDWR);/|O_NOCTTY|O_NONBLOCK);If(fd0)Error(COM1);Exit(-1);Tcgetattr(0,&oldstdio);Tcgetattr(fd,&oldtio);/*savecurrentmodemsettings*/Tcgetattr(fd,&newstdio);/*getworkingstdio*/Newtio.c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;/*ctrolflag*/Newtio.c_iflag=IGNPAR;/*inputflag*/Newtio.c_oflag=0;/*outputflag*/Newtio.c_lfag=0;Newtio.c_ccVMIN=1;Newtio.c_ccVTIME=0;/*nowcleanthemodemlineandactivatethesettingsformodem*/Tcflush(fd,TCIFLUSH);Tcsetattr(fd,TCSANOW,&newtio);/*setattrib*/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);/*restoreoldmodemsetings*/Tcsetattr(0,TCSANOW,&oldstdio);/*restoreoldttysetings*/Close(fd);Exit(0);六、实验步骤1.阅读理解源码进入expbasic03_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。
2.编译应用程序3.下载调试切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。
进入expbasic03_tty目录,运行term,观察运行结果的正确性。
rootzxtroot#minicom/mnt/ysffscd/host/exp/basic/03-tty/host/exp/basic/03_tty.termReadmodemSenddate123456789:
;?
ABCDEFGHIGHLMNOPQRSTUVWX由于内核已经将串口1作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。
Ctrl+c可使程序强行退出。
注意:
如果在执行./term时出现下面的错误,可以通过我们前文提到的方法建立一个连接来解决。
/dev/ttySO:
Nosuchfileordirectory解决方法:
/mnt/yaffscd/dev/devln-sf/dev/tts/0ttySO(注意首字母是1,不是数字1)实验四:
A/DD/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可执行文件rootzxt/#cd/arm2410s/exp/basic/04_ad/rootzxt04_ad#makearmv41-unknown-linus-gcc-c-omain.omain.carmv41-unknown-linux-gcc-o./bin/admain.o-lpthreadarmv41-unknown-linux-gcc-oadmain.o-lpthreadrootzxt04_ad#1sBinmain.cMakefilereadme.cxtsrc3下载调试换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录rootzxtroot#minicom/mnt/yaffscd/host/esp/basic/04_ad/host/exp/basic/04_ad./adPressEnterkeyexit!
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.编译应用程序运行make产生da可执行文件da_mainrootzxt/#cd/arm2410s/exp/basic/05_ad/rootzxt04_ad#makearmv41-unknown-linus-gcc-c-omain.omain.carmv41-unknown-linux-gccda_main.o-oda_mainrootzxt05_da#1sda_mainda_main.cda_main.odocdriversMakefiles3c44b0-spi.h3.下载调试切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录然后进入/host/exp/05_da/drivers目录,用insmodexio.o命令插入DA驱动,并且用1smod命令查看是否已经插入/mnt/yaffscd/host/esp/basic/05_ad/host/exp/basic/05_adcddrivers/host/exp/basic/05_ad、driversinsmodexio.oUsingexio.o/host/exp/basic/05_ad/drivers1smodModuleSiveUsedbuNottaintedExio23840(unused)I2c-tops2141040(unused)进入/host/exp/basic/05_da目录,运行./da_main观察运行结果的正确性,在输入./da_main后会出现下面的提示信息/host/exp/basic/05_da./da_mainErrorparameterInputas:
./ad_mainda_idnumda_id:
selectbetween0and1num:
range0.04.096这是由于我们没有制定参数造成的,他的格式为./da_mainda的id号数字,我们可以通过选择0或1来决定输出到开发板上的哪个DA接口,同时还需要在0.04.096V之间来选择一个输出电压,下面的例子是用了开发板上的DA0且输出1V的电压,我们可以使用万用表对其进行测量。
/host/exp/basic/05_ad./da_main01CurrentVoltageis1.000000v四实验总结通过本次实验我了解到一些关于DAAD的相关知识。
实验五:
图形界面应用程序设计一、实验目的1.了解在Linux下安装Qt以及Qt/Embedded的基本步骤;2.学会在Qt/E平台下使用Virtualframebuffer显示程序结果。
二、实验内容1在Linnux下编译和使用Qt/E平台;2在Qt/E平台下编译和运行一个程序使用Virtualframebuffer显示运行结果。
三、实验步骤该在Trolltech公司的网站上可以下载该公司所提供的Qt/Embedded的免费版本,在安装产品光盘以后,本次实验目录下已有要下载的文件,在/arm2410s/gui/Qt/src下。
在做实验钱吧本次实验用到的三个文件拷贝到/root/2410sQt目录下。
rootBCroot#cd/root/rootBCroot#mkdir2410sQtrootBCroot#cd/arm2410sQt/gui/Qt/srcQrootBCsrc#cd/arm2410s/gui/Qt/toolsrootBCtools#source/root/.bashprofile如果要正确安装的话,在任意路径下输入ar后按Tab键即可列出编译器文件。
Qt/Embedded平台的搭建需要以下几步:
1、安装Tmakecd/2410Qtcd/2410sQt3、安装Qt/Embeddedcd/2410sQt环境变量的设置是非常重要的,它关系到能否正确的安装及编译这些安装包,下面介绍一下这些环境变亮:
TMAKEDIR:
只想用于编译Qt/Embedded的Tmake工具第二步,编译Qt/Embeddedcd$QT2DIRexportTMAKEPATH=4TMAKEDIR/lib/linux-g+exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:
$PATHexportLD_LIBbin/RARY_PATH=$QTDIR/lib:
$LD_LIBRARY_PATH/configure-no-xft/出现选项时都要输入yesmakecp-artbin/uic$QTEDIR/bin/./configure是对Qt进行配置,它包括很多选项,例如可以通过添加“-no-opengl”等,如果想要进一步了解可以通过键入。
/configurehelp来获得更多的帮助信息。
编译完成后需要将生成的/bin/uic复制到¥QTEDIR下创建的目录bin,因为在随后的编译Qt/Embedded的时候会用到这个工具。
2、BuildQvfbexportTMAKEPATH=$TMAKEDIR/lib/linux-g+exportQTDIR=$QT2DIRexportPATH=$QTDIR/bin:
$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:
$LD_LIBRARY_PATHcd$QTESIR/tools/qvfb/root/2410s/tmake-1.13/bin/tmake-oMakefileqvfb.promakemvqvfb$QTEDIR/bin/3.BuildQt/Embeddedcd$QTEDIRexportTMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g+exportQTDIR=$QTEDIRexportPATH=$QTDIR/bin:
$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:
$LD_LIBRARY_PATH./CONFIGURE-NO-XFT-QVFB-DEPTHS4.8,16,32YES4.make在配置./configure中-qvfb用来支持Virtualframebuffer-depths4,8,16,32支持4位,8位,16位,32位,的显示深度,此外还可以添加如-syestem-jpeg和-gif来提供对jpeg和gif的支持。
配置系统同时还支持对特定平台系统选项的添加,但一般来讲,凡是支持framebuffer的linux系统都可以使用“linux-generic-g+”平台。
详细的配置信息可以通过运行./configurehelp命令来查看。
第四步,查看运行结果,如果上面各步都能够成功的编译通过,下面就可以通过运行Qt/Embedded自带的demo来查看结果。
在Virtualframebuffer上运行;exportQTDIR=$QTEDIRexportPATH=$QTDIR/bin:
$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:
$LD_LIBRARY_PATHcd$QTESIR/examples/launcher/qvfb-width640-height480&sleep10./launcher-qws运行结果如下:
将上面的步骤完成后,沃恩就已经建立好了在本机上开发Qt应用程序的环境,下面我们通过编写一个“helloembedded”的程序来了解Qt程序设计。
rootBC2410sQt#mkdirexprootBC2410sQt#cdexprootBCexp#vihello.cpp使用VI编写文件hello.cpp,程序代码如下:
/hello.cpp#include#includeIntmain(intargc,char*argv)QApplicationapp(argc,argv);QLabel*hello=newQLabei(“helloqt/embedded”,0);App.setMainWidget(hello);Hello-show();Returnapp.exec();现在开始逐行讲解一下每一句的意思,中我了这些以后可以帮助我们更加了解QT的程序设计。
第1行和第二行包含了两个头文件,这两个头文件中包含qapplication和qlabel类的定义。
第5行创建了一个qapplication对象,用于管理整个程序的资源,它需要两个参数,因为qt本身需要一些明林行的参数。
第6行创建了一个用来显示helloqt/embedded!
的部件。
在QT中,都是一个可视化的用户接口,按钮,菜单,滚动条都是部件的实例。
部件可以包含其他部件,例如,一个应用程序窗口通常是一个包含QMenuBar,QToolBar,QStatusBar和其他的部件。
在QLable含糊中的参数0表示,这是一个窗口而不是嵌入到其他窗口中的部件。
第7行设置hello部件为程序的主部件,当用户关闭主部件后,应用程序将会被关闭。
如果没有主部件的话,即使用户关闭了程序也会在后他继续运行。
第8行使hello部件可视,一百年来说部件被创建后都是被隐藏的,因此可以显示在前根据需要来定制部件,这样的好处是可以避免部件创建所造成的闪烁。
第9行把程序的控制权交还给Qt,这时候程序就进入就绪模式,可视随时被用户行为激活,例如点击鼠标,敲击键盘等。
下面我们哟啊让我们的程勋运行起来,首先要让它能够在Virtualframebuffer中显示出来,然后再通过交叉编译在开发板上运行。
要在本机的Virtualframebuffer中显示结果,下面几个步骤是必须的:
1.生成工程文件(.pro)每一个qt程序都对应一个工