《嵌入式系统》实验报告指导书含答案.docx

上传人:b****5 文档编号:6695409 上传时间:2023-01-09 格式:DOCX 页数:20 大小:131.24KB
下载 相关 举报
《嵌入式系统》实验报告指导书含答案.docx_第1页
第1页 / 共20页
《嵌入式系统》实验报告指导书含答案.docx_第2页
第2页 / 共20页
《嵌入式系统》实验报告指导书含答案.docx_第3页
第3页 / 共20页
《嵌入式系统》实验报告指导书含答案.docx_第4页
第4页 / 共20页
《嵌入式系统》实验报告指导书含答案.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

《嵌入式系统》实验报告指导书含答案.docx

《《嵌入式系统》实验报告指导书含答案.docx》由会员分享,可在线阅读,更多相关《《嵌入式系统》实验报告指导书含答案.docx(20页珍藏版)》请在冰豆网上搜索。

《嵌入式系统》实验报告指导书含答案.docx

《嵌入式系统》实验报告指导书含答案

实验一熟悉嵌入式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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1