嵌入式实验.docx
- 文档编号:9140941
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:22
- 大小:269.53KB
嵌入式实验.docx
《嵌入式实验.docx》由会员分享,可在线阅读,更多相关《嵌入式实验.docx(22页珍藏版)》请在冰豆网上搜索。
嵌入式实验
南京邮电大学通达学院
实验报告
实验名称:
基于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
#include
#include
#include
#include
#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使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验