嵌入式实验Word格式文档下载.docx
《嵌入式实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《嵌入式实验Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
实验二嵌入式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、完成主机的挂载和程序的执行
1、建立工作目录
[root@homearm2014s]#mkdirhello
[roothomearm2014s]#cdhello
2、编写程序源代码
#include<
stdio.h>
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、学习使用多线程完成串口收发的方法
异步串行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:
[/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<
/*标准输入输出定义*/
stdlib.h>
/*标准函数库定义*/
unistd.h>
/*linux标准函数定义*/
sys/types.h>
sys/stat.h>
fcntl.h>
/*文件控制定义*/
termios.h>
/*POSIX终端控制定义*/
errno.h>
/*错误号定义*/
pthread.h>
/*线程库定义*/
打开串口
在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(&
tcsetattr(fd,TCSANOW,&
/*设置终端的相关参数*/
tcsetattr(fd,const,&
Const:
TCSANOW:
不等数据传输完毕就立即改变属性。
TCSADRAIN:
等待所有数据传输结束才改变属性。
TCSAFLUSH:
清空输入输出缓冲区才改变属性。
校验位和停止位的设置:
无效验8位
Option.c_cflag&
=~PARENB;
=~CSTOPB;
=~CSIZE;
Option.c_cflag|=~CS8;
奇效验(Odd)7位
Option.c_cflag|=~PARENB;
=~PARODD;
Option.c_cflag|=~CS7;
偶效验(Even)7位
Option.c_cflag|=~PARODD;
Space效验7位
=&
~CSIZE;
Option.c_cflag|=CS8;
设置停止位:
1位:
options.c_cflag&
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功能的编程实现
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编辑器阅读理解源代码。
运行make产生ad可执行文件。
[root@localhost04_ad]#ls
adhardware.hmain.oMakefile.baks3c2410-adc.h
binmain.cMakefilereadme.txtsrc
3、下载
换到超级终端窗口,使用NFSmount开发主机的/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));
copy_from_user(&
data,buffer,count);
adcdev.channel=ADC_WRITE_GETCH(data);
adcdev.prescale=ADC_WRITE_GETPRE(data);
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使