嵌入式系统及应用实验指导报告书.docx
《嵌入式系统及应用实验指导报告书.docx》由会员分享,可在线阅读,更多相关《嵌入式系统及应用实验指导报告书.docx(37页珍藏版)》请在冰豆网上搜索。
嵌入式系统及应用实验指导报告书
安徽工业大学
嵌入式系统与应用
实验报告册
学院:
电气与信息工程学院
专业:
测控技术与仪器
姓名:
学号:
实验一Linux认知实验
一、实验目的:
1、通过实验,掌握Linux操作系统下常用的命令,能灵活运用这些命令完成特定的工作;
2、学习Linux下文本编辑器vi的使用方法。
二、实验内容:
1、新建文件hello.c,文件位于/home/test/目录下;
2、使用vi编辑
三、实验步骤:
1、打开电脑上的虚拟机,加载Linux系统。
2、输入密码进入系统后,按ctrl+Alt+t打开终端;
3、使用mkdir建立/home/test文件夹;
4、使用chmod命令修改文件夹权限;
5、使用vi打开hello.c文件,从而新建文件;
6、在hello.c文件中输入程序,使得程序能够显示打印字符:
“Hello,Linux!
”
四、实验结果:
(包括代码源码和运行结果)
1、源代码
(1)hello.c程序代码:
#include"stdio.h"
intmain()
{
printf("hellolinux!
\n");
}
(2)修改文件夹权限:
用chmod修改文件夹权限
lv@lv-pc:
~$cdtest1
lv@lv-pc:
~/test1$ls-l
总用量28
-rwxr-xr-x1lvlv81365月711:
36a.out
-rwxr-xr-x1lvlv78695月1109:
10main
-rw-r--r--1lvlv2505月711:
35main.c
-rwxr-xr-x1lvlv81363月3020:
28mian
lv@lv-pc:
~/test1$chmod733a.out
lv@lv-pc:
~/test1$ls-l
总用量28
-rwx-wx-wx1lvlv81365月711:
36a.out
-rwxr-xr-x1lvlv78695月1109:
10main
-rw-r--r--1lvlv2505月711:
35main.c
-rwxr-xr-x1lvlv81363月3020:
28mian
2、实验结果
五、思考:
在建立文件夹的过程中,如果不进入管理员权限,会出现什么问题?
同样,不进入管理员权限,vi编辑完代码,能不能保存退出?
chmod后面的数字参数是什么含义?
答:
会出现:
键入mkdirtest后显示:
无法创建目录"test":
权限不够的问题。
不进入管理员权限,vi编辑完代码,不能保存退出。
想对文件夹所修改成的权限。
实验二交叉编译实验
一、实验目的:
1、通过实验,掌握交叉编译的原理,理解文件系统挂载的原理;
2、掌握交叉编译工具的使用,学会使用两种不同的方式访问目标板系统,学会使用gdb对程序进行调试。
二、实验内容:
编辑hello.c程序,使用交叉编译工具进行编译,生成可执行文件,分别使用minicom和telnet登录到目标板上,对程序进行运行调试。
三、实验步骤:
1、打开电脑上的虚拟机,加载Linux系统。
2、Linux系统登录完毕,设置PC机网络地址为192.168.0.10,其中子网掩码为255.255.255.0,连接好实验箱上的电源、网线和USB转串口工具以及串口延长线。
3、按ctrl+Alt+t打开终端,输入sudominicom打开minicom,查看串口设置是否正确,进行串口设置;
4、打开试验箱电源,查看启动代码,启动完成后,实验箱屏幕显示界面,按“Ctrl+c”,然后按“Enter”,进入板子系统。
5、在文件系统(/home/nfs)下的test文件夹下,建立hello.c的程序,程序中输入相应程序,实现打印信息“hello,linux”并换行输出1~10;
6、再打开一个终端,在该终端中转到文件系统test文件夹,使用交叉编译工具对hello.c进行编译。
7、在minicom中,目录转到“/test”文件夹下使用./(你的程序名)运行程序;
8、使用“gdb你的程序名”运行程序,设置断点进行程序调试。
9、关闭minicom,终端中输入telnet,然后输入open192.168.0.11,等待出现“login:
”输入“root”,进入目标板系统;
10、目录转到“/test”文件夹下使用./(你的程序名)运行程序;
11、使用“gdb你的程序名”运行程序,设置断点进行程序调试。
四、实验结果:
(包括代码源码和运行结果)
1、源程序
#include
main()
{
inti;
printf(“hellolinux!
!
\n”);
for(i=1;i<=10;i++)
printf(“thisis%d\n”,i);
}
2、运行结果
wyxj@wyxj-cpu:
~$cd/home/nfs/test
wyxj@wyxj-cpu:
/home/nfs/test$ls
1290640686-3-3-2demohelloled.crtc.cwatchdog
129064068~adcgpiohello1mizi-pda.tar.gzrtcreadwatchdog.c
6-3-1-1adc.cgpio.chello.creadme.txtrtcread.c
6-3-3-1a.outheeeledrtcuart
wyxj@wyxj-cpu:
/home/nfs/test$gcchello.c-ohello
wyxj@wyxj-cpu:
/home/nfs/test$./hello
Hellolinux!
!
thisis1
thisis2
thisis3
thisis4
thisis5
thisis6
thisis7
thisis8
thisis9
thisis10
wyxj@wyxj-cpu:
/home/nfs/test$armv4l-unknown-linux-gcchello.c-ohelloarm
wyxj@wyxj-cpu:
/home/nfs/test$./helloarm
bash:
./helloarm:
无法执行二进制文件
(1)在Telnet下运行:
wyxj@wyxj-cpu:
~$telnet
telnet>open192.168.0.11
Trying192.168.0.11...
Connectedto192.168.0.11.
Escapecharacteris'^]'.
Linux2.4.18-rmk7-pxa1(192.168.0.11)(0)
192.168.0.11login:
root
BusyBoxv0.60.3(2002.05.13-08:
36+0000)Built-inshell(ash)
Enter'help'foralistofbuilt-incommands.
#./helloarm
./helloarm:
Nosuchfileordirectory
#cdtest
#./helloarm
Hellolinux!
!
thisis1
thisis2
thisis3
thisis4
thisis5
thisis6
thisis7
thisis8
thisis9
thisis10
(2)在minicom下运行:
wyxj@wyxj-cpu:
~$sudominicom
[sudo]passwordforwyxj:
Welcometominicom2.6.2
OPTIONS:
I18n
CompiledonFeb82013,06:
27:
51.
Port/dev/ttyUSB0,21:
22:
32
PressCTRL-AZforhelponspecialkeys
Waitingforentertostart'/bin/sh'(pid46,terminal/dev/console)
PleasepressEntertoactivatethisconsole.
Startingpid46,console/dev/console:
'/bin/sh'
BusyBoxv0.60.3(2002.05.13-08:
36+0000)Built-inshell(ash)
Enter'help'foralistofbuilt-incommands.
#ls
333.bmpmicrowindows-0.90sbin
binmmcsdsheryl.mp3
bombmnttest
devnotebooktmp
etcpig.mp3usr
hello.cprocvar
iceage.mpegqcop-msg-qpevcongui
libqcop-msg-quicklauncher
linuxrcqtembedded-root
#cdtest
#./helloarm
Hellolinux!
!
thisis1
thisis2
thisis3
thisis4
thisis5
thisis6
thisis7
thisis8
thisis9
thisis10
(3)超级终端下运行:
3、gdb调试
五、思考:
1、在使用交叉编译工具进行编译过程中,要生成可用gdb调试的程序,需要再编译过程中加什么参数?
答:
gcc-ghello.c-ohello要加上“-g”,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该执行文件。
2、使用telnet进行目标板访问过程中,什么时候运行open命令不会出现连接不到目标板的情况?
答:
目标版能显示文档内容,表示所有连接成功。
连接不到原因:
1)线路问题;(检查线路);
2)telnet的网络设备负载过高,无法正常响应服务;(重启一下设备);
3)telnet的网络设备禁止了telnet的23端口...(于设备中打开该端口);
实验三S3C2410基础实验
一、实验目的:
了解在ADS环境下对S3C2410芯片的AD接口的操作、键盘/LED接口的操作、直流和步进电机的工作原理和实际编程操作。
二、实验内容:
1、实现使用ADS和简易JTAG仿真器连接ARM芯片S3C2410;
2、使用提供例程和超级终端对上述的各个模块的接口进行实际操作。
三、实验步骤:
1、ADS实验环境的建立,参照《THUEA-1A型嵌入式(ARM9)高级实验/开发系统》实验指导书的157~162页;
2、设置好以后,到D盘ARM文件夹下,找到ADS的工程文件,拖入到打开的ADS1.2中;
3、重启开发板,超级终端中显示等待状态,点击ADS1.2上的调试按钮,程序开始下装到开发板;ADS进入调试界面;
4、点击调试界面上的运行按钮,程序执行到主程序处,再次点击运行程序;
5、程序运行后,超级终端上显示运行提示,按提示操作键盘/LED、电机和AD转换.
四、实验结果:
(超级终端上的运行提示和实际运行结果)
1、运行程序:
(1)A/D程序:
读取采样值函数:
int ReadAdc(int ch)
{
int i;
static int prevCh=-1;
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3);//设立通道
if (prevCh!
=ch)
{
rADCCON = (1<<14)|(preScaler<<6)|(ch<<3);//设立通道
for(i=0;iprevCh=ch;
}
rADCCON|=0x1;//开始 ADC
while(rADCCON & 0x1);//检查 Enable_start 位是否变低
while(!
(rADCCON & 0x8000));//检查 EC(End of Conversion) flag 是否为高
return ( (int)rADCDAT0 & 0x3ff );
}
在超级终端显示数字量:
{
a4=ReadAdc(4);
a6=ReadAdc(6);
Uart_Printf("AIN4:
%0.2fAIN6:
%0.2f \n",a4*3.3/1024,a6*3.3/1024);
}
(2)D/A程序:
MAX504 的控制程序如下:
void DA_Test()
{
int i;
int SAVrGPACON,SAVrGPFCON,SAVrGPGCON;
float v;
SAVrGPACON=rGPACON;//寄存器状态保护
SAVrGPFCON=rGPFCON;//寄存器状态保护
SAVrGPGCON=rGPGCON;//寄存器状态保护
MAX504_CLEAR();//将 DAC 寄存器设为 0
Uart_Printf("[DAC Test]\nPlease observe the corresponding of output and input:
\n");
for(i=0;i<1024;i+=8)
{
Max504_SetDA(i);//MAX504 读取数字量转化
v=((float)i)*Max504_FULL/1024.0f;//数字量显示
Uart_Printf("Current Digital Voltage Of Input=%1.2fV\r",v);
Delay(2000);//数字量保持时间
}
rGPACON=SAVrGPACON;//寄存器状态恢复
rGPFCON=SAVrGPFCON;//寄存器状态恢复
rGPGCON=SAVrGPGCON;//寄存器状态恢复
}
MAX504 读取数字量转化函数:
void Max504_SetDA(int value)
{ value<<=2;//左移两位
Delay
(1);
MAX504_ENABLE();//开启 MAX504
SendSPIData(value>>8);//发送高 8 位
SendSPIData(value);//发送低 8 位
MAX504_DISABLE();//关闭 MAX504
}
(3)键盘/LED接口程序:
超级终端显示键值数组:
unsigned char Scandata[4][4]={
{'F','E','D','C'},
{'B','A','9','8'},
{'7','6','5','4'},
{'3','2','1','0'},
};
数码管码段显示值数组:
unsigned char st[4][4]= {
{0x8e,0x86,0xa1,0xc6},
{0x83,0x88,0x90,0x80},
{0xf8,0x82,0x92,0x99},
{0xb0,0xa4,0xf9,0xc0},
};
扫描键值中断函数:
do{
rGPEDAT = rGPEDAT & 0xfff7;//置 GPE3 为低,扫描键盘第四行
rGPEDAT = rGPEDAT | 0x70;//GPE4、5、6 为高
i=3;
Read_value(i);
rGPEDAT = rGPEDAT & 0xffef; //置 GPE4 为低,扫描键盘第三行
rGPEDAT = rGPEDAT | 0x68;//GPE3、5、6 为高
i=2;
Read_value(i);
rGPEDAT = rGPEDAT & 0xffdf;//置 GPE5 为低,扫描第二行键盘
rGPEDAT = rGPEDAT | 0x58;//GPE3、4、6 为高
i=1;
Read_value(i);
rGPEDAT = rGPEDAT & 0xffbf;//置 GPE6 为低,扫描第一行键盘
rGPEDAT = rGPEDAT | 0x38;//GPE3、4、5 为高
i=0;
Read_value(i);
}while(value!
='0');
某列键值读取:
case(0xe):
value=Scandata[data][0];
rGPADAT=0x81e0;//GPA5,6,7,8 输出 1, 15 输出高
rSMG0= st[data][0];//数码管显示
rGPADAT=0x01e0;//GPA5,6,7,8 输出 1, 15 输出低
break;
Uart_Printf("\r keyvalue is %c ",value);//超级终端显示
(5)直流、步进电机程序:
直流电机正转:
rGPADAT=0xfff80; //GPA7 置 1,GPA4、5、6 置 0
Delay(50); //延时函数,控制低脉冲时间
rGPADAT=0xfff90; // GPA4、7 置 1,GPA5、6 置 0
Delay(30); //延时函数,控制高脉冲时间
直流电机反转:
rGPADAT=0xfff20; // GPA5 置 1,GPA4、6、7 置 0
Delay(50); //延时函数,控制低脉冲时间
rGPADAT=0xfff60; // GPA5、6 置 1,GPA4、7 置 0
Delay(30); //延时函数,控制高脉冲时间
步进电机输出脉冲:
rGPADAT=0xfff07; //0111,注意:
低电平有效
Delay(140); //延时函数,控制步进电机转速
rGPADAT=0xfff0b; //1011
Delay(140);
rGPADAT=0xfff0d; //1101
Delay(140);
rGPADAT=0xfff0e; //1110
Delay(140);
2、超级终端运行结果:
五、思考:
在ADS下载程序的过程中,目标板为什么不能进入到linux系统,目标板进入linux系统后,下装的程序能不能正常运行?
答:
因为内存冲突;能。
实验四多路复用实验
一、实验目的:
1、通过实验,掌握Linux操作系统下多路复用的概念;
2、学习Linux下多路复用函数的使用方法。
二、实验内容:
构建多路复用程序及其框架,整个流程如图所示:
三、实验步骤:
1、打开电脑上的虚拟机,加载Linux系统。
2、输入密码进入系统后,按ctrl+Alt+t打开终端;
3、进入到程序所在目录,对程序进行编译;
4、使用mknodin1p建立管道1;
5、使用mknodin2p建立管道2;
6、重新打开一个终端输入cat>in1;
7、重新打开一个终端输入cat>in2;
8、在原来终端中输入./multiplex_select;
9、在in1、in2终端中随机输入字符,观察现象;
10、在主程序所在终端中输入q,观察现象;
11、修改编译器在目标板上运行上述程序。
四、实验结果:
(包括代码源码和运行结果)
1、源代码:
(1)multiplex_select.c代码:
/*multiplex_select.c*/
#include
#include
#include
#include
#include
//#include
#defineMAX_BUFFER_SIZE1024
#defineIN_FILES3
#defineTIME_DELAY60
#defineMAX(a,b)((a>b)?
(a):
(b))
intmain(void)
{
intfds[IN_FILES];
charbuf[MAX_BUFFER_SIZE];
inti,res,real_read,maxfd;
//structtimevaltv;
fd_setinset,tmp_inset;
fds[0]=0;
if((fds[1]=open("in1",O_RDONLY|O_NONBLOCK))<0)
{
printf("Openin1error\n");
return1;
}
if((fds[2]=open("in2",O_RDONLY|O_NONBLOCK))<0)
{
printf("Openin2error\n");
return1;
}
maxfd=MAX(MAX(fds[0],fds[1]),fds[2]);
FD_ZERO(&inset);
for(i=0;i{
FD_SET(fds[i],&inset);
}
FD_SET(0,&inset);
//tv.tv_sec=TIME_DELAY;
//tv.tv_usec=0;
while(FD_ISSET(fds[0],&inset)||FD_ISSET(fds[1],&inset)||FD_ISSET(fds[2],&inset))
{
tmp_inset=inset;
res=select(maxfd+1,&tmp_inset,NULL,NULL,0);
switch(res)
{
case-1:
{
printf("Selecterror\n");
return1;
}
break;
case0:
/*Timeout*/
{
printf("Timeout\n");
return1;
}
break;
default:
{
for(i=0;i{
if(FD_ISSET(fds[i],&tmp_inset))
{
//memset(buf,0,MAX_BUFFER_SIZE);
real_read=read(fds[i],buf,MAX_BUFFER_SIZE);
if(real_read<0)
{
//if(errno!
=EAGAIN)
//{