《嵌入式系统》实验报告指导书含答案.docx
《《嵌入式系统》实验报告指导书含答案.docx》由会员分享,可在线阅读,更多相关《《嵌入式系统》实验报告指导书含答案.docx(20页珍藏版)》请在冰豆网上搜索。
《嵌入式系统》实验报告指导书含答案
实验一熟悉嵌入式LINUX开发环境
1、实验目的
熟悉UP-TECHPXA270-S的开发环境。
学会WINDOWS环境与嵌入式Linu环境共享资源的基本方法。
2、实验内容
学习UP-TECHPXA270-S系统的使用、XP和虚拟机之间传送文件方法以及UP-TECHPXA270-S和虚拟机之间共享目录的建立方法。
3、预备知识
了解UP-TECHPXA270-S的基本结构和配置,Linux基本知识。
4、实验设备
硬件:
UP-TECHPXA270-S开发板、PC机(内存500M以上)。
软件:
PC机操作系统RADHANDLINUX9+MIMICOM+RAMLINUX操作系统
5、实验步骤
(1)、在虚拟机下练习Linux常用命令。
(注意以下操作只能在[root@BCroot]#,也就是root文件夹下运行,不然会导致系统不能启动)
a.学习命令通过“man***”和“***--help”得到的命令使用方法。
b.学习并掌握如下命令:
ls,cd,pwd,cat,more,less,mkdir,rmdir,rm,mv,cp,tar,ifconfig
(2)、XP与虚拟机之间传送文件(Samba服务器建立、网络设置、文件传送);
(3)、了解系统资源和连线;
(4)、开发板与虚拟机之间共享目录建立(设置NFS、开发板IP设置、目录挂载),挂载文件;
(5)vi(vim)的使用
(6)输入qt,启动桌面,按CTRL+C退出
6、实验报告要求
(1)、XP和虚拟机之间传送文件步骤;
虚拟机共享XP文件:
选择虚拟机设置,设置要共享的文件
启动Linux
进入/mnt/hgfs即可看到共享文件夹
服务器设置——samba服务器(设置需要共享的目录)
XP共享虚拟机文件:
服务器设置——samba服务器(设置需要共享的目录)
确保网络的PING通(即在同一局域网):
1.虚拟机的192.168.1.234(RH9)
2.XP的为192.168.1.125
3.在XP下点击开始-》运行(\\192.168.1.234)
4.用户名bc密码123456
以上实现了Linux虚拟机(RH9)和XP的文件的共享
(2)、开发板与虚拟机之间建立共享目录以及文件挂载步骤;
1.服务器设置——nfs服务器(设置需要共享的目录)
2.设置开发板的ip地址:
ifconfigeth0192.168.1.5
3.在实验箱终端里输入mount-tnfs-onolock192.168.1.234:
/up-techpxa270/exp/mnt/nfs
4./mnt/nfs即为共享目录
(3)、请画出虚拟机、PC机和ARM实验箱之间的硬件连接图;
(4)、在Linux中怎样配置网络;
系统设置->网络,在新的选项卡中
(5)、实验中遇到的问题与解决过程。
第一个实验相对简单些就是熟悉实验环境,然后练习了文件挂载,学会了开发板和虚拟机之间传送文件的方法。
挂载时我觉得难点是容易忽略IP的配置,若两者IP不在同一局域网,则挂载不成功。
最后是练习VI编辑器的使用,VI编辑器在上学期学过,这次只是重新熟悉下。
实验二嵌入式LINUX系统的编程
1、实验目的
熟悉UP-TECHPXA270-S下Linux的开发环境,了解GNU/make工具的工作原理。
学会使用makefile管理项目,学会编写一个Makefile文件。
熟悉arm-linux-gcc交叉编译的使用,了解嵌入式开发的基本过程。
2、实验内容
新建一个目录,编写几个源文件,使用makefile管理项目。
学习在linux下的编程和编译过程,以及UP-TECHPXA270-S开发板开发环境的设置。
下载已经编译好的文件到UP-TECHPXA270-S开发板中运行。
3、预备知识
C语言的基础知识、程序调试的基础知识和方法,LINUX的基本操作。
4、实验设备及工具(包括软件调试工具)
硬件:
UP-TECHPXA270-S嵌入式开发板、PC机Pentumn500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
5、实验步骤
(1)、建立工作目录
(2)、编写程序源代码
(3)、编写makefile文件
(4)、编译应用程序
(5)、下载调试
(6)、写一个简单的工程,并输出自己的姓名和学号,利用Makefile管理工程,并写出Makefile文件,进行调试。
6、实验报告要求
(1)、写清每步实验步骤的具体操作内容。
1.建立工作目录:
先挂载:
服务器设置——nfs服务器(设置需要共享的目录)
设置开发板的ip地址:
ifconfigeth0192.168.1.5
在实验箱终端里输入
mount-tnfs-onolock192.168.1.234:
/up-techpxa270/exp/mnt/nfs/mnt/nfs即为共享目录
在/mnt/nfs下建立自己的目录:
mkdircz
2.编写程序源代码
使用VI编辑器在工作目录写入源代码
3.编写makefile文件
使用vimakefile命令来编写makefile文件
4.编译应用程序
使用编译命令:
make–fmakefile来编译程序
5.下载调试
在宿主PC上启动NFS服务并设置共享目录。
就可进行两者通信了。
6.写一个简单的工程,并输出自己的姓名和学号,利用Makefile管理工程,并写出Makefile文件,进行调试。
(2)、简述Makefile文件的规则。
Makefile文件Makefile一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile是一个make的规则描述脚本文件,包括四种类型行:
目标行、命令行、宏定义行和make伪指令行(如“include”)。
makefile文件中注释以“#”开头。
当一行写不下时,可以用续行符“\”转入下一行。
(3)、简述调试情况。
先是*.h和*.c文件的编写,最后是makefile文件编写。
写好makefile文件amake后,用命令:
make–famake进行编译,但是一直提示一个错误,说是amake文件第6行出错,然后使用viamake命令进行amake文件修改,但还是出错,花了半个多小时都没成功,后来重新编写amake文件才得以编译成功。
我猜测是第一次写amake文件时,加入了不能识别的字符。
实验三串行端口程序设计
1、实验目的
了解在Linux环境下串行程序设计的基本方法;
掌握终端的主要属性及设置方法;熟悉终端IO函数的使用;完成串口的收发处理。
2、实验内容
读懂程序源代码,学习终端IO函数tcgetattr(),tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
3、预备知识
有C语言基础;掌握Makefile的编写和使用;掌握Linux下的程序编译与交叉编译过程
4、实验设备及工具
硬件:
UP-TECHPXA270-S嵌入式开发板、PC机Pentumn500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
5、实验步骤
(1)、将E盘下的03_tty复制到D:
\PXA270\Share下;将虚拟机的共享打开;
(2)、主机A的虚拟机添加串口,主机A的COM1与实验箱ttyS1相连,实验箱ttyS0与另一台PC机B相连;
(3)、将每台虚拟机linux的/up-techpxa270/exp/basic/03_tty删除,将两台主机的D:
\PXA270\Share\03_tty复制到虚拟机linux下的/up-techpxa270/exp/basic下;
(4)、进入/up-techpxa270/exp/basic/03_tty目录,使用vi编辑器或其他编辑器阅读理解serial_rcv和serial_send的源代码。
(5)、分别编译serial_rcv和serial_send下的源文件生成可执行文件。
(6)、自主选择作为发送端或接收端,并修改相应的代码。
(7)、挂载PC机B的/up-techpxa270/exp到开发板的/mnt/nfs。
(8)、在开发板和PC机Alinux下运行可执行程序,一个发送数据,一个接收数据。
(9)、修改程序,使发送端发送一个特定字符给接收端,且发送端回显一个字符或一句话。
6、实验报告要求
(1)、写清每步实验步骤的具体操作内容。
1.将E盘下的03_tty复制到D:
\PXA270\Share下;将虚拟机的共享打开:
打开虚拟机,选择redhat的设置,在“选项”的选项卡下打开虚拟机共享
2.主机A的虚拟机添加串口,主机A的COM1与实验箱ttyS1相连,实验箱ttyS0与另一台PC机B相连;
3.将每台虚拟机linux的/up-techpxa270/exp/basic/03_tty删除,分别将两台主机的D:
\PXA270\Share\03_tty复制到虚拟机linux下的/up-techpxa270/exp/basic下;
4.进入/up-techpxa270/exp/basic/03_tty目录,使用vi编辑器或其他编辑器阅读理解serial_rcv和serial_send的源代码。
5.分别编译serial_rcv和serial_send下的源文件生成可执行文件。
使用make命令在linux平台编译
6.自主选择作为发送端或接收端,并修改相应的代码。
7.挂载PC机B的/up-techpxa270/exp到开发板的/mnt/nfs。
服务器设置——nfs服务器(设置需要共享的目录),设置开发板的ip地址:
ifconfigeth0192.168.1.5,在实验箱终端里输入mount-tnfs-onolock192.168.1.234:
/up-techpxa270/exp/mnt/nfs,/mnt/nfs即为共享目录
8.在开发板和PC机Alinux下运行可执行程序,一个发送数据,一个接收数据。
运行程序:
./serial
9.修改程序,使发送端发送一个特定字符给接收端,且发送端回显一个字符或一句话。
while
(1)
{
*serial_buf=getchar();
if(getchar()==’a’){
printf(“helloworld!
\n”);}
write(serial_fd,serial_buf,1);
}
(2)、232串行通讯的数据格式是什么?
(3)、串行通讯最少需要几根线,分别如何连接?
最少需要3根线,分别是RXD(接收数据)、TXD(发送数据)、GND(信号地)。
AB的地线相连,A的RXD接B的TXD,B的RXD接A的TXD。
(4)、分析Makefile文件。
CROSS=arm-linux-//交叉编译
CC=$(CROSS)gcc//GCC交叉编译器
CPP=$(CROSS)g++//G++交叉编译
INSTALL=install
BIN=/usr/local/bin
WARNINGS=-Os-Wall-Wstrict-prototypes-Wmissing-prototypes-Wshadow-Wpointer-arith-Wcast-qual-Winline-I.
CFLAGS=-O2$(WARNINGS)
MATH_LIB=-lm
LIBS=$(MATH_LIB)–lpthread//引用库文件
OBJ=serial.omain.o
TARGET=serial//目标文件
all:
$(TARGET)$(OBJ)
//下面一层层开始编译
#Applications:
serial:
$(OBJ)
$(CC)$(CFLAGS)-o$(TARGET)$(OBJ)$(LIBS)
main.o:
main.c
$(CC)$(CFLAGS)-c-o$@$<
serial.o:
serial.cserial.h
$(CC)$(CFLAGS)-c-o$@$<
//清除中间文件
clean:
@echo"Cleaningupdirectory."
rm-f*.a*.o$(TARGET)
(5)、简述调试情况。
接收端开始不能运行,发现是Makefile错误。
去掉#CROSS=arm-linux-之前的#即可编译。
运行时,发送端输入一个字符并按下回车键,接收端可以显示出这个字符。
然后是修改程序,使发送端发送一个特定字符给接收端,且发送端回显一个字符或一句话。
发送端可以回显,但是接收端会多出一个字符,我猜测是由于缓冲区没有清除的原因。
实验四多线程应用程序设计
1、实验目的
了解多线程程序设计的基本原理,学习pthread库函数的使用。
2、实验内容
读懂pthread.c的源代码,熟悉几个重要的PTHREAD库函数的使用。
掌握共享锁和信号量的使用方法。
3、预备知识
熟练使用C语言,掌握在Linux下常用编辑器的使用,掌握Makefile的编写和使用,掌握Linux下的程序编译与交叉编译过程。
4、实验设备及工具
硬件:
UP-TECHPXA270-S嵌入式实验仪,PC机pentumn500以上,硬盘10G以上
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+AMRLINUX开发环境
5、实验步骤
(1)进入exp/basic/02_pthread目录,使用vi编辑器或其他编辑器阅读理解源代码;
(2)运行make产生pthread可执行文件;
(3)切换到minicom终端窗口,使用NFSmount开发主机的/up-techpxa270到/mnt目录;
(4)进入/mnt/exp/basic/02_pthread目录,运行./pthread,观察运行结果的正确性,若显示结果太快,可以用以下命令输出显示结果到pthread.txt文件./pthread>pthread.txt,然后再用catpthread.txt查看文件内容,结合程序分析结果;
(5)加入一个新的线程用于处理键盘输入,并在按特定字符时终止所有线程。
6、实验报告要求
(1)写清每步实验步骤及具体操作内容;
1.进入exp/basic/02_pthread目录,使用VI命令即可打开源代码进行阅读
2.运行make产生pthread可执行文件
3.挂载:
服务器设置——nfs服务器(设置需要共享的目录),设置开发板的ip地址:
ifconfigeth0192.168.1.5,在实验箱终端里输入mount-tnfs-onolock192.168.1.234:
/up-techpxa270/exp/mnt/nfs,/mnt/nfs即为共享目录
4.进入/mnt/exp/basic/02_pthread目录,运行./pthread,观察运行结果的正确性,若显示结果太快,可以用以下命令输出显示结果到pthread.txt文件./pthread>pthread.txt,然后再用catpthread.txt查看文件内容,结合程序分析结果;
最后的结果:
put-->998
put-->999
producerstopped!
993-->get
994-->get
995-->get
996-->get
997-->get
998-->get
999-->get
consumerstopped!
5.加入一个新的线程用于处理键盘输入,并在按特定字符时终止所有线程。
voidlistener(void*data)
{
if(getch()=’q’){
pthread_cancel(id1);
pthread_cancel(id2);}
pthread_exit(0);
}
(2)写出程序pthread.c的分析;
#include
#include
#include
#include"pthread.h"
#defineBUFFER_SIZE16
/*设置一个整数的圆形缓冲区*/
structprodcons{
intbuffer[BUFFER_SIZE];/*缓冲区数组*/
pthread_mutex_tlock;/*互斥锁*/
intreadpos,writepos;/*读写的位置*/
pthread_cond_tnotempty;/*缓冲区非空信号pthread_cond_tnotfull;/*缓冲区非满信号*/
};
/*--------------------------------------------------------*/
/*初始化缓冲区*/
voidinit(structprodcons*b)
{
pthread_mutex_init(&b->lock,NULL);/*初始化后处于解锁状态*/
pthread_cond_init(&b->notempty,NULL);/*指针为空时默认状态*/
pthread_cond_init(&b->notfull,NULL);
b->readpos=0;
b->writepos=0;
}
/*--------------------------------------------------------*/
/*向缓冲区中写入一个整数*/
voidput(structprodcons*b,intdata)
{
pthread_mutex_lock(&b->lock);
/*等待缓冲区非满*/
while((b->writepos+1)%BUFFER_SIZE==b->printf("waitfornotfull\n");
pthread_cond_wait(&b->notfull,&b->lock);
}
/*写数据并且指针前移*/
b->buffer[b->writepos]=data;
b->writepos++;
if(b->writepos>=BUFFER_SIZE)b->writepos=/*设置缓冲区非空信号*/
pthread_cond_signal(&b->notempty);
pthread_mutex_unlock(&b->lock);
}
/*--------------------------------------------------------*/
/*从缓冲区中读出一个整数*/
intget(structprodcons*b)
{
intdata;
pthread_mutex_lock(&b->lock);
/*等待缓冲区非空*/
while(b->writepos==b->readpos){
printf("waitfornotempty\n");
pthread_cond_wait(&b->notempty,&b->lock);
}
/*读数据并且指针前移*/
data=b->buffer[b->readpos];
b->readpos++;
if(b->readpos>=BUFFER_SIZE)b->readpos=0;
/*设置缓冲区非满信号*/
pthread_cond_signal(&b->notfull);
pthread_mutex_unlock(&b->lock);
returndata;
}
/*--------------------------------------------------------*/
#defineOVER(-1)
structprodconsbuffer;
/*--------------------------------------------------------*/
void*producer(void*data)/*生产者进程函数*/
{
intn;
for(n=0;n<1000;n++){
printf("put-->%d\n",n);
put(&buffer,n);
}
put(&buffer,OVER);
printf("producerstopped!
\n");
returnNULL;
}
/*--------------------------------------------------------*/
void*consumer(void*data)/*消费者进程函数*/
{
intd;
while
(1){
d=get(&buffer);
if(d==OVER)break;
printf("%d-->get\n",d);
}
printf("consumerstopped!
\n");
returnNULL;
}
/*--------------------------------------------------------*/
intmain(void)
{
pthread_tth_a,th_b;
void*retval;/*存储被等待线程的返回值*/
init(&buffer);
pthread_create(&th_a,NULL,producer,0);
pthread_create(&th_b,NULL,consumer,0);
/*等待生产者和消费者结束*/
pthread_join(th_a,&retval);
pthread_join(th_b,&retval);
return0;
}
(3)写出修改后的代码并加以说明;
voidlistener(void*data)
{
if(getch()=’q’){
pthread_cancel(id1);
pthread_cancel(id2);}
pthread_exit(0);
}
在main函数中:
intmain(void)
{
pthread_tth_a,th_b,th_a;
void*retval;
init(&buffer);
pthread_create(&th_a,NULL,producer,0);
pthread_create(&th_b,NULL,consumer,0);