嵌入式实验.docx

上传人:b****6 文档编号:9140941 上传时间:2023-02-03 格式:DOCX 页数:22 大小:269.53KB
下载 相关 举报
嵌入式实验.docx_第1页
第1页 / 共22页
嵌入式实验.docx_第2页
第2页 / 共22页
嵌入式实验.docx_第3页
第3页 / 共22页
嵌入式实验.docx_第4页
第4页 / 共22页
嵌入式实验.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

嵌入式实验.docx

《嵌入式实验.docx》由会员分享,可在线阅读,更多相关《嵌入式实验.docx(22页珍藏版)》请在冰豆网上搜索。

嵌入式实验.docx

嵌入式实验

南京邮电大学通达学院

实验报告

 

实验名称:

基于ADS开发环境的程序设计

嵌入式Linux交叉开发环境建立________嵌入式Linux环境下的程序设计

多线程程序设计

串口程序设计

A/D接口实验

课程名称嵌入式开发实验

班级学号10002406

姓名倪瑶赟

开课时间2013/2014学年第1学期

 

实验一基于ADS开发环境的程序设计

一、实验目的

1、学习ADS开发环境的使用;

2、学习和掌握ADS环境下的汇编语言及C语言程序设计;

3、学习和掌握汇编语言及C语言的混合编程方法。

二、实验内容

1、编写和调试汇编语言程序;

2、编写和调试C语言程序;

3、编写和调试汇编语言及C语言的混合程序;

4、编写程序测试多寄存器传送指令的用法。

三、实验原理

ADSARM包括两个部分开发环境CodeWarrior编辑界面和AXD调试界面,前者具有编辑,编译,链接等功能并能生成二进制(.bin)文件和可执行映象文件(.axf),,以及各源文件的目标代码(.o);后者可以装载映象文件或二进制文件到ARM平台上,并可实现追踪调试。

四、实验过程与关键代码分析

题:

三个寄存器中比较最大的3,7,1

在工程窗中点击Make图标,产生可执行代码,在工程窗中点击Debug图标,打开AXD调试窗口,AXD自动打开汇编程序

通过File→OpenFile可将c程序打开观察程序的执行情况

观察参数传递的情况,AXD的ProcessorViews→Watch可打开Watch窗口,从中观察c程序中的变量。

工程由两个源文件组成,入口文件是test.c,其中调用test.s

参数通过R0,R1,R2比较,最大值返回在R3中

改变R2中的值

调试:

 

五、实验小结

通过这次实验,使我对ads这个环境有了进一步的了解,学会了怎样运行和调试程序。

实验二嵌入式Linux交叉开发环境的建立

一、实验目的

1、掌握嵌入式Linux交叉开发环境的建立方法

2、学习和掌握Linux常用命令

3、学习和掌握vi编辑器的使用

二、实验内容

1、搭建嵌入式Linux交叉开发环境

2、熟悉Linux的常用命令

3、熟悉vi编辑器的常用命令

三、实验原理

首先在宿主机(Host)上安装开发工具,编辑、编译目标板(Target)的Linux引导程序、内核和文件系统,然后下载到目标板上运行。

四、实验过程与关键代码分析

交叉开发环境建立步骤

1安装主机Windows+VMWare在VMWare中安装linux虚拟机

Linux共享文件设置

(1)关闭360防护

(2)打开VMware,在Linux对应的command菜单中选VirtualMachinesettings,

(3)在打开的窗口中将SharedFolders设成AlwaysEnable

(4)加入新的共享文件夹:

LinxV7.2

(5)PowerOnRedhat口令:

root密码:

123456

2在linux虚拟机上安装开发工具软件gcc

3开发环境配置(linux)配置网络:

配置IP地址、NFS服务、防火墙,配置NFS:

设置主机和

(1)目标机间的共享目录

安装NFS服务配置项

在虚拟机中右击RedHatLinux->Settings,CD/DVD(IDE)栏usingfile选择disk1.iso。

RedHat->系统设置->添加/删除应用程序,在软件包管理窗中找到“服务器”一栏,查看服务器配置工具的细节,将前9个选项都打勾,点击“更新”

4配置超级终端(windows)目标机的信息窗口

(1)输入区号025

(2)连接描述:

名称arm(3)连接到:

连接使用COM1

(4)设置COM1属性:

1152008无1无

5启动

(1)打开电源开关

(2)ViVi引导,按“回车”或等待30秒启动Linux操作系统,

(3)按“回车”之外的任意键则进入ViVi控制台,输入boot也可进入Linux系统

(4)进入Linux系统后,[/mnt/yaffs],可查看目录内容,蓝色为文件夹

五、实验小结

通过本次实验我明白了交叉编译环境的意义,并且学会了如何搭建嵌入式交叉编译环境,学会了嵌入式交叉编译环境的使用,以前都是在windows环境下编程,接触嵌入式交叉编译环境并不是太容易,课下还需要不断的联系,才能更好地掌握嵌入式交叉编译环境的使用。

实验三嵌入式Linux环境下的程序设计

一、实验目的

1、掌握嵌入式Linux环境下的程序设计方法

2、学会编写Makefile文件

二、实验内容

1、熟悉嵌入式教学实验箱的使用

2、编写C程序和Makefile文件

3、编译程序产生可执行程序

4、完成主机的挂载和程序的执行

三、实验原理

首先在宿主机(Host)上安装开发工具,编辑、编译目标板(Target)的Linux引导程序、内核和文件系统,然后下载到目标板上运行。

四、实验过程与关键代码分析

1、建立工作目录

[root@homearm2014s]#mkdirhello

[roothomearm2014s]#cdhello

2、编写程序源代码

#include

main()

{

printf(“helloworld\n”);

}

用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代

码:

[root@arm2420shello]#vihello.c

按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再

用命令“:

wq”保存并退出。

这样我们便在当前目录下建立了一个名为hello.c的文件

3、编写Makefile

CC=armv4l-unknown-linux-gcc

EXEC=hello

OBJS=hello.o

CFLAGS+=

LDFLAGS+=–static

all:

$(EXEC)

$(EXEC):

$(OBJS)

$(CC)$(LDFLAGS)-o$@$(OBJS)

clean:

-rm-f$(EXEC)*.elf*.gdb*.o

注意:

“$(CC)$(LDFLAGS)-o$@$(OBJS)”和“-rm-f$(EXEC)*.elf*.gdb*.o”前空白由一

个Tab制表符生成,不能单纯由空格来代替。

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

[root@arm2410shello]#viMakefile

4、编译应用程序

在上面的步骤完成后,就可以在hello目录下运行“make”来编程序了。

[root@arm2410shello]#makeclean

[root@arm2410shello]#make

5、下载调试

在宿主PC计算机上启动NFS服务,并设置好共享的目录

[/mnt]mount-tnfs192.168.0.121:

/arm2410s/mnt/nfs

[/mnt]cd/nfs

[/mnt/nfs]./hello

helloworld

五、实验小结

这次Linux嵌入式系统课程的学习,感慨颇多。

对Linux的了解的使用从无到有,从理论到动手实验,从遇到问题到解决问题,学到了很多的东西。

学习和实验都是一个不断发现问题,解决问题的过程。

由于对知识的缺乏和掌握的不牢固,总会遇到各种的问题。

遇到问题时,首先要找出问题所在,努力自己解决,然后可以利用方便的网络资源,寻求答案。

在试验的过程中遇到的问题,在同学的指导和老师的帮助下,最终得以解决,并且加深了我的理解,在此表示感谢。

 

实验四多线程程序设计

一、实验目的

1、了解多线程程序设计的基本原理

2、学习Linux多任务管理程序的开发

3、学习pthread常用库函数的使用

二、实验内容

1、编写多线程程序和Makefile文件

2、编译程序产生可执行程序

3、完成主机的挂载和程序的执行

三、实验原理

四、实验过程与关键代码分析

1阅读源代码及编译应用程序使用vi编辑器或其他编辑器阅读理解源代码,运行make产生pthread可执行文件

.c文件

Makefile

Makeclean:

实验箱结果:

运行pthread,观察运行结果的正确性。

运行程序最后一部分结果如下:

五、实验小结

Linux平台的默认情况下,各个线程之间是相互独立的,一个线程的中止不会影响到其它线程,但是一个已经终止的线程的资源并不会随着线程的终止而释放,我们可以调用pthread_join(),来等待其它一个线程并获得其终止状态同时释放它的资源,但是调用该函数的线程又会阻塞。

我们还有一个解决办法:

在线程中调用:

pthread_detach(pthread_self());设置线程为detached状态,这样当线程返回的时候,即用户下线时,其所占的资源会自动释放。

实验五串口程序设计

一、实验目的

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

2、掌握终端的主要属性及设置方法

3、学习使用多线程来完成串口的收发处理

二、实验内容

1、理解程序代码,学习串口属性的程序设置方法

2、学习使用多线程完成串口收发的方法

3、编译程序产生可执行程序

4、完成主机的挂载和程序的执行

三、实验原理

异步串行I/O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。

据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对

线即可进行。

接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字

符。

为了恢复发送的信息,双方必须协调工作

四、实验过程与关键代码分析

实验过程:

1、阅读理解源码

进入exp\basic\03_tty目录,使用vi编辑器阅读理解源代码。

[root@zxtroot]#cd/arm2410s/exp/basic/03_tty/

2、编译应用程序

运行make产生term可执行文件

[root@zxt03_tty]#make

[root@zxt03_tty]#ls

MakefileMakefile.baktermterm.cterm.otty.c

3、下载调试

切换到超级终端窗口,使用NFSmount开发主机的/arm2410s到/mnt/nfs目录。

进入exp\basic\03_tty目录,运行term,观察运行结果的正确性。

[/mnt]mount-tnfs192.168.0.121:

/arm2410s/mnt/nfs

[/mnt]cd/mnt/nfs/exp/basic/03_tty/

[/mnt/nfs/exp/basic/03_tty]./term

readmodem

senddata

123456789:

;<=>?

@ABCDEFGHIJKLMNOPQRSTUVWX

执行term时出现下面的错误提示:

/dev/ttyS0:

Nosuchfileordirectory

解决方法:

建立一个连接[/mnt/yaffs]cd/dev

[/dev]ln–sf/dev/tts/0ttyS0大写

代码分析:

串口操作需要的头文件:

#include/*标准输入输出定义*/

#include/*标准函数库定义*/

#include/*linux标准函数定义*/

#include

#include

#include/*文件控制定义*/

#include/*POSIX终端控制定义*/

#include/*错误号定义*/

#include/*线程库定义*/

打开串口

在Linux下串口文件位于/dev下,一般串口1为/dev/ttyS0,串口2为/dev/ttyS1。

开发板中串口设备位于/dev/tts/下

打开串口是通过标准的文件打开函数来实现的

intfd;

fd=open("/dev/ttyS0",O_RDWR);

/*以读写方式打开串口*/

if(-1==fd){/*不能打开串口1*/

perror("提示错误!

");

}

串口设置

最基本的设置包括波特率设置,校验位和停止位设

置。

串口的设置主要是设置structtermios结构体

的各成员值,关于该结构体的定义可以查看

/arm2410s/kernel-2410s/include/asm/termios.h文件。

structtermio

{

unsignedshortc_iflag;/*输入模式标志*/

unsignedshortc_oflag;/*输出模式标志*/

unsignedshortc_cflag;/*控制模式标志*/

unsignedshortc_lflag;/*localmodeflags*/

unsignedcharc_line;/*linediscipline*/

unsignedcharc_cc[NCC];/*controlcharacters*/

};

波特率设置

StructtermiosOpt;

tcgetattr(fd,&Opt);

cfsetispeed(&Opt,B19200);/*设置为19200Bps*/

cfsetospeed(&Opt,B19200);

tcsetattr(fd,TCSANOW,&Opt);/*设置终端的相关参数*/

tcsetattr(fd,const,&Opt);

Const:

TCSANOW:

不等数据传输完毕就立即改变属性。

TCSADRAIN:

等待所有数据传输结束才改变属性。

TCSAFLUSH:

清空输入输出缓冲区才改变属性。

校验位和停止位的设置:

无效验8位

Option.c_cflag&=~PARENB;

Option.c_cflag&=~CSTOPB;

Option.c_cflag&=~CSIZE;

Option.c_cflag|=~CS8;

奇效验(Odd)7位

Option.c_cflag|=~PARENB;

Option.c_cflag&=~PARODD;

Option.c_cflag&=~CSTOPB;

Option.c_cflag&=~CSIZE;

Option.c_cflag|=~CS7;

偶效验(Even)7位

Option.c_cflag&=~PARENB;

Option.c_cflag|=~PARODD;

Option.c_cflag&=~CSTOPB;

Option.c_cflag&=~CSIZE;

Option.c_cflag|=~CS7;

Space效验7位

Option.c_cflag&=~PARENB;

Option.c_cflag&=~CSTOPB;

Option.c_cflag&=&~CSIZE;

Option.c_cflag|=CS8;

设置停止位:

1位:

options.c_cflag&=~CSTOPB;

2位:

options.c_cflag|=CSTOPB;

读写串口

设置好串口之后,把串口当作文件读写。

􀁺发送数据:

charbuffer[1024];

intLength=1024;

intnByte;

nByte=write(fd,buffer,Length)

读取串口数据:

使用文件操作read函数读取,如果设置为原始模式(RawMode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。

可以使用操作文件的函数来实现异步读取,如

charbuff[1024];

intLen=1024;

intreadByte=read(fd,buff,Len);

关闭串口,关闭串口就是关闭文件。

close(fd);

五、实验小结

本次实验,对串行口在嵌入式系统中的应用有了初步的了解。

在源程序的阅读理解中有一定的困难,由于对嵌入式实验平台和Linux的不熟悉,具体操作步骤操作起来有些困难和不理解。

 

实验六A/D接口实验

一、实验目的

1、学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求

2、熟悉ARM本身自带的十位A/D控制器的接口及相关寄存器的功能及使用

3、学习ARM系统A/D功能的编程实现

二、实验内容

1、理解程序代码,了解A/D控制器相关寄存器的功能及配置方法

2、学习ARM系统A/D功能的编程实现

3、编译程序产生可执行程序

4、完成主机的挂载和程序的执行

三、实验原理

1.A/D转换器

A/D转换器是模拟信号源和CPU之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。

在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。

A/D转换器有以下类型:

逐位比较型、积分型、计数型、并行比较型、电压-频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。

常用的有以下两种:

1)双积分型的A/D转换器

2)逐次逼近型的A/D转换器

2.A/D转换的重要指标

1)分辨率(Resolution)2)精度(Accuracy)3)转换时间(ConversionTime)4)电源灵敏度(powersupplysensitivity)5)量程6)输出逻辑电平7)工作温度范围

3.ARM自带的十位A/D转换器

在实验箱上旋转AD0,AD1,AD2,AD3时a0,a1,a2,a3的数值会发生改变四、实验过程与关键代码分析

实验步骤

1、阅读理解源代码

进入/arm2410s/exp/basic/04_ad目录,使用vi编辑器阅读理解源代码。

2、编译应用程序

运行make产生ad可执行文件。

[root@localhost04_ad]#ls

adhardware.hmain.oMakefile.baks3c2410-adc.h

binmain.cMakefilereadme.txtsrc

3、下载

换到超级终端窗口,使用NFSmount开发主机的/arm2410s到/mnt/nfs目录。

[/mnt]mount-tnfs192.168.0.121:

/arm2410s/mnt/nfs

[/mnt]cd/mnt/nfs/exp/basic/04_ad/

4、调试

[/mnt/nfs/exp/basic/04_ad]./ad

执行./ad时出现下面的错误提示:

Erroropening/dev/adc/0rawadcdevice

解决方法:

[/mnt/yaffs/ad]ls

ads3c2410-adc.o

安装ad模块驱动

[/mnt/yaffs/ad]insmods3c2410-adc.o

Usings3c2410-adc.o

s3c2410-adcinitialized

可用lsmod查看已加载的模块

[/mnt/nfs/exp/basic/04_ad]./ad

PressEnterkeyexit!

a0=0.0032a1=3.2968a2=3.2968

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

关键代码分析:

由于编译开发板内核时直接把ad驱动加入到内核里面,对用户的只是下面的一个文件结

构。

在用户程序里只需要用到open、read、write、release等内核函数即可。

staticstructfile_operationss3c2410_fops={

owner:

THIS_MODULE,

open:

s3c2410_adc_open,

read:

s3c2410_adc_read,

write:

s3c2410_adc_write,

release:

s3c2410_adc_release,

};

下面我们对驱动部分重要函数进行说明。

ad驱动在内核里的代码我们放到了本次实验的

src文件下,s3c2410.h_chip.h里为arm2410头文件s3c2410.h初始化ADC的部分。

所有

代码也可以到内核里面去阅读。

staticints3c2410_adc_open(structinode*inode,structfile*file)

{

init_MUTEX(&adcdev.lock);

init_waitqueue_head(&(adcdev.wait));

adcdev.channel=0;

adcdev.prescale=0xff;

MOD_INC_USE_COUNT;

DPRINTK("adcopened\n");

return0;

}//AD通道和比例因子初始化

staticssize_ts3c2410_adc_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos)

{

intdata;

if(count!

=sizeof(data)){

//errorinputdatasize

DPRINTK("thesizeofinputdatamustbe%d\n",sizeof(data));

return0;

}

copy_from_user(&data,buffer,count);

adcdev.channel=ADC_WRITE_GETCH(data);

adcdev.prescale=ADC_WRITE_GETPRE(data);

DPRINTK("setadcchannel=%d,prescale=0x%x\n",adcdev.channel,adcdev.prescale);

returncount;

}//告诉内核驱动读哪一个通道的数据和设置比例因子

#defineSTART_ADC_AIN(ch,prescale)\

do{\

ADCCON=PRESCALE_EN|PRSCVL(prescale)|ADC_INPUT((ch));\

ADCCON|=ADC_START;\

}while(0)

//PRESCALE_EN左移14使

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

当前位置:首页 > 高等教育 > 农学

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

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