嵌入式系统原理与应用

更新时间:2024-01-26 09:42:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

班级:学号:姓名:

嵌入式系统原理与应用

实验报告

1

实验一Linux shell基本命令的使用

一、 实验目的和要求

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,写入“Hello Zhang Fei!”保存退出 3、 将b步骤生成的文件SystemInfo.txt,移动到Lab1文件夹,并设置文件权限为:文件所有者可读写,其它为只读; 并查看文件列表,权限是否设置

2

4、 返回到当前用户的主目录

5、 将Lab1文件夹打包生成tar.gz文件,并删除原文件夹

五、 实验报告要求:

按实验步骤执行,在纸质实验报告上详细描述执行流程(使用命令及操作流程),并在

电子版的实验报告上要求另加适当截图描述;

a) 启动系统,打开终端;或使用putty连接系统(如果未安装ssh,可以使用sudo apt-get

install ssh):

运行Applications→Terminal

图1.1 启动终端

b) 查看系统信息,并将以下查看内容重定向添加到文件systemInfo.txt,最后清屏:1、 查看系统当前所有进程:

运行Terminal→ps→ps >>SystermInfo.txt

图1.2 查看系统当前所有进程

2、 查看当前系统信息:

3

运行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

4

图1.6 查看系统当前网络地址

c) 系统用户数据:

1、 切换到root状态:

运行Terminal→su - root→输入密码登录

图1.7 切换到root状态

2、 创建用户(姓名拼间首字母加学号后两位,如张飞 ZF01),密码是123456:运行Terminal→useradd –m dhy27→passwd dhy27→输入并确定密码

图1.8 创建用户

3、 进入新用户,并查看默认所在主目录及所有登录系统的用户:

运行Terminal→su – dhy27→ls→who

5

图1.9 进入新用户

d) 文件操作:

1、 在当前用户的主目录下,创建文件夹Labl:

运行Terminal→mkdir Labl

图1.10 创建文件Labl

2、 进入Lab1文件夹,新建文件welcome.txt,写入“Hello Zhang Fei!”保存退出:运行Terminal→vi welcome.txt

图1.11 进入Labl文件

在vi模式下创建文件

图1.12 在vi模式在创建文件

6

3、将b步骤生成的文件SystemInfo.txt,移动到Lab1文件夹,并设置文件权限为:

文件所有者可读写,其它为只读; 并查看文件列表,权限是否设置: 运行Terminal→mv /home/dhy/SystermInfo.txt /home/dhy27/Labl

图1.13 移动文件

运行Terminal→chmod 644 /home/dhy27/Labl/SystermInfo.txt→ls –l /home/dhy27/Labl

图1.14 更改权限

4、返回到当前用户的主目录:

运行Terminal→su dhy27→pwd→cd→pwd

图1.15 返回主目录

5、将Lab1文件夹打包生成tar.gz文件,并删除原文件夹:

运行Terminal→tar –cvf tar.gz /home/dhy27/Labl→ls→rm –r Labl

图1.16 打包文件

7

实验二 GCC 及GDB的使用

一、实验目的和要求

1. 掌握VI编译环境。 2. 掌握GCC编译命令。 3. 掌握多个文件共同编译方法。 4. 掌握GDB调试命令。

二、实验内容和原理

1.在VI编辑器里编写简单的“hello,world,I am 13050141XX XXX”,利用GCC编译为可执行文件,执行,观察运行结果。

2.在VI编辑器里编写多个文件(至少两个,其中一个为主程序,一个为需要调用的子程序),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。学习书写MAKEFILE文件,编译,执行,观察结果。

3.编写循环结构的程序,利用GCC 编译(加参数-g)为可执行文件,利用GDB调试,学习GDB调试命令。

三.实验环境

1.硬件:PC机

2.软件:LINUX操作系统、虚拟机

四.实验步骤

1.用vi编辑器新建hello.c文件,并用gcc编译器编译,执行,显示结果

8

图2.1 执行hello

2.makefile文件的编写,多文件编译执行

1)主程序部分

图2.2 主程序

1)子程序部分

图2.3 子程序

2)头文件部分

图2.4 头文件

3)makefile的程序

9

图2.5 Makefile的程序

5)查看makefile的内容

图2.6 查看makefile的内容

6)主程序,子程序的编译执行输出结果

图2.7 执行结果

3.gdb的调试

1)用vi编辑器新建tst.c文件

10

图2.8 tst源程序

2)使用gdb tst 命令启动gdb调试

图2.9 启动gdb调试

3)使用 gdb l 命令列出源代码

11

图2.10 使用 gdb l 命令列出源代码

4)使用break 16 命令设置断点位置在16行;使用break func,设置断点,在func函数入口处;使用 info break 查看断点信息;使用 r 命令,运行程序;使用 n 命令,单条语句执行;

图2.11 使用断点

12

5)使用c命令继续运行程序,使用p i 命令打印变量i的值,print命令简写

图2.12 使用继续指令

6)使用 bt 命令查看函数堆栈

图2.13 查看函数堆栈

7)使用 finish 命令退出函数,使用 q 退出gdb调试。

图2.14 使用finish命令退出函数

13

实验三交叉编译环境配置

一、实验目的和要求

熟悉 Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。使用Linux 的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。

二、实验内容

e) 配置网络,包括配置IP 地址、NFS 服务、防火墙。 f) 安装交叉编译器

g) 配置超级终端,下载文件到目标机上。

三、实验设备及工具(包括软件调试工具)

硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。

软件:REDHAT LINUX 9.0+超级终端+ARM-LINUX 开发环境

四、实验步骤

1、虚拟机设置为桥接模式。

14

图3.1 虚拟机设置为桥接模式

2、配置IP地址,设置为192.168.0.121

图3.2 IP设置

图3.3 配制以太网

3、关闭防火墙

操作如下:点击红帽子开始菜单,选择安全级别设置,选中无防火墙。

15

图3.4 关闭防火墙

4、打开桌面超级终端,配置COM1,115200波特率,8N1,实验箱插上电源线,网线与主机相连,串口线与主机串口1相连,开机,看bootloader程序VIVI是否自动加载,回车后进入命令提示符。

16

5、宿主机和目标机互相PING,看是否PING通

宿主机Ping 192.168.0.121 超级终端Ping 192.168.0.123

图3.5 ping检验是否联通

6、安装NFS服务器,点击主菜单运行系统设置->添加/删除应用程序->服务器->服务器配置工具->system-config-nfs,system-config-samba,安装

17

图3.6 安装NFS服务器

7、安装交叉编译器

利用U盘将提供的文件夹拷入系统中,虚拟机->可移动设备中将你的U盘连接上 建议的代码

fdisk -l (看SDB1出现没有) mkdir /mnt/usb

mount -t vfat /dev/sdb1 /mnt/usb -codepage=936,iocharset=cp936 cd /mnt/usb ./install.sh

运行完后卸载U盘 umount /dev/sdb1

18

图3.7 安装交叉编译器

8、在超级终端下挂载文件夹

mount -t nfs -o nolock 192.168.0.103:/liqing /host

实验四熟悉 Linux 开发环境

一、实验目的

熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。使用Linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。

19

二、实验内容

本次实验使用 Redhat Linux 9.0 操作系统环境,安装 ARM-Linux 的开发库及编译器。创建一个新目录,并在其中编写 hello.c 和 Makefile 文件。学习在 Linux 下的编程和编译过程,以及 ARM 开发板的使用和开发环境的设置。下载已经编译好的文件到目标开发板上运行。

三、预备知识

C语言的基础知识、程序调试的基础知识和方法,Linux的基本操作。

四、实验设备及工具(包括软件调试工具)

硬件:UP-CUP S2410 经典平台、PC 机 Pentium 500 以上, 硬盘 10G 以上。软件:PC 机操作系统 REDHAT LINUX 9.0+MINICOM+ARM-LINUX 开发环境

五、实验步骤

1、建立工作目录

4.1 建立工作目录

2、编写程序源代码

我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:

20

图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文件的几个主

21

要部分:

e CC指明编译器

e EXEC 表示编译后生成的执行文件名称 e OBJS目标文件表e CFLAGS编译参数e LDFLAGS连接数e all:编译主入口 e clean:清除编译结果

与上面编写hello.c的过程类似,用vi来创建一个Makefile文件并将代码录入其中4、编译应用程序

在上面的步骤完成后,我们就可以在hello目录下运行“make”来编译我们的程序了。如果进行了修改,重新编译则运行: 图4.3 编译应用程序

22

5、下载调试

在宿主PC计算机上启动NFS服务,并设置好共享的目录,具体配置请参照前面第一章第四节中关于嵌入式Linux环境开发环境的建立。在建立好NFS共享目录以后,我们就可以进入超级终端中建立开发板与宿主PC机之间的通讯了。

再进入/mnt目录运行刚刚编译好的hello程序,查看运行结果。

图4.4 运行结果

实验五串行端口程序设计

一、实验目的

了解在linux 环境下串行程序设计的基本方法。

掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用。 学习使用多线程来完成串口的收发处理。

二、实验内容

学习终端 I /O 函数的使用方法,学习将多线程编程应用到串口的接收和发送程序

23

设计中。发送自己的学号给串口。

三、预备知识

有C语言基础。

掌握在Linux下常用编辑器的使用。 掌握Makefile的编写和使用。

掌握Linux下的程序编译与交叉编译过程

四、实验设备及工具

硬件:UP-CUPS2410经典平台、PC机Pentium500以上,硬盘10G以上。软件:PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境

五、程序分析

本实验的程序流程图如下:

24

本实验的代码如下: #include #include #include #include #include #include #define BAUDRATE B115200 #define COM1 \#define COM2 \

图5.1 实验流程图25

#define ENDMINITERM 27 #define FALSE 0 #define TRUE 1

volatile int STOP=FALSE; volatile int fd; void child_handler(int s) {

printf(\}

void* receive(void * data) { int c;

printf(\{

read(fd,&c,1); /* com port */ write(1,&c,1); /* stdout */ }

printf(\}

int main(int argc,char** argv) {

struct termios oldtio,newtio,oldstdtio,newstdtio; struct sigaction sa; int ok;

pthread_t th_a, th_b, th_c; void * retval;

if( argc > 1)

fd = open(COM2, O_RDWR ); else

26

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);

27

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、 下载调试

28

[/mnt/yaffs]mount -tnfs-o nolock 192.168.0.103/arm2410cl /host [/mnt/yaffs]cd/host/exp/basic/03_tty/ [/host/exp/basic/03_tty]./term

29

七、实验结果

图5.4 实验结果

实验六 A/D 接口实验

一、实验目的

了解在linux环境下对S3C2410芯片的8通道10位A/D的操作与控制。

二、实验内容

学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求。阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。利用外部模拟信号编程实现ARM循环采集全部前4路通道,并且在超级终端上显示。

三、预备知识

有 C 语言基础。

30

掌握在 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\#defineADC_DEV

\

cintadc_fd=-1;

staticintinit_ADdevice(void) {

if((adc_fd=open(ADC_DEV,O_RDWR))<0){

printf(\turn -1;

}

31

}

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; //sets3c44b0AD

registerandstartADif(init_ADdevice()<0)

return -1;

/*Createthethreads*/

pthread_create(&th_com,NULL,comMonitor,0);printf(\while(stop==0){

for(i=0;i<=2; i++){//采样0~2路A/D值

d=((float)GetADresult(i)*3.3)/1024.0;printf(\

}

32

usleep(1);printf(\r\

}

/* Waituntilproducer and

consumerfinish.*/pthread_join(th_com,&retval);

printf(\0;

}

六、实验步骤

1、编写源码

使用vi编辑器或其他编辑器编辑源代码。 2、编译应用程序

运行make产生ad可执行文件

图6.1 运行make产生ad可执行文件

3、下载调试

换到超级终端窗口,使用 NFS mount开发主机的/arm2410cl到/host目录。

[/mnt/yaffs]mount -tnfs-o nolock

33

192.168.0.56:/arm2410cl/host[/mnt/yaffs]insmodad/s3c2410-adc.o [/mnt/yaffs]cd/host/exp/basic/04_ad/[/host/exp/basic/04_ad]./ad

我们可以通过调节开发板上的三个黄色的电位器,来查看a0、a1、a2的变化。

七、实验结果

图6.2实验结果

实验七简单嵌入式WEB服务器实验

一、实验目的

掌握在ARM开发板实现一个简单WEB服务器的过程。 学习在ARM开发板上的SOCKET网络编程。 学习Linux下的signal()函数的使用。

二、实验内容

学习使用socket进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读HTTP 协议的相关内容,学习几个重要的网络函数的使用方法。在PC计算机上使用浏览器测试嵌入式WEB服务器的功能。

三、预备知识

C 语言的基础知识、程序调试的基础知识和方法,Linux环境下常用命令和vi编辑器的操作。

HTTP1.0协议的基本知识。

SOCKET编程的几个基本函数的使用方法。

四、实验设备及工具

34

硬件:UP-CUPS2410经典平台、PC机Pentium500以上,硬盘10G以上。软件:PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境 五、功能需求详细说明

1.获取服务器当前目录文件列表将服务器当前目录下所有文件的信息发送给客户端,信息包括:文件名、大小、日期。 2.获取指定文件将客户请求的文件发送给客户。 3.获取 HTML 类型文件将客户请求的 HTML 类型文件发送给客户。4.获取纯文本文件将客户请求的纯文本发送给客户。 5.获取 JPG 图像文件将客户请求的 JPG 图像文件发送给客户。 6.获取 GIF 图像文件将客户请求的 GIF 图像文件发送给客户。 7.解析用户请求分析客户的请求,将请求信息解析为几个变量。 8.请求的命令、请求的文件名、请求的文件类型。 六、程序代码

switch(content_type) { case't':

fprintf(f,\break; case'g':

fprintf(f,\reak; case'j':

fprintf(f,\break; case'h':

fprintf(f,\break; }

发送服务器信息:fprintf(f,\

35

发送文件永不过期:fprintf(f,\

七、实验步骤

1.阅读理解源码

进入/arm2410c1/exp/basic/07_httpd/目录,使用vi编辑器或其他编辑器阅读理解源码。 2.编译运行文件

运行make产生可执行文件httpd

图7.1 编译

3.下载调试

图7.2 下载调试

八、实验结果

36

图7.3 实验结果

实验八 8 字数码管和点阵数码管实验

一、实验目的

学习LED的相关知识 掌握74HC273芯片的工作原理

二、实验内容

学习LED相关知识,了解74HC273芯片对LED点亮的工作机制,熟练阅读74HC273芯片资料,掌握对它的使用。在七段LED上循环轮流显示学号,如“13 05 01 41 01”,在点阵LED上显示自己设计的图案,轮流显示。

三、预备知识

有 C语言基础 掌握在 Linux下常用编辑器的使用 掌握 Makefile的编写和使用 掌握 Linux 下的程序编译与交叉编译过程 需要部分数字电路的知识 四、实验设备及工具

37

硬件:UP-CUPS2410经典平台、PC机Pentium500以上,硬盘10G以上。软件:PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境

五、LED 数码管电路图

其中各个引脚的功能在下面都有描述。

74HC273在8字数码管中开发板中的连接如图所示:

开发板设置2个数码管,由74HC273控制。74HC273是同步串行转并行的锁存器,在此通过SPI总线和CPU连接,锁存数据后驱动数码管发光。

38

上面一副图的最左边接的是下面图的最右边

六、程序分析

LEDCODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//这个是10个 数字的编码

//在这里主要是用到编码的过程

假设a是8字型数码管的最上一横,以顺时针以次列出b,c,d,e,f.中间那一横为g,如果要显示为0的话,由于在开发板中的连接是共阳极(请参考我们的电路图),所以只需要满足a,b,c,d,e,f为0即可,而g为1,因为两个数码管的中间是个点号,我们用h表示,并且总是让它置为1。因为我们在开发板的连接上可以看到a对应d0,b对应d1,..........h对应d7,所以当想显示为0的时候,那么应该是11000000。转化成为16进制的数据,也就成了0Xc0.对应我们在LEDCODE【10】数组中的第一位。其他的每一位值,大家可以根据上面的方法依次类推。

在for循环中我们写了如下语句。

LEDWORD=(LEDCODE[i]<<8)|LEDCODE[9-i];

那是因为LEDWORD是一个16位的数。我们是需要将两个8字数码管同时显示,所以将

39

LEDCODE[i]

左移8位,然后再加上个位使得十位和个位同时显示。

至于显示点阵数码管还是显示8字数码管,主要是通过IOCTL函数中的命令来实现的,也就是在代码中出现的

ioctl(fd,0x12,LEDWORD);ioctl(fd,0x11,LEDWORD); 下面分析这个IOCTL函数的原型

staticints3c2410_led_ioctl(structinode*inode,structfile*filp,unsigned intcmd, unsigned int arg)

{

//printk(\

buffer

is %x\\n\

case LED_TUBE_IOCTRL://如果是0x11命令,那么点亮8字数码管 return*(volatile

*)s3c2410_led_tube_base=arg; return *(volatile *)s3c2410_led_dig_base=arg; default :

unsigned

short

case LED_DIG_IOCTRL://如果是0x12命令,那么点亮点阵数码管

unsigned

short

return printk(\

}

return 0; }

七、实验步骤

1、编写源码

使用vi编辑器或其他编辑器编写源代码

40

图8.1

图8.2 编写test_led文件

2、编译应用程序

运行make产生test_led可执行文件test_led

41

图8.3 运行make产型可执行文件

3、下载调试 图8.4 下载调试

八、实验结果(加图)

图8.5 实验结果

42

本文来源:https://www.bwwdw.com/article/bpzw.html

Top