岑鉴峰嵌入式设计报告.docx
《岑鉴峰嵌入式设计报告.docx》由会员分享,可在线阅读,更多相关《岑鉴峰嵌入式设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
岑鉴峰嵌入式设计报告
北华航天工业学院
课程设计报告(论文)
设计课题:
Linux系统下数据采集
专业班级:
电子信息工程B09212班
学生姓名:
岑鉴峰
指导教师:
王达伟
设计时间:
2012.12.10——2012.12.15
北华航天工业学院电子工程系
嵌入式系统课程设计任务书
姓名:
岑鉴峰
专业:
电子信息工程
班级:
B09212
指导教师:
王达伟
职称:
讲师
课程设计题目:
Linux系统下的数据采集
已知技术参数和设计要求:
1.技术参数
(1)了解嵌入式系统实验箱核心板及ADC模块的电路原理图。
(2)熟悉linux文件系统,掌握linux字符设备驱动程序开发原理及的流程,理解用户应用程序调用内核设备驱动程序的过程
(3)理解无操作系统情况下,把S3C2410作为一个32位的单片机,用片上集成的ADC模块实现数据采集的工作过程。
(4)使用通用的Linux操作,编写简单的字符设备驱动程序,完成应用程序调用字符设备驱动程序,深入理解程序执行过程
(5)编写ADC模块的设备驱动程序,在实验箱上验证编写的设备驱动程序。
利用minicom,显示结果在PC机的终端上显示(不需要开发LCD驱动程序,从而在实验箱上的LCD屏上显示)。
2.技术指标:
(1)输入电压范围0-3.3V.
(2)电压分辨率3.2mv.
所需仪器设备:
pc机嵌入式系统实验箱
成果验收形式:
在minicom超级终端可以显示ADC转换的值
参考文献:
(1)linux教程孟庆春,牛欣源编著电子工业出版社
(2)linux操作系统原理与应用张玲,周旭西安电子科技大学出版社
(3)linux设备驱动程序魏永明,耿岳等译中国电力出版社
时间
安排
指导教师:
教研室主任:
年月日
内容摘要
数据采集系统的工作原理就是将被测对象(外部世界或现场)的各种参量(可以是物理量,也可以是化学量,生物量)通过各种传感元件做适当转换后,再经信号调理、采样、量化、编码、传输等步骤,最后送到服务器进行数据处理和存储记录的过程。
用于数据采集的成套设备称为数据采集系统(DataAcquisitionSystem,DAS)。
数据采集系统一般包括传感器、放大器、滤波器、A/D采样转换电路、微处理器等元件。
A/D转换电路在数据采集系统中起着至关重要的作用,它的转换精度和工作可靠度直接关系着整个采集系统的工作性能。
本文仅就该数据采集系统中的A/D转换芯片的驱动开发过程加以概述。
关键字:
嵌入式Linux数据采集设备驱动
目录
内容摘要…………………………………………………………………………….3
一、概述………………………………………………………………………………5
二、方案设计与论证………………………………………………………………….5
三、系统总体设计……………………………………………………………………6
1.系统的硬件……………………………………………………………………6
2.驱动程序设计…………………………………………………………………6
(1)驱动程序的LKM实现机制……………………………………….6
(2)驱动程序的注册与注销……………………………………………7
(3)file_operations结构体………………………………………….7
(4)中断处理程序………………………………………………………8
四、将驱动程序加载入内核……………………………………………………….8
五、性能测试与分析………………………………………………………………10
六、心得体会………………………………………………………………………10
七、参考文献………………………………………………………………………..11
一、概述
设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,将应用程序对设备的操作转化为对相应的设备文件的操作,使应用程序可以象操作普通文件一样,用处理普通文件的标准系统调用来打开、关闭和读写设备。
设备驱动程序作为内核的一部分,主要完成如下功能:
对设备进行初始化和释放;完成硬件与内核的数据交互;完成内核与应用层的数据交互;对可能出现的错误进行检测和处理。
在Linux系统中,打开的设备在内核内部由设备文件结构标识,内核使用file_operations(文件操作)结构访问驱动程序的函数。
每个文件都与自己的函数集相关联(通过包含在设备中指向file_operations结构的指针实现),这些操作主要负责系统调用的实现。
用户进程利用系统调用对设备文件进行操作时,系统调用通过设备的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数,这就是Linux的设备驱动程序工作的基本原理。
由此可见,编写设备驱动程序的主要工作就是编写file_operations中的子函数,完成对设备的操作。
为了实现设备的独立性,Linux把设备分成三种类型:
字符设备(characterdevice),块设备(blockdevice)和网络设备(networkdevice)。
每类设备都有独特的管理控制方式和不同的驱动程序,这样就可以把控制不同设备的驱动程序与操作系统的其它部分分离开来,不但便于对不同设备的管理,而且为系统中增加和撤销某种设备提供了很多方便。
二、方案设计与论证
数据采集系统的采集任务在试验箱上完成。
采集系统设计为分布式的采集控制系统,系统上位机与现场采集下位机之间的通信基于串口和网络接口。
正常运行时,采集下位检测控制器完成数据采集、数据处理、数据存储、数据发送等多种任务。
系统具有一定的自检测、自校正能力,能将异常情况传给PC机,以便维护。
为了适应各种不同情况下自动检测的要求,整个检测系统采用模块化结构设计,可应用不同的模块组合成不同的应用系统。
数据采集系统的基本组成如下图所示。
基于嵌入式linux的微机
A/D转换器
采集点1
采集点2
A/D转换器
图1数据采集系统组成示意图
三、系统总体设计
1.系统的硬件
数据采集系统主要完成实时数据采样、保持、并送入A/D转换器变成数字信号,然后再对数据进行计算处理、保存,再通过通信接口将实时数据发送到上位机中,同时接收上位机下发的各种命令。
其硬件结构如图所示。
图2数据采集硬件结构
2.驱动程序设计
(1)驱动程序的LKM实现机制
Linux内核提供了两种机制来开发设备驱动程序,一种是直接把驱动程序编译进内核,成为Linux内核的一部分。
另一种是通过LKM(LoadableKernelModule,即可加载模块化机制)来开发可动态加载和卸载的驱动模块。
驱动程序如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以本系统把驱动程序编写成了LKM型驱动程序(就是把驱动程序作为一个独立的单元模块,在使用时可以使用insmod命令加载到核心中,用完后使用rmmod命令卸载的那种)。
(2)驱动程序的注册与注销
向系统增加一个驱动程序则意味着要赋予它一个主设备号,这一赋值过程是在驱动程序模块的初始化中完成的。
s3c2410_adc的初始化入口函数定义如下:
__inits3c2410_adc_init(void)
{
devfs_adcraw=devfs_register(devfs_adc_dir,"adc",DEVFS_FL_DEFAULT,adc_MAJOR,adc_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&adc_fops,NULL);
}
在用insmod命令将编译好的模块调入内存时,s3c2410_adc_init(void)函数被调用。
在这里,s3c2410_adc_init(void)只做了一件事,它调用函数devfs_register()向内核注册该字符设备。
如果登记成功,返回设备的主设备号,不成功,返回一个负值。
在关闭字符设备或块设备时,还需要通过__exits3c2410_adc_exit(void)从内核中注销设备,并释放主设备号。
在用rmmod卸载该驱动模块时,free_irq函数被调用,它释放字符设备在系统字符设备表中占有的表项。
__exits3c2410_adc_exit(void)
{
free_irq(IRQ_ADC_DONE,NULL);
}
(3)file_operations结构体
file_operations结构体把系统调用和驱动程序关联起来。
这个结构的每一个成员的名字都对应着一个系统调用。
staticstructfile_operationsadc_fops={
owner:
THIS_MODULE,/*adc_fops所属的设备模块*/
read:
adc_read,/*读取数据*/
ioctl:
adc_ioctl,/*设备I/O控制*/
open:
adc_open,/*打开设备操作*/
release:
adc_release,/*释放操作*/
};
用户进程利用系统调用在对设备文件进行诸如read、write、open等操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。
(4)中断处理程序
响应中断并提供相应服务的程序称为中断处理程序。
在s3c2410_adc的驱动程序中,中断处理程序的主要功能是,控制s3c2410_adc进行采样,并将采样后的数据放入缓冲区,等待应用程序调用read函数读取。
我们把中断处理程序注册到系统中,操作系统在硬件中断发生后,调用驱动程序的中断处理处理程序。
四、将驱动程序加载入内核
1.准备工作
主机和试验箱通信,首先要配置minicom和主机的开发环境。
2.建立工作目录myjob,把共享文件夹中的adc复制到myjob中,命令如下
#mkdir/root/myjob
#cp–rf/mnt/hgfs/adc/root/myjob
3.设置linux的共享目录
#vi/etc/exports
编辑共享目录“/root/myjob192.168.1.*(rw,no_root_squash)”,存盘退出
4.设置pc机的linux的ip地址,启动nfs和portmap服务
#ifconfigeth0192.168.1.169
#servicenfsstart
#serviceportmapstart
5.设置试验箱的ip地址
启动试验箱,在minico命令提示窗口输入命令
#ifconfigeth0192.168.1.163netmask255.255.255.0
#routeadddefaultgw192.168.1.1
6.在实验箱上挂载linux主机
Ping192.168.1.169
图3ping通结果
7.挂载
#mount–tnfs–onolock192.168.1.169:
/root/myjob/mnt/nfs
图4挂载成功
8.挂载成功,则可以在/mnt/nfs下看到adc的文件
图5显示的adc
9.修改Makefile文件
10.对文件进行编译
#make
11.插入编译的模块
#insmodadc.o
12.运行测试程序
#./test_adc
图6最终运行结果
五、性能测试与分析
经过实际的操作,可以实现预想的结果。
实验结果如上图。
实验中出现问题总结如下:
1.实验箱pinglinux主机时失败,可能的原因:
①linux主机的网络环境配置不正确,系统的防火墙没有关闭。
②实验箱与主机的网线是否连接。
2.挂载失败
重新启动nfs和portmap服务
3.编译出错
没有正确安装交叉编译环境或者没有改写Makefile文件
4在运行测试程序时出现错误
测试程序中没有改动设备号
六、心得体会
本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习方法更加完善,也体会到软件开发的趣味。
在这其间又温习了上课其间的实验,把以前未做好的和没有成功的实验进行了完善。
特别是在配置主机开发环境这一块,理解了pc机的ip、主机linux的ip,实验箱的ip,三者必须设置在同一个子网内。
对linux操作系统有进一步的掌握,熟悉了常用的命令和文件操作过程,在其间也遇到很多的问题,要感谢王达伟老师细心、耐心的指导,使自己收获颇多。
通过这次的课设,我了解到,要真真正正的掌握计算机程序还不是一件简单容易的事儿,但真正掌握后,它带给我们的将是无穷的便捷与科技,我喜欢高端便捷的生活。
我希望我能做计算机这个万能机器人的主人而不是奴隶,我会努力加油的!
感谢学校,感谢王达伟老师给我的帮助,让我的思想、技能又上了一个台阶!
感谢!
加油!
七、参考文献
(1)linux教程孟庆春,牛欣源编著电子工业出版社
(2)linux操作系统原理与应用张玲,周旭西安电子科技大学出版社
(3)linux设备驱动程序魏永明,耿岳等译中国电力出版社
(4)从事嵌入式系统培训的实验指导书
电子工程系嵌入式课程设计成绩评定表
专业:
电子信息工程班级:
B09212学号:
20094021211姓名:
岑鉴峰
课题名称
Linux系统下的数据采集
设计任务与要求
设计要求:
(1)了解嵌入式系统实验箱核心板及ADC模块的电路原理图。
(2)熟悉linux文件系统,掌握linux字符设备驱动程序开发原理及的流程,理解用户应用程序调用内核设备驱动程序的过程
(3)理解无操作系统情况下,把S3C2410作为一个32位的单片机,用片上集成的ADC模块实现数据采集的工作过程。
(4)使用通用的Linux操作,编写简单的字符设备驱动程序,完成应用程序调用字符设备驱动程序,深入理解程序执行过程
(5)编写ADC模块的设备驱动程序,在实验箱上验证编写的设备驱动程序。
利用minicom,显示结果在PC机的终端上显示(不需要开发LCD驱动程序,从而在实验箱上的LCD屏上显示)。
指导教师评语
建议成绩:
指导教师:
课程小组评定
评定成绩:
课程负责人:
年月日