嵌入式系统原理与应用.docx
《嵌入式系统原理与应用.docx》由会员分享,可在线阅读,更多相关《嵌入式系统原理与应用.docx(40页珍藏版)》请在冰点文库上搜索。
嵌入式系统原理与应用
嵌入式系统原理与应用
实验报告
班级:
学号:
姓名:
实验一Linuxshell基本命令的使用
一、实验目的和要求
a)掌握用户系统常用命令。
b)掌握文件目录常用命令。
c)掌握压缩打包常用命令。
d)掌握网络相关命令。
二、实验内容和原理
a)登录系统,查看系统相关信息;
b)查询和更新系统用户数据;
c)创建文件目录和文件,并实现文件操作;
d)打包并解压文件
e)查询系统网络状态,并设置和更新
三、实验环境
a)硬件:
PC机
b)软件:
LINUX操作系统、虚拟机
四、算法描述及实验步骤
a)启动系统,打开终端;
b)查看系统信息,并将以下查看内容重定向添加到文件systemInfo.txt,最后清屏:
1、查看系统当前所有进程;
2、查看当前系统信息
3、查看硬盘分区情况
4、查看/etc/fstab文件
5、查看系统当前的网络地址
c)系统用户数据:
1、切换到root状态
2、创建用户(姓名拼间首字母加学号后两位,如张飞ZF01),密码是123456
3、进入新用户,并查看默认所在主目录及所有登录系统的用户
d)文件操作:
1、在当前用户的主目录下,创建文件夹Labl
2、进入Lab1文件夹,新建文件welcome.txt,写入“HelloZhangFei!
”保存退出
3、将b步骤生成的文件SystemInfo.txt,移动到Lab1文件夹,并设置文件权限为:
文件所有者可读写,其它为只读;并查看文件列表,权限是否设置
4、返回到当前用户的主目录
5、将Lab1文件夹打包生成tar.gz文件,并删除原文件夹
五、实验报告要求:
按实验步骤执行,在纸质实验报告上详细描述执行流程(使用命令及操作流程),并在电子版的实验报告上要求另加适当截图描述;
a)启动系统,打开终端;或使用putty连接系统(如果未安装ssh,可以使用sudoapt-getinstallssh):
运行Applications→Terminal
图1.1启动终端
b)查看系统信息,并将以下查看内容重定向添加到文件systemInfo.txt,最后清屏:
1、查看系统当前所有进程:
运行Terminal→ps→ps>>SystermInfo.txt
图1.2查看系统当前所有进程
2、查看当前系统信息:
运行Terminal→uname-a→uname–a>>SystermInfo.txt
图1.3查看当前系统信息
3、查看硬盘分区情况:
运行Terminal→fdisk
图1.4查看硬盘分区情况
4、查看/etc/fstab文件:
运行Terminal→cat/etc/fstab→cat/etc/fstab>>SystermInfo.txt
图1.5查看/etc/fstab文件
5、查看系统当前的网络地址:
运行Terminal→ifconfig→ifconfig>>SystermInfo.txt→clear
图1.6查看系统当前网络地址
c)系统用户数据:
1、切换到root状态:
运行Terminal→su-root→输入密码登录
图1.7切换到root状态
2、创建用户(姓名拼间首字母加学号后两位,如张飞ZF01),密码是123456:
运行Terminal→useradd–mdhy27→passwddhy27→输入并确定密码
图1.8创建用户
3、进入新用户,并查看默认所在主目录及所有登录系统的用户:
运行Terminal→su–dhy27→ls→who
图1.9进入新用户
d)文件操作:
1、在当前用户的主目录下,创建文件夹Labl:
运行Terminal→mkdirLabl
图1.10创建文件Labl
2、进入Lab1文件夹,新建文件welcome.txt,写入“HelloZhangFei!
”保存退出:
运行Terminal→viwelcome.txt
图1.11进入Labl文件
在vi模式下创建文件
图1.12在vi模式在创建文件
3、将b步骤生成的文件SystemInfo.txt,移动到Lab1文件夹,并设置文件权限为:
文件所有者可读写,其它为只读;并查看文件列表,权限是否设置:
运行Terminal→mv/home/dhy/SystermInfo.txt/home/dhy27/Labl
图1.13移动文件
运行Terminal→chmod644/home/dhy27/Labl/SystermInfo.txt→ls–l/home/dhy27/Labl
图1.14更改权限
4、返回到当前用户的主目录:
运行Terminal→sudhy27→pwd→cd→pwd
图1.15返回主目录
5、将Lab1文件夹打包生成tar.gz文件,并删除原文件夹:
运行Terminal→tar–cvftar.gz/home/dhy27/Labl→ls→rm–rLabl
图1.16打包文件
实验二GCC及GDB的使用
一、实验目的和要求
1.掌握VI编译环境。
2.掌握GCC编译命令。
3.掌握多个文件共同编译方法。
4.掌握GDB调试命令。
二、实验内容和原理
1.在VI编辑器里编写简单的“hello,world,Iam13050141XXXXX”,利用GCC编译为可执行文件,执行,观察运行结果。
2.在VI编辑器里编写多个文件(至少两个,其中一个为主程序,一个为需要调用的子程序),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。
学习书写MAKEFILE文件,编译,执行,观察结果。
3.编写循环结构的程序,利用GCC编译(加参数-g)为可执行文件,利用GDB调试,学习GDB调试命令。
三.实验环境
1.硬件:
PC机
2.软件:
LINUX操作系统、虚拟机
四.实验步骤
1.用vi编辑器新建hello.c文件,并用gcc编译器编译,执行,显示结果
图2.1执行hello
2.makefile文件的编写,多文件编译执行
1)主程序部分
图2.2主程序
1)子程序部分
图2.3子程序
2)头文件部分
图2.4头文件
3)makefile的程序
图2.5Makefile的程序
5)查看makefile的内容
图2.6查看makefile的内容
6)主程序,子程序的编译执行输出结果
图2.7执行结果
3.gdb的调试
1)用vi编辑器新建tst.c文件
图2.8tst源程序
2)使用gdbtst命令启动gdb调试
图2.9启动gdb调试
3)使用gdbl命令列出源代码
图2.10使用gdbl命令列出源代码
4)使用break16命令设置断点位置在16行;使用breakfunc,设置断点,在func函数入口处;使用infobreak查看断点信息;使用r命令,运行程序;使用n命令,单条语句执行;
图2.11使用断点
5)使用c命令继续运行程序,使用pi命令打印变量i的值,print命令简写
图2.12使用继续指令
6)使用bt命令查看函数堆栈
图2.13查看函数堆栈
7)使用finish命令退出函数,使用q退出gdb调试。
图2.14使用finish命令退出函数
实验三交叉编译环境配置
一、实验目的和要求
熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。
使用Linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。
二、实验内容
e)配置网络,包括配置IP地址、NFS服务、防火墙。
f)安装交叉编译器
g)配置超级终端,下载文件到目标机上。
三、实验设备及工具(包括软件调试工具)
硬件:
UP-TECHS2410/P270DVP嵌入式实验平台、PC机Pentium500以上,硬盘10G以上。
软件:
REDHATLINUX9.0+超级终端+ARM-LINUX开发环境
四、实验步骤
1、虚拟机设置为桥接模式。
图3.1虚拟机设置为桥接模式
2、配置IP地址,设置为192.168.0.121
图3.2IP设置
图3.3配制以太网
3、关闭防火墙
操作如下:
点击红帽子开始菜单,选择安全级别设置,选中无防火墙。
图3.4关闭防火墙
4、打开桌面超级终端,配置COM1,115200波特率,8N1,实验箱插上电源线,网线与主机相连,串口线与主机串口1相连,开机,看bootloader程序VIVI是否自动加载,回车后进入命令提示符。
5、宿主机和目标机互相PING,看是否PING通
宿主机Ping192.168.0.121
超级终端Ping192.168.0.123
图3.5ping检验是否联通
6、安装NFS服务器,点击主菜单运行系统设置->添加/删除应用程序->服务器->服务器配置工具->system-config-nfs,system-config-samba,安装
图3.6安装NFS服务器
7、安装交叉编译器
利用U盘将提供的文件夹拷入系统中,虚拟机->可移动设备中将你的U盘连接上
建议的代码
fdisk-l(看SDB1出现没有)
mkdir/mnt/usb
mount-tvfat/dev/sdb1/mnt/usb-codepage=936,iocharset=cp936
cd/mnt/usb
./install.sh
运行完后卸载U盘
umount/dev/sdb1
图3.7安装交叉编译器
8、在超级终端下挂载文件夹
mount-tnfs-onolock192.168.0.103:
/liqing/host
实验四熟悉Linux开发环境
一、实验目的
熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。
使用Linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。
二、实验内容
本次实验使用RedhatLinux9.0操作系统环境,安装ARM-Linux的开发库及编译器。
创建一个新目录,并在其中编写hello.c和Makefile文件。
学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
三、预备知识
C语言的基础知识、程序调试的基础知识和方法,Linux的基本操作。
四、实验设备及工具(包括软件调试工具)
硬件:
UP-CUPS2410经典平台、PC机Pentium500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
五、实验步骤
1、建立工作目录
4.1建立工作目录
2、编写程序源代码
我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:
图4.2编辑代码
按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再用命令“:
wq”保存并退出。
这样我们便在当前目录下建立了一个名为hello.c的文件。
3、编写Makefile
要使上面的hello.c程序能够运行,我们必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。
使用它带来的好处就是自动编译,你只需要敲一个“make”命令整个工程就可以实现自动编译,当然我们本次实验只有一个文件,它还不能体现出使用Makefile的优越性,但当工程比较大文件比较多时,不使用Makefile几乎是不可能的。
下面我们介绍本次实验用到的Makefile文件。
CC=armv4l-unknown-linux-gcc
EXEC=hello
OBJS=hello.oCFLAGS+=–g
LDFLAGS+=–static
all:
$(EXEC)
$(EXEC):
$(OBJS)
$(CC)$(LDFLAGS)-o$@$(OBJS)
clean:
-rm-f$(EXEC)*.elf*.gdb*.o
下面我们来简单介绍这个Makefile文件的几个主要部分:
eCC指明编译器
eEXEC表示编译后生成的执行文件名称
eOBJS目标文件表eCFLAGS编译参数eLDFLAGS连接数eall:
编译主入口
eclean:
清除编译结果
与上面编写hello.c的过程类似,用vi来创建一个Makefile文件并将代码录入其中
4、编译应用程序
在上面的步骤完成后,我们就可以在hello目录下运行“make”来编译我们的程序了。
如果进行了修改,重新编译则运行:
图4.3编译应用程序
5、下载调试
在宿主PC计算机上启动NFS服务,并设置好共享的目录,具体配置请参照前面第一章第四节中关于嵌入式Linux环境开发环境的建立。
在建立好NFS共享目录以后,我们就可以进入超级终端中建立开发板与宿主PC机之间的通讯了。
再进入/mnt目录运行刚刚编译好的hello程序,查看运行结果。
图4.4运行结果
实验五串行端口程序设计
一、实验目的
了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用。
学习使用多线程来完成串口的收发处理。
二、实验内容
学习终端I/O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
发送自己的学号给串口。
三、预备知识
有C语言基础。
掌握在Linux下常用编辑器的使用。
掌握Makefile的编写和使用。
掌握Linux下的程序编译与交叉编译过程
四、实验设备及工具
硬件:
UP-CUPS2410经典平台、PC机Pentium500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
五、程序分析
本实验的程序流程图如下:
图5.1实验流程图
本实验的代码如下:
#include
#include
#include
#include
#include
#include
#defineBAUDRATEB115200
#defineCOM1"/dev/ttyS0"
#defineCOM2"/dev/ttyS1"
#defineENDMINITERM27
#defineFALSE0
#defineTRUE1
volatileintSTOP=FALSE;volatileintfd;
voidchild_handler(ints)
{
printf("stop!
!
!
\n");STOP=TRUE;
}
void*receive(void*data)
{
intc;
printf("readmodem\n");while(STOP==FALSE)
{
read(fd,&c,1);/*comport*/write(1,&c,1);/*stdout*/
}
printf("exitfromreadingmodem\n");returnNULL;
}
intmain(intargc,char**argv)
{
structtermiosoldtio,newtio,oldstdtio,newstdtio;structsigactionsa;
intok;
pthread_tth_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,&oldstdtio);
tcgetattr(fd,&oldtio);
tcgetattr(fd,&newstdtio);
newtio.c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;
newtio.c_iflag=IGNPAR;
newtio.c_oflag=0;
newtio.c_lflag=0;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
sa.sa_handler=child_handler;
sa.sa_flags=0;
sigaction(SIGCHLD,&sa,NULL);
pthread_create(&th_a,NULL,keyboard,0);
pthread_create(&th_b,NULL,receive,0);
pthread_create(&th_c,NULL,send,0);
pthread_join(th_a,&retval);
pthread_join(th_b,&retval);
pthread_join(th_c,&retval);
tcsetattr(fd,TCSANOW,&oldtio);
tcsetattr(0,TCSANOW,&oldstdtio);
close(fd);
exit(0);
}
六、实验步骤
1、打开串口
在Linux下串口文件位于/dev下,一般在老版本的内核中串口一为/dev/ttyS0,串口二为/dev/ttyS1,在我们的开发板中串口设备位于/dev/tts/下,因为开发板中没有ttyS0这个设备,所以我们要建立一个连接,方法如下:
[/mnt/yaffs]cd/dev
[/dev]ln–sf/dev/tts/0ttyS0
2、编写代码(如上)
3、编译连接
图5.3编译链接
4、下载调试
[/mnt/yaffs]mount-tnfs-onolock192.168.0.103/arm2410cl/host
[/mnt/yaffs]cd/host/exp/basic/03_tty/
[/host/exp/basic/03_tty]./term
七、实验结果
图5.4实验结果
实验六A/D接口实验
一、实验目的
了解在linux环境下对S3C2410芯片的8通道10位A/D的操作与控制。
二、实验内容
学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求。
阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。
利用外部模拟信号编程实现ARM循环采集全部前4路通道,并且在超级终端上显示。
三、预备知识
有C语言基础。
掌握在Linux下常用编辑器的使用。
掌握Makefile的编写和使用。
掌握Linux下的程序编译与交叉编译过程。
四、实验设备及工具
硬件:
UP-CUPS2410经典平台、PC机Pentium500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
五、程序代码
ad驱动对用户来说只是下面的一个文件结构。
在用户程序里只需要用到open、read、write、release等内核函数即可。
本实验采用的是模块方式加载,可以在实验箱的/mnt/yaffs/ad/中找到AD的驱动程序。
main.c的代码如下:
#include
#include
#include
#include
#include
#include
#include
#include"s3c2410-adc.h"
#defineADC_DEV"/dev/adc/0raw"staticintadc_fd=-1;
staticintinit_ADdevice(void)
{
if((adc_fd=open(ADC_DEV,O_RDWR))<0){
printf("Erroropening%sadcdevice\n",ADC_DEV);return-1;
}
}
staticintGetADresult(intchannel)
{
intPRESCALE=0XFF;
intdata=ADC_WRITE(channel,PRESCALE);write(adc_fd,&data,sizeof(data));read(adc_fd,&data,sizeof(data));
returndata;
}
staticintstop=0;
staticvoid*comMonitor(void*data)
{
getchar();stop=1;returnNULL;
}
intmain(void)
{
inti;floatd;
pthread_tth_com;void*retval;
//sets3c44b0ADregisterandstartADif(init_ADdevice()<0)
return-1;
/*Createthethreads*/
pthread_create(&th_com,NULL,comMonitor,0);printf("\nPressEnterkeyexit!
\n");
while(stop==0){
for(i=0;i<=2;i++){//采样0~2路A/D值d=((float)GetADresult(i)*3