版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于ARM的嵌入式温度监测系统摘 要随着科技的发展,嵌入式系统的发展也异常迅速,同时,嵌入式系统已经应用于各个方面,给人们的生产和生活带来了极大的便利目前嵌入式系统的应用已经发展到了嵌入式处理器与操作系统相结合的阶段,本设计就是将ARM处理器与Linux操作系统相结合实现的嵌入式温度监测系统由温度监测硬件系统和温度监测软件两部分组成其中硬件系统包括SBC2410开发套件,温度检测电路信号放大电路及信号显示终端,论文中按模块对各部分硬件的设计进行了详细的介绍温度监测软件系统的设计过程如下,本设计首先为温度监测系统构建Linux环境,其次在Linux下编写并加载系统驱动程序,然后编写应用程序,编译
2、并下载到ARM开发板中经过反复调试,实现了温度监测的功能关键词: ARM;linux;内核;驱动;温度监测 Embedded System of Temperature Testing Based on ARMAbstractWith the development of science, embedded system develops at a fast speed. Embedded system has been applied to all aspects, which has brought great convenience to peoples production and d
3、aily life. At present, the application of embedded system have been developed to the stage of combining embedded processor with operating system, and the design comes true based on combining the ARM processor with linux operating system. Embedded temperature measurement system includes temperature m
4、onitoring hardware and software systems. Hardware system includes SBC2410 system development kit, temperature detection circuit, signal amplifier circuit and signal display terminal. This paper, in detail, introduces the hardware design according to modules. The process of the design of temperature
5、measurement software system is as follows: First,the design construct Linux environment for temperature measurement the system .Secondly, the design compiles and loads driver program in Linux; At last, the design writes, compiles and downloads the application program to ARM development board. After
6、repeated debugging, the design achieves the purpose of the temperature measurement.Key words: Linux ; ARM ; Kernel ; Drivert ; Emperature measurement目 录 TOC o 1-3 h z u TOC o 1-3 h z u HYPERLINK l _Toc201155773 摘 要 PAGEREF _Toc201155773 h I HYPERLINK l _Toc201155775 Abstract PAGEREF _Toc201155775 h
7、II HYPERLINK l _Toc201155776 第一章 嵌入式系统简介 PAGEREF _Toc201155776 h 1 HYPERLINK l _Toc201155777 1.1 嵌入式系统的概念 PAGEREF _Toc201155777 h 1 HYPERLINK l _Toc201155778 1.2 嵌入式系统的结构 PAGEREF _Toc201155778 h 1 HYPERLINK l _Toc201155779 嵌入式系统与普通单片机开发的不同之处 PAGEREF _Toc201155779 h 2 HYPERLINK l _Toc201155780 交叉编译 P
8、AGEREF _Toc201155780 h 2 HYPERLINK l _Toc201155781 交叉调试 PAGEREF _Toc201155781 h 3 HYPERLINK l _Toc201155782 第二章 设计用嵌入式模块 PAGEREF _Toc201155782 h 5 HYPERLINK l _Toc201155783 2.1 ARM处理器 PAGEREF _Toc201155783 h 5 HYPERLINK l _Toc201155784 2.2 Flash模块 PAGEREF _Toc201155784 h 5 HYPERLINK l _Toc201155785
9、2.3 SDRAM模块 PAGEREF _Toc201155785 h 6 HYPERLINK l _Toc201155786 2.4 JTAG调试器 PAGEREF _Toc201155786 h 8 HYPERLINK l _Toc201155787 第三章 温度监测电路设计 PAGEREF _Toc201155787 h 10 HYPERLINK l _Toc201155788 3.1 AD590的室温补偿电路 PAGEREF _Toc201155788 h 10 HYPERLINK l _Toc201155789 性能 PAGEREF _Toc201155789 h 10 HYPERL
10、INK l _Toc201155790 误差校正 PAGEREF _Toc201155790 h 10 HYPERLINK l _Toc201155791 3.1.3 AD590的补偿电路设计 PAGEREF _Toc201155791 h 11 HYPERLINK l _Toc201155792 热电偶的测温电路 PAGEREF _Toc201155792 h 12 HYPERLINK l _Toc201155793 热电偶的测温原理 PAGEREF _Toc201155793 h 12 HYPERLINK l _Toc201155794 热电偶的测温电路设计 PAGEREF _Toc201
11、155794 h 14 HYPERLINK l _Toc201155795 第四章 温度监测系统的Linux构建 PAGEREF _Toc201155795 h 17 HYPERLINK l _Toc201155796 构建交叉编译器 PAGEREF _Toc201155796 h 17 HYPERLINK l _Toc201155797 交叉编译器 PAGEREF _Toc201155797 h 17 HYPERLINK l _Toc201155798 设置共享文件夹,并解压linux开发包 PAGEREF _Toc201155798 h 17 HYPERLINK l _Toc2011557
12、99 安装交叉编译器 PAGEREF _Toc201155799 h 18 HYPERLINK l _Toc201155800 4.2 Linux操作系统 PAGEREF _Toc201155800 h 19 HYPERLINK l _Toc201155801 引导加载程序 PAGEREF _Toc201155801 h 20 HYPERLINK l _Toc201155802 内核 PAGEREF _Toc201155802 h 21 HYPERLINK l _Toc201155803 4. 文件系统 PAGEREF _Toc201155803 h 23 HYPERLINK l _Toc20
13、1155804 4.3 烧写 PAGEREF _Toc201155804 h 24 HYPERLINK l _Toc201155805 4.3.1 Windows下烧写vivi PAGEREF _Toc201155805 h 24 HYPERLINK l _Toc201155806 4.3.2 分区格式化Flash及重新下载vivi PAGEREF _Toc201155806 h 25 HYPERLINK l _Toc201155807 4.3.3 烧写linux内核 PAGEREF _Toc201155807 h 27 HYPERLINK l _Toc201155808 4.3.4 下载文件
14、系统 PAGEREF _Toc201155808 h 27 HYPERLINK l _Toc201155809 第五章 温度监测系统的软件编程 PAGEREF _Toc201155809 h 28 HYPERLINK l _Toc201155810 5.1 编写Linux下的ADC驱动程序 PAGEREF _Toc201155810 h 28 HYPERLINK l _Toc201155811 5.1.1 Linux设备 PAGEREF _Toc201155811 h 29 HYPERLINK l _Toc201155812 驱动程序的编写说明 PAGEREF _Toc201155812 h
15、32 HYPERLINK l _Toc201155813 5.1.3 驱动程序编写的具体内容 PAGEREF _Toc201155813 h 34 HYPERLINK l _Toc201155814 5.1.4 ADC驱动程序具体函数的分析 PAGEREF _Toc201155814 h 36 HYPERLINK l _Toc201155815 5.1.5 ADC驱动程序的加载和删除 PAGEREF _Toc201155815 h 39 HYPERLINK l _Toc201155816 5.2 编写应用程序 PAGEREF _Toc201155816 h 41 HYPERLINK l _To
16、c201155817 5.2.1 线性化部分 PAGEREF _Toc201155817 h 41 HYPERLINK l _Toc201155818 5.2.2 A/D转换速率的计算 PAGEREF _Toc201155818 h 44 HYPERLINK l _Toc201155819 5.2.3 主程序的编写 PAGEREF _Toc201155819 h 45 HYPERLINK l _Toc201155820 第六章 温度监测的调试 PAGEREF _Toc201155820 h 47 HYPERLINK l _Toc201155821 6.1 编译ad驱动程序 PAGEREF _T
17、oc201155821 h 47 HYPERLINK l _Toc201155822 6.2 运行应用程序 PAGEREF _Toc201155822 h 48 HYPERLINK l _Toc201155823 6.2.1 为ARM开发板更新内核和文件系统 PAGEREF _Toc201155823 h 48 HYPERLINK l _Toc201155824 6.2.2 编译应用程序 PAGEREF _Toc201155824 h 48 HYPERLINK l _Toc201155825 6.2.3 运行main 主程序 PAGEREF _Toc201155825 h 49 HYPERLI
18、NK l _Toc201155826 总结 PAGEREF _Toc201155826 h 51 HYPERLINK l _Toc201155827 参考文献 PAGEREF _Toc201155827 h 52 HYPERLINK l _Toc201155828 附录 PAGEREF _Toc201155828 h 54 HYPERLINK l _Toc201155829 附录A:程序源代码 PAGEREF _Toc201155829 h 54 HYPERLINK l _Toc201155830 附录B:测温原理图 PAGEREF _Toc201155830 h 68 HYPERLINK l
19、 _Toc201155831 附录C:ARM板电路图 PAGEREF _Toc201155831 h 69 HYPERLINK l _Toc201155832 致谢 PAGEREF _Toc201155832 h 70嵌入式系统简介 嵌入式系统的概念嵌入式系统是不同于常见计算机系统的一种计算机系统,它不以独立设备的物理形态出现,即它没有一个统一的外观,它的部件根据主体设备以及应用需要嵌入在设备的内部,发挥着运算存储以及控制的作用从体系结构上看,嵌入式系统主要由嵌入式处理器支撑硬件和嵌入式软件组成其中嵌入式处理器常是单片机或微控制器;支撑硬件主要包括存储介质通信部件和显示部件;嵌入式软件则包括支
20、撑硬件的驱动程序操作系统支撑软件以及应用中间件等 嵌入式系统的结构嵌入式系统一般由3个部分组成,如图1.1所示:嵌入式系统硬件平台嵌入式操作系统及嵌入式系统应用其中,嵌入式系统硬件平台指各种嵌入式器件设备,嵌入式操作系统是指在嵌入式硬件平台上运行的操作系统,目前主流的嵌入式操作系统有嵌入式linuxC/OS-II等,具体应用那种嵌入式操作系统应视具体情况而定嵌入式linux提供了完善的网络技术支持,C/OS-II操作系统也成为实时操作系统或RTOS,使用它作为开发工具将会使实时应用程序变得相对容易 图 嵌入式系统嵌入式芯片需要必要的外围芯片给它提供基本的工作条件一个嵌入式芯片供电系统为其供电;
21、必须有时钟信号系统提供时钟信号;必须有复位系统嵌入式芯片还需要有存储系统如果芯片内部没有存储器或存储器容量不足以满足需求,则需要外扩存储芯片调试接口也是嵌入式系统不可缺少的一部分这些嵌入式处理器运行的必要条件的电路或者芯片与嵌入式处理器一起构成了嵌入式处理器的最小系统最小系统结构框图如图: 图 最小嵌入式系统 嵌入式系统与普通单片机开发的不同之处按照软件工程的原理,嵌入式开发软件的一般流程为需求分析软件概要设计软件详细设计软件实现和软件测试与一般软件开发的区别在于软件实现的编译和调试两部分 交叉编译 由于宿主机和目标机的体系结构不同,在宿主机X86平台上可以运行的程序在目标机ARM平台上无法运
22、行,因此嵌入式软件开发采用交叉编译方式在一个平台上生成可以在另一个平台上执行的代码编译的主要工作就是将程序转化成该程序的CPU所能识别的机器代码进行交叉编译的主机称为宿主机,也就是普通的通用计算机,宿主机系统资源丰富,使用的方便地集成开发环境和调试工具 程序实际运行的环境称为目标机,也就是嵌入式系统环境嵌入式系统的系统资源紧缺,存储空间处理器运行速度等很有限,并且没有相关的编译工具,因此,嵌入式系统的开发需要借助宿主机来编译出目标机的执行代码由于编译的过程包括编译链接等几个阶段,因此,嵌入式的交叉编译也包括交叉编译和交叉链接等过程,通常,ARM的交叉编译器为arm-elf-gcc,交叉链接器为
23、arm-elf-ld,一般可执行文件是ELF格式如图所示 交叉调试嵌入式软件编译和链接完成后即进入调试阶段调试器与被调试的程序一般运行在同一台计算机上,调试器是一个单独运行着的进程,它通过操作系统提供的调试接口来控制被调试的进程在嵌入式软件开发中的调试方式采用的是交叉调试,调试器运行在宿主机上的通用操作系统之上,被调试的进程运行在基于特定硬件平台的嵌入式操作系统中宿主机与目标机通过串口或者网络进行通信调试器可以控制访问被调试进程,读取被调试进程的当前状态,并能够改变被调试的运行状态嵌入式系统的交叉调试方法主要有两种:硬件调试和软件调试,它们共同的特点如下:调试器运行在宿主机上,而被调试的进程运
24、行在目标机上调试器通过串口并口网络JTAG等控制被调试进程在目标机上,一般会具备某种形式的调试代理与调试器共同配合对目标机上的进程进行调试这种调试代理可能是某些支持调试功能的硬件设备,也可能是某些专门的调试软件目标机可能是某种形式的系统仿真器,通过在宿主机上运行目标机的仿真软件,整个调试过程可以在一台计算机上运行此时物理上虽然只有一台计算机,但是逻辑上仍然存在这宿主机和目标机的区别22设计用嵌入式模块 ARM处理器 ARM处理器当前有6个产品系列:ARM7ARM9ARM9EARM10EARM11和SecurCore,其中ARM11是最近推出的产品ARM7ARM9ARM9EARM10E是4个通用
25、处理器系列每个系列提供一套特定的性能来满足设计者对功耗性能体积的需求SecurCore是第5个产品系列,是专门为安全设备而设计的在本设计中,我们用的是ARM9处理器下面对ARM9进行相应的介绍ARM9系列于1997年问世由于采用了5级指令流水线,ARM9处理器能够运行在比ARM7更高的时钟频率上,改善了处理器的整体性能;存储器系统根据哈佛体系结构(程序和数据空间独立的体系结构)重新设计,区分了数据总线和指令总线ARM9系列的第一个处理器是ARM920T,包含独立的数据指令Cache和MMU次处理器能够被用在要求有虚拟存储器支持的操作系统上此系列的ARM922T是ARM922T的变种,只有一半大
26、小的数据指令CacheARM940T包含一个更小的数据指令Cache和一个MPU它是针对不要求运行操作系统的应用而设计的ARM920TARM940T都执型v4T架构指令13 Flash模块Flash存储器是一种可在的系统的(In-System)进行电擦写,掉电后信息不丢失的存储器它具有低功耗大容量擦写速度快可整片或分扇区在系统编程(烧写)擦除等特点,在体积抗震性方面都有很大的优势,并且可有内部嵌入式算法完成对芯片的操作,因而在各种嵌入式系统中得到了广泛的应用作为一种非易失性存储器,Flash在系统中用于存放程序代码常量表以及一些在系统掉电后需要保存的用户数据等常用的Flash为8位或16位的数
27、据宽度,编程电压为单Flash闪存是非易失性存储器,可以对存储器单元块进行擦写和再编程任何Flash器件进行写入操作前必须先进行擦除Flash按结构分为NOR和NAND两大类NAND器件执行擦除操作十分简单,而NOR则要求在进行擦出前,现将目标块内所有的地址都写0擦除NOR器件时是以64128KB的块进行的,执行一个写入/擦除操作的时间为15s;擦除NAND器件是以832KB的块进行的,执行相同的操作最多只需要4ms执行擦除时,块尺寸的不同进一步拉大了NAND和NOR之间的差距NOR的特点是芯片内执行,这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统ARM中NOR的传输速率很高
28、,在14MB的小容量时具有极高的成本效益,但是很低的写入和擦除速度大大降低了它的性能NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度的都很快,应用NAND的难点在于Flash的管理和需要特殊的接口NOR主要用在代码存储介质中,NAND适合于数据存储22 SDRAM模块SDRAM与Flash不同,它不具有掉电保护数据的特性,但其存取速度大大高于Flash存储器,且有读/写的属性,因此SDRAM在系统中主要用作程序的运行空间,数据及堆栈区当系统初始化后,CPU首先从复位地址0 x0处读取启动代码,在完成系统的初始化后,程序代码一般应调入SDRAM中运行,以提高系统的运行速
29、度,同时,系统及用户堆栈运行数据也都放在SDRAM中SDRAM具有单位空间存储容量大和价格便宜的优点,已经广泛应用在各种嵌入式系统中SDRAM的存储单元可以理解为一个电容,总是倾向于放电,为不免数据丢失,必须定时刷新(充电)因此要在系统中使用SDRAM,就要求微处理器具有刷新控制逻辑,或在系统中另外加入刷新控制逻辑电路SDRAM是高速的动态随机存取存储器,它的同步接口和完全流水线的内部结构使其拥有极大的数据速率,目前SDRAM时钟频率已经达到100MHz以上另外,它们的行列地址线共用,有行地址选通(CAS),列地址选通(RAS)信号分时控制基本存储单元是内存芯片中存储信息的最小单位,每个存储单
30、元可以存储1bit的信息,并且有一个由行地址和列地址共同定义的唯一的地址我们知道8bit可以组成1byte,而字节是内存中最小的寻址单元虽然内存基本存储单元具有唯一的地址,但是并不能进行独立的寻址,这将要求内存芯片有数以百计的引脚同计算机通信,显然这是不可能的现在内存架构是处于同一列的基本存储单元共用一条列地址线,而处于同一行的基本存储单元共用一条行地址线,组成一个基本单元构成的矩阵框架而这些内存框架构成一个内存bank,SDRAM内存以bank为组织,可由行列地址寻址另外,为了保持内部数据还必须进行刷新要知道SDRAM的结构特点,就必须先了解DRAM器件的结构特点DRAM存储一个位的消息只需
31、要一只晶体管,但是需要周期性的充电,才能使保存的信息不丢失,DRAM的一个存储位单元如图2.1所示:图只是DRAM一个基本单位的结构示意图,电容器的状态决定了这个DRAM单位逻辑状态是1还是0一个电容可以存储一定量的电子或者电荷,一个充电的电容器被认为是逻辑上的1,而“空”的电容器则是0但是电容被利用的这个特性也是它的缺点因为电容器不能持久的保持存储的电荷,所以内存需要不断定时刷新,才能保持暂存的数据电容器可以用电流来充电;同时,电容的充放电需要一定的时间,虽然对于内存基本单位中的电容来说这个时间很短,大约只有,但这个期间内存是不能执行存取操作的 图2.1 DRAM的原理图SDRAM的存储单元
32、的基本原理同前面提到的DRAM基本一样,但是这些存储单元的组织和控制与DRAM就有相当大的差别了SDRAM是多bank 结构22 JTAG调试器JTAG是英文“Joint Test Action Group(联合测试行为组织)”的词头字母的简写, 是一种国际标准测试协议(兼容),主要用于芯片内部测试及对系统进行仿真调试现在多数的高级器件都支持JTAG协议,如DSPFPGA器件等标准的JTAG接口是4线:TMSTCKTDITDO,分别为模式选择时钟数据输入和数据输出线 相关JTAG引脚的定义为:TCK为测试时钟输入;TDI为测试数据输入,数据通过TDI引脚输入JTAG接口;TDO为测试数据输出,
33、数据通过TDO引脚从JTAG接口输出;TMS为测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;TRST为测试复位,输入引脚,低电平有效,GND JTAG最初是用来对芯片进行测试的,基本原理是在器件内部定义一个TAP(Test Access Port测试访问口)通过专用的JTAG测试工具对进行内部节点进行测试JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试现在,JTAG接口还常用于实现ISP(In-System Programmable;在线编程),对FLASH等器件进行编程 JTAG编程方式是在线编程,传统生产流程中先对芯片进行预
34、编程现再装到板上因此而改变,简化的流程为先固定器件到电路板上,再用JTAG编程,从而大大加快工程进度JTAG接口可对PSD芯片内部的所有部件进行编程在硬件结构上,JTAG 接口包括两部分:JTAG 端口和控制器与JTAG 接口兼容的器件可以是微处理器(MPU)微控制器(MCU)PLDCPLFPGAASIC 或其它符合IEEE1149.1 规范的芯片IEEE1149.1 标准中规定对应于数字集成电路芯片的每个引脚都设有一个移位寄存单元,称为边界扫描单元BSC它将JTAG 电路与内核逻辑电路联系起来,同时隔离内核逻辑电路和芯片引脚由集成电路的所有边界扫描单元构成边界扫描寄存器BSR边界扫描寄存器电
35、路仅在进行JTAG 测试时有效,在集成电路正常工作时无效,不影响集成电路的功能JTAG也可以实现对电路版的Flash编程要通过JTAG接口对系统板上Flash编程,可以利用专用的硬件控制器或独立的编程器来访问JTAG器件实现,也可以直接用电缆线把PC机并行口与嵌入式系统的微处理器的JTAG引脚连接起来,由PC机上的程序模拟JTAG时序实现嵌入式系统的Flash芯片的地址线数据线和控制信号线接到嵌入式系统带JTAG接口的微处理器相应的引脚上,在对Flash编程时,PC机上运行的程序控制PC机发送指令或数据到嵌入式系统微处理器内部的边界扫描寄存器里,再把此数据或指令通过JTAG专用指令传送到Fla
36、sh,从而将代码写入Flash中22温度监测电路设计能够把非电量转换为电量的器件称为传感器,传感器实质上是一种功能块,其作用是将来自外界的各种信号转换成电信号随着技术的不断进步,传感器也有了飞速的发展,体积变得越来越小,精度越来越高,功能也越来越强大传感器的种类繁多,在本次设计中所要用到的是温度传感器,要选择适当的传感器以满足设计要求温度传感器:温度传感器就是把温度信号转换成电信号的传感器在本次设计中,我选用的是K型热电偶和用于温度补偿的AD590做为测温元件3.1 AD590的室温补偿电路 性能集成温度传感器AD590 是一种高内阻电流输出型的两端器件, 其检测灵敏度为1 A/K由于其内部采
37、用最新的薄膜电阻激光微调技术作最后定标, 故其具有很高的检测精度 AD590 的特点是:(1) 两端器件:电压输入,电流输出;(2) 线性电流输出:1A/K;(3) 较宽的检测范围:- 55 + 155;(4) 极好的线性:在工作范围内非线性误差在vivi模式下分区格式化Flash:在vivi模式下输入命令: bon part 0 192K 1216K对板子进行分区说明:bon是分区命令,以上命令的意思是把Nand Flash从0开始分为三个区: 0192K:大小为192K 192K1216K:大小为1M 1216K64M: 大小为分区后需要用ARM板连接USB电缆,但是只能选择带电连接,千万
38、不要关电或者掉电,因为此时Nand Flash中已经被清空,需要再重新下载一次BIOS,如果关电或掉电,将需要使用重新烧写ivi,并重新分区格式化Flash,此过程又需要花费几分钟时间同时在windows可以看到分区显示(3)重新下载vivi通过dnw下载vivi有两种方法,本设计使用方法二方法一:接上串口电缆,输入命令:load flash vivi x,使用Serial PortTransmit下载;方法二:接上串口电缆,接上USB电缆,输入命令:load flash vivi u,进入下载界面,板子提示等待用户进行USB下载传输此时点击USB Port-Transmit,在弹出的打开界面
39、中找到sbc_vivi.点击“打开”开始下载,下载过程一闪而过,只需,因为使用USB接口下载的速度很快下载完毕,vivi被自动烧写到Nand Flash中 烧写linux内核通过dnw下载kernel有两种方法,本设计使用的方法二方法一:接上串口电缆,输入命令:load flash kernel x,使用Serial Port-Transmit下载;方法二:接上串口电缆,接上USB电缆,输入命令:load flash kernel u,回车,板子等待用户进行USB下载传输此时点击USB Port-Transmit,在弹出的打开界面中找到zImage_tp,下载时间比sbc_vivi稍长,约为2
40、s下一步应下载文件系统,重要提示:此时不能给ARM板断电后上电或复位,不能拔下USB电缆,否则主机会出现错误,重新插上USB电缆时,主机将无法识别USB,也无法正常安装,需要重新烧写vivi及kernel 下载文件系统输入:loadyaffs e root u,回车板子等待用户进行USB下载传输此时点击USB Port-Transmit,在弹出的“打开”界面中找到点击“打开”开始下载,此下载过程大学需要23分钟下载完毕,linux文件系统将会被自动烧写到Nand Flash中至此,linux内核需要烧写的已经完成再重启系统,就可以用了温度监测系统的软件编程编写Linux下的ADC驱动程序嵌入式
41、应用对成本和实时性比较敏感,而对linux的应用要求主要体现在对硬件的驱动程序的编写和上层应用程序的开发嵌入式linux驱动程序的基本结构和标准的linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编程模块化形式,而且,要求可以在不同的体系结构上安装linux是可以支持模块化模式的,但由于嵌入式应用针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中但是这种模式是调试驱动程序的极佳方法系统调用是linux系统内核和应用程序之间的接口,设备驱动程序是linux系统内核和机器硬件之间的接口设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设
42、备文件,因而应用程序可以像操作普通文件一样对硬件设备进行操作设备驱动程序是内核的一部分驱动程序的使用可以按照两种方式编译:一种是静态编译进内核;另一种是编译成内核模块义工动态加载但对嵌入式linux系统而言,一般不能够像桌面linux那样灵活地使用insmod/rmmod加载卸载设备驱动程序,因为常将设备驱动程序静态编译进内核基于设备驱动程序的功能和编译特点,应具有的特性如下:(1)由一系列函数和数据构成,它既要与硬件设备进行通信又要遵循操作系统内核提供的统一接口;(2)它要管理好用户程序与外设之间的数据流和控制流;(3)是一个自包含组件,能够动态地加入到操作系统或被内核删除;(4)属于内核的
43、可定制部分,通过设备文件赖于用户程序打交道 Linux设备设备驱动程序可分为硬件驱动程序和软件设备驱动程序两大类硬件设备驱动就是通常意义的驱动,其驱动程序和物理硬件设备相连,如UART设备或IDE设备;而软件设备驱动程序则作为低级结构间的接口,或者硬件设备驱动程序和高级数据结构间的接口,如文件系统EXT3的驱动(1)linux设备类型linux系统支持3种类型的硬件设备:字符设备(Char Device)块设备(Block Device)网络设备(Network Socket Device)系统的串口键盘虚拟控制台是字符设备,而RAMDISK硬盘是块设备,网络设备则如网络接口卡等ADC驱动设备
44、就是字符设备字符设备字符设备能够存储或者传输不定长数据某些字符设备可以每次传递一个字节,传完每个字节后产生一个中断;另外一些字符设备可以在内部缓存数据,因此可以每次传递多个字节内核把字符设备看成是可顺序访问的连续字节流,它在单个字符的基础上接收和发送数据,数据缓冲系统字符设备不能随机访问,只能一个一个字符地顺序存取,也不能进行查找操作字符设备的介质一般是传输介质,在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了块设备块设备的介质必须是存储介质,存储的是定长且可以随机访问的数据块,对块设备的I/O操作只能以块为单位进行对块设备的访问通常需要经过高速缓存做缓冲区,若用户进程对设备的
45、请求通过缓冲区能满足用户的要求,就从缓冲区返回请求的数据,如果不能,才调用请求函数来进行实际的I/O操作块设备的任何块都可以随机读/写,可以读取任意位置上的整数倍块长的数据,不必考虑它在设备的什么地方一个文件系统要安装进入操作系统必须在块设备上网络设备网络设备与字符设备和块设备不同,通常不把网络设备看成普通文件,因为普通文件的内容是无结构的,而网络设备的数据流是有结构的数据包,是成块的但是它的块又不是固定大小的,大到数百甚至数千字节,小到几个字节对网络设备的存储的存取却是流式的,通过BSD Socket接口的访问内核和网络设备驱动程序之间的通信,与字符设备和块设备驱动程序与内核的通信数完全不一
46、样的,不是通过read()write(),而是采用sk_buff数据缓冲区,调用与数据包相关的函数网络协议(如TCP/IP)就是建立在网络设备驱动程序之上的应用(2)设备节点文件节点设备文件Linux是一种类UNIX系统,UNIX的一个基本特点是“一切皆为文件”用户进程也是通过一种特殊的文件来与实际的硬件打交道的,这种特殊的文件就是设备文件,系统中的设备都用一个设备文件代表设备文件抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开关闭和读/写对应着设备的3种类型,设备文件也分为字符型设备文件(Character)块型设备文件(Block)和网络插件型设
47、备文件(Socket)Character型设备文件常指直接读/写没有缓冲区的字符设备,而Block设备文件常常指那些需要以块(如512B)的方式写入的设备,Socket(网络插件)型设备文件指的是网络设备访问的BSD Socket接口设备文件都放在/dev目录下,也就是说,对于一个设备,它可以在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在单并不是普通意义上的文件,而是设备文件,更确切地说是设备节点例如,硬盘就是用/dev/hd*来表示,/dev/had表示第一个IDE接口的主设备,/dev/hdal表示第一个硬盘上的第一个分区;而/dev/hdc表示第二个IDE接口的主设备
48、设备节点是通过mknod命令建立的,其中指定了主设备号和次设备号而这个设备号是从/proc/devices文件中获得的,所以一般是先有设备驱动程序(模块)在内核中才有折本节点在目录中 (3)主设备号和辅设备号Linux中的每个设备在文件系统中都至少对应一个设备文件,这个设备文件节点中记载着与特定设备建立连接所需的信息对于Block型和Character型设备这种信息由三部分构成:第一部分包括设备的类型,第二部分是一个“主设备号”(Major),第三部分是一个“辅(或者从)设备号”(Minor)其中,设备类型和主设备号结合在一起就唯一地确定了设备的驱动程序及界面,因而一般对应确切的驱动程序主设备
49、号的主要作用就是声明设备所使用的驱动程序驱动程序和主设备号是一一对应的,当打开一个设备文件时,操作系统就已经知道这个设备设备所对应的驱动程序辅设备号一般是区分驱动程序的不同属性(如不同的使用方法不同的位置不同的操作),标识驱动程序控制的设备实例若不同串口使用同一个驱动程序,其主设备号一样辅设备号不同,辅设备号标识这是第几个串口设备而对于块设备(硬盘),如/dev/hdal(block3/1)/dev/hda2(block3/2)和/dev/hda3(block3/3)都代表着同一块硬盘的3个分区,它们的主设备号都是3,辅设备号分别为123对于常用的设备,Linux有固定的编号例如:创建设备文件
50、和设备号并显示mknod harddiak b 3 0file /dev/had/dev/had: block special (3/0)用mknod 命令可以创建设备文件,创建时指定主设备号和辅设备号如上例中,在当前位置创建出一个与 /dev/had 一样的可以访问的第一个IDE设备主硬盘的文件(块设备,主设备号 3,辅设备号 0),文件名叫做harddisk用file 命令可以显示设备文件的设备号用命令ls l也可以显示出设备文件21 驱动程序的编写说明设备驱动程序是操作系统内核和机器硬件之间的接口设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程
51、序可以像操作普通文件那样对硬件设备进行操作同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和会送给应用程序请求的数据;检测和处理设备出现的错误在linux操作系统写有字符设备和块设备两类主要的设备文件类型字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据块设备是主要对针对磁盘等慢速设备设计的,一面耗费过多的CPU时间来等待设备驱动程序的file_operations 结构
52、:通常,一个设备驱动程序包括两个基本的任务:驱动设备的某些函数作为系统调用执行;而某些函数则负责处理中断(即中断处理函数)而file_operations 结构的每一个成员的名称都对应一个系统调用用户程序利用系统调用,比如在对一个设备文件进行诸如read操作时,这是对应于该设备文件的驱动程序就会执行相关的ssize_t(*read)(struct ,file* char *,size_t,loff_t*)函数在操作系统内部,外部设备的存取是通过一组固定入口点进行的,这些入口点由每个外设的驱动程序提供,由函数file_operations结构向系统进行说明,因此,便携设备的驱动程序的主要工作是编
53、写子函数,并填写file_operations 的各个域file_operations 结构在中可以找到struct file_operations struct module *owner; loff_t (* llseek) (struct file* , loff_t,int); ssize_t (*read) (struct file *,char *,size_t,loff_t *); ssize_t (*write) (struct file *,const char *,size_t,loff_t *); int (*readdir) (struct file *,void *,
54、filldir_t); unsigned int(*poll) (struct file *,struct poll_table_struct *); int (*ioctl) (struct inode*,struct file*,unsigned int ,unsigned long); int (*mmap) (struct file*,struct vm_area_struct *); int(*open) (struct inode*, struct file *); int(*flush) (struct file*); int(*release) (struct inode*,
55、struct file *); int (*fsync) (struct file*,struct dentry*,int datasync); int(*fasync) (int ,struct file*, int); int(*lock) (struct file*,int, struct file_lock);ssize_t(*readv) (struct file*,const struct iovec*,unsigned long ,loff_t *);ssize_t(*writev) (struct file*,const struct iovec*,unsigned long
56、,loff_t *);ssize_t(*sendpage) (struct file*, struct page*,int,size_t ,loff_t *,int);unsigned long (*get_unmapped_area)(struct file*,unsigned long,unsigned long, unsigned long, unsigned long);#ifdef MAGIC_ROM_PTR int (*roptr) (struct file*,struct vm_area_struct *);#endif /* MAGIC_ROM_PTR*/其中主要的函数说明如下
57、:(1) open是驱动程序用来完成设备初始化操作的,open还会增加设备计数,以防止文件在关闭之前模块被卸载出内核open主要完成以下操作:检查设备错误(诸如设备未就绪或相似的硬件问题);如果是首次打开,初始化设备;标别此设备号;分配和填写放在fileprivate_data内的数据结构;增加使用计数(2) read是用来从外部设备中读取数据当其为NULL指针时,将引起read系统调用放回-EINVAL(“非法参数”)函数返回一个非负值表示成功读取了多少字节(3) write向外部设备发送数据如果没有这个函数,write系统调用程序返回一个-EINVAL如果返回值非负,就表示成功地写入的字节
58、数(4) release是设备关闭时调用这个操作release的作用正好与open相反这个设备方法有时也称为close函数它应该完成以下操作:使用计数减一;释放open分配在fileprivate_data中的内存,在最后一次关闭操作时关闭设备(5) llseek是 改变当前的读写指针(6) readdir一般用于文件系统的操作(7) poll一般用于查询设备是否可读可写或处于特殊的状态(8) ioctl 执行设备专有的命令(9) mmap 将设备内存映射到应用程序的进程地址空间10 驱动程序编写的具体内容通过了解驱动程序的file_operation结构,用户可以编写出相关外部设备的驱动程序
59、首先,用户在自己的驱动程序源文件定义file_operation结构,并编写出设备需要的各操作函数,对于设备不需要的操作函数用NULL初始化,这些操作函数将被注册到内核,当应用程序对设备相应的设备文件进行文件操作时,内核会找到相应的操作函数,并进行调用如果操作函数使用NULL,系统操作就进行默认的处理定义并编写完file_operation结构函数后,要定义一个初始化函数,比如函数名可device_init(),在linux初始化的时候要调用该函数,因此,该函数包括以下几项工作:(1)对该驱动程序所使用到的硬件寄存器进行初始化,包括中断寄存器(2)对初始化设备相关的参数一般来说,每个设备要定义
60、一个设备变量,用来保存设备相关的参数(3)注册设备linux内核通过主设备号将设备驱动程序同设备文件相连每个设备有且仅有一个主设备号通过查看linux系统中/proc下的devices文件,该文件记录已经使用的主设备号和设备名,选择一个没有使用的主设备号,调用下面的函数来注册设备int register_chrdev(unsigned int,const char *,struct file_operations*),其中的三个函数代表主设备号,设备名,file_operatons的结构地址(4)注册设备使用的中断注册终端使用的函数int requesr_irq(unsigned irq,vo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025甘肃前进牧业科技有限责任公司招聘28人笔试参考题库附带答案详解
- 2025湖南兴湘资本管理有限公司招聘6人笔试参考题库附带答案详解
- 2025浙江金华金开宏业产业运营管理有限公司招聘5人笔试参考题库附带答案详解
- 2025浙江温州市泰顺县文旅集团有限公司招聘编外人员1人笔试参考题库附带答案详解
- 2025浙江嘉兴市平湖市市属国有企业招聘拟录用人员(二)笔试参考题库附带答案详解
- 华润五丰2026届校园招聘笔试历年典型考点题库附带答案详解
- 雁江区2025四川资阳市雁江区引进急需紧缺专业人才19人笔试历年参考题库典型考点附带答案详解
- 西峰区2025年甘肃庆阳西峰工业园区管理委员会选调工作人员笔试历年参考题库典型考点附带答案详解
- 益阳市2025湖南益阳市市直事业单位招聘39人笔试历年参考题库典型考点附带答案详解
- 泸州市2025年四川泸州市江阳区事业单位考核招聘高层次人才(16人)笔试历年参考题库典型考点附带答案详解
- 骨科骨折固定技术培训指南
- 桂林外卖行业现状分析报告
- 河北农业农村厅所属事业单位笔试试题2024版
- 日本家政相关行业分析报告
- 2026年北京市中考数学模拟试卷
- 小区安全生产制度汇编
- 合肥兴泰金融控股(集团)有限公司招聘9人参考题库附答案解析
- GB/T 42706.3-2025电子元器件半导体器件长期贮存第3部分:数据
- 招标项目绩效考核体系设计方案
- 2026年消防设施操作员之消防设备初级技能考试题库150道及完整答案(全优)
- 危货驾驶员安全职责
评论
0/150
提交评论