《微处理器系统结构与嵌入式系统设计.ppt》由会员分享,可在线阅读,更多相关《微处理器系统结构与嵌入式系统设计.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、yyyy-M-1/37微处理器系统结构与嵌入式系统设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望yyyy-M-2/37第十一章第十一章 基于基于ARM的软件系统设计的软件系统设计1、嵌入式软件系统结构及工作流程嵌入式软件系统结构及工作流程2、嵌入式软件系统的引导和加载、嵌入式软件系统的引导和加载S3C2440S3C2440启动过程启动过程、BootLoader BootLoader 基本概念基本概念、U-bootU-boot的分析与移植的分析与移植3、嵌入式
2、、嵌入式Linux操作系统操作系统嵌入式操作系统嵌入式操作系统、嵌入式嵌入式LinuxLinux内核内核4、Linux下驱动程序设计示例下驱动程序设计示例打开串口、设置串口打开串口、设置串口、读写串口读写串口、关闭串口关闭串口yyyy-M-3/37第十一章第十一章 习题习题作业:作业:1 1、2 2、3 3、6 6思考:思考:4 4、5 5 航空航天学院航空航天学院清水河清水河清水河清水河 研究院大楼研究院大楼研究院大楼研究院大楼108108陈陈 敏敏email:email: tel tel:028-61830626 028-61830626第第 十十 一一 章章 结结 束束yyyy-M-5/
3、37嵌入式软件系统结构嵌入式软件系统结构l简单的嵌入式应用简单的嵌入式应用 若嵌入式系统的功能需求比较简单,嵌入式系统若嵌入式系统的功能需求比较简单,嵌入式系统软件只需完成较简单的监控、驱动和处理功能,则软件只需完成较简单的监控、驱动和处理功能,则不不需要嵌入式操作系统需要嵌入式操作系统的支持。的支持。如基于如基于8051的应用:玩具、家电、汽车等的控制系统的应用:玩具、家电、汽车等的控制系统l复杂的嵌入式应用复杂的嵌入式应用 若嵌入式系统的功能需求比较复杂,需要图形用若嵌入式系统的功能需求比较复杂,需要图形用户界面、网络管理、存储管理、进程户界面、网络管理、存储管理、进程/线程管理或需要线程
4、管理或需要支持二次开发等,则通过支持二次开发等,则通过嵌入式操作系统嵌入式操作系统的帮助,可的帮助,可以加快嵌入式系统软件的开发进度和可靠性。以加快嵌入式系统软件的开发进度和可靠性。如基于如基于ARM的应用:手机、的应用:手机、PDAyyyy-M-6/37简单嵌入式系统软件结构简单嵌入式系统软件结构l不需要使用操作系统,基于不需要使用操作系统,基于裸机裸机开发开发l系统上电后转移到系统上电后转移到main函数入口,首先进行系统函数入口,首先进行系统初初始化始化,然后进入,然后进入工作循环工作循环直到系统停电或者出现重直到系统停电或者出现重大错误。大错误。void main(void)/变量、参
5、数等的定义及说明变量、参数等的定义及说明 X_init();/系统初始化,一般为汇编代码系统初始化,一般为汇编代码While(1)X();/超级循环超级循环yyyy-M-7/37复杂嵌入式系统软件的一般结构复杂嵌入式系统软件的一般结构ARM+M+I/OHAL、底层封装、部分由、底层封装、部分由OS提供提供BOOTLOADyyyy-M-8/37复杂嵌入式系统软件工作流程复杂嵌入式系统软件工作流程yyyy-M-9/37S3C2440S3C2440启动方式启动方式 三星公司的三星公司的S3C2440支持支持Nor Flash和和Nand Flash启动启动,可以通过硬件跳线可以通过硬件跳线(引脚引脚
6、OM1:0)设设置启动方式。具体含义如下置启动方式。具体含义如下:1OM1:0=00时,处理器从时,处理器从NAND Flash启动启动2OM1:0=01时,处理器从时,处理器从16位宽度的位宽度的Nor Flash启动启动3OM1:0=10时,处理器从时,处理器从32位宽度的位宽度的Nor Flash启动启动4OM1:0=11时,处理器从时,处理器从Test Mode启动启动yyyy-M-10/37S3C2440 Nand Flash在系统上电后在系统上电后,Nand Flash控制器控制器会自动的把会自动的把Nand Flash上的前上的前4K U-BOOT数据搬移到内部数据搬移到内部SR
7、AM的的地址最低端地址最低端(此此SRAM被称为被称为Steppingstone);CPU从内部从内部RAM的的0 x00000000位位置开始启动并在置开始启动并在uboot启动代码的启动代码的前前4K里完成里完成S3C2440的核心配置,的核心配置,然后把然后把U-BOOT剩余部分搬到剩余部分搬到RAM中运行;中运行;S3C2440 Nand FlashS3C2440 Nand Flash启动过程启动过程yyyy-M-11/37引导程序引导程序BootLoaderBootLoaderl是嵌入式系统在加电启动后执行的第一段代码,功是嵌入式系统在加电启动后执行的第一段代码,功能类似能类似pc机
8、的机的BIOS和和OS Loader,通常需要,通常需要固化固化在目标板中;在目标板中;l主要负责主要负责CPU、存储器及相关硬件的、存储器及相关硬件的初始化初始化,以及,以及将将装载操作系统装载操作系统映像到内存中,然后跳转到规定的映像到内存中,然后跳转到规定的地址地址启动操作系统启动操作系统运行。运行。Bootloader是严重依赖硬件而实现的,每一种不是严重依赖硬件而实现的,每一种不同体系结构的处理器都有不同的同体系结构的处理器都有不同的Bootloader,甚至,甚至同一种处理器的外围硬件配置不同,其同一种处理器的外围硬件配置不同,其Bootloader也有差别。因此开发特定的也有差别
9、。因此开发特定的Bootloader是构建嵌入是构建嵌入式式linux系统之前的一项必要的基础工作。系统之前的一项必要的基础工作。yyyy-M-12/37BootloaderBootloader的开发的开发Stage1(汇编实现)(汇编实现)1.基本硬件设备初始化:基本硬件设备初始化:CPU时钟频率,寄存器,存储器数据时钟频率,寄存器,存储器数据宽度、访问周期、刷新周期,中断系统,宽度、访问周期、刷新周期,中断系统,I/O端口端口等;等;2.为第二阶段准备为第二阶段准备RAM空间,设置堆栈;空间,设置堆栈;3.复制第二阶段代码到复制第二阶段代码到RAM中,并跳转到第二阶段入口点中,并跳转到第二
10、阶段入口点Stage2(C实现)实现)1.初始化本阶段要使用的硬件设备,初始化本阶段要使用的硬件设备,实现对板级驱动的支持;实现对板级驱动的支持;2.检测系统内存映射;检测系统内存映射;3.将内核镜像和根文件系统镜像从将内核镜像和根文件系统镜像从flash读到读到RAM中;中;4.为内核设置启动参数;为内核设置启动参数;5.将将PC指针指向内核的入口处,指针指向内核的入口处,调用内核。挂载文件系统;调用内核。挂载文件系统;yyyy-M-13/37Linux Linux 环境下环境下BootLoaderBootLoader种类种类BootloaderMonitor描描 述述x86ARMPower
11、PCLILO否否Linux磁盘引导程序磁盘引导程序是是否否否否GRUB否否GNU的的LILO替代程序替代程序是是否否否否Loadlin否否从从DOS引导引导Linux是是否否否否ROLO否否从从ROM引导引导Linux而不需要而不需要BIOS是是否否否否Etherboot否否通过以太网卡启动通过以太网卡启动Linux系统系统的固件的固件是是否否否否LinuxBIOS否否完全替代完全替代BUIS的的Linux引导引导程序程序是是否否否否BLOB否否LART等硬件平台引导程序等硬件平台引导程序否否是是否否U-boot是是通用引导程序通用引导程序是是是是是是RedBoot是是基于基于eCos的引导程
12、序的引导程序是是是是是是yyyy-M-14/37U-bootU-boot的分析与移植的分析与移植U-boot全称全称 Universal Boot Loader,支,支持持ARM体系等多种处理器,包含常见的外设的体系等多种处理器,包含常见的外设的驱动,是一个开源的、功能强大的板极支持包;驱动,是一个开源的、功能强大的板极支持包;由德国由德国DENX软件工程中心的软件工程中心的Wolfgang Denk维护。维护。U-boot启动时处于正常的启动时处于正常的启动加载启动加载模式,模式,但是它会延时指定时间(单位秒)等待终端用但是它会延时指定时间(单位秒)等待终端用户按下任意键而切换到户按下任意键
13、而切换到下载模式下载模式,如果在指定,如果在指定时间内用户没有按键,则继续启动操作系统。时间内用户没有按键,则继续启动操作系统。yyyy-M-15/37U-bootU-boot主要包括以下目录主要包括以下目录lboard:该目录存放了该目录存放了U-Boot支持的一些已有开发板的信息。每一个开支持的一些已有开发板的信息。每一个开发板都以一个子目录出现在当前目录中,如发板都以一个子目录出现在当前目录中,如SMDK2410子目录中存放与子目录中存放与2410开发板相关的配置文件,但由于自行设计的目标板即使与已有开发开发板相关的配置文件,但由于自行设计的目标板即使与已有开发板使用相同处理器,但其他硬
14、件配置不一定相同,所以需要参考该目录板使用相同处理器,但其他硬件配置不一定相同,所以需要参考该目录下的内容来进行修改,例如根据使用的下的内容来进行修改,例如根据使用的Flash存储器的宽度和容量,可以存储器的宽度和容量,可以修改修改flash.c中对应的参数。中对应的参数。lcommon:该目录存放的是该目录存放的是U-Boot命令行界面下支持的各条命令的实现命令行界面下支持的各条命令的实现源码。每一条命令都对应一个文件,例如源码。每一条命令都对应一个文件,例如bootm命令对应就是命令对应就是cmd_bootm.c。通常主要关心与内核引导有关的。通常主要关心与内核引导有关的cmd_boot.
15、c和和cmd_bootm.c等代码。等代码。lcpu:该目录存放了该目录存放了U-Boot支持的支持的CPU类型。每一款类型。每一款U-Boot下支持的下支持的CPU在该目录下对应一个子目录,比如在该目录下对应一个子目录,比如S3C2440A采用的是采用的是ARM920T内内核,则子目录核,则子目录arm920t下即是对该处理器核的支持源码。下即是对该处理器核的支持源码。CPU相关的文相关的文件主要是初始化一个执行环境,包括中断的初始化。其中有一个重要文件主要是初始化一个执行环境,包括中断的初始化。其中有一个重要文件件start.s,该文件是一个汇编源文件,它是整个,该文件是一个汇编源文件,它
16、是整个U-Boot执行的第一段代执行的第一段代码,它的功能是将整个码,它的功能是将整个U-Boot目标代码重定位,也就是将目标代码重定位,也就是将U-Boot转移转移至内存中去运行。至内存中去运行。yyyy-M-16/37U-bootU-boot主要包括以下目录主要包括以下目录ldrivers:U-Boot支持的各种设备驱动程序都放在该目录,比如各种网卡、支持的各种设备驱动程序都放在该目录,比如各种网卡、支持支持CFI的的Flash、串口和、串口和USB等。等。lfs:该目录存放该目录存放U-Boot支持的文件系统,例如支持的文件系统,例如fat、fdos、jffs2、cramfs、ext2和
17、和reiserfs等。等。linclude:U-Boot使用的头文件,还有对各种硬件平台支持的汇编文件,使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下系统的配置文件和对文件系统支持的文件。该目录下configs目录有与开目录有与开发板相关的配置头文件。该目录下的发板相关的配置头文件。该目录下的asm目录有与目录有与CPU体系结构相关的头体系结构相关的头文件,文件,ARM对应的是对应的是asm-arm。llib_xxx:与体系结构相关的库文件。与与体系结构相关的库文件。与ARM相关的库放在相关的库放在lib_arm中。中。lnet:与网络协议栈相关
18、的代码,与网络协议栈相关的代码,BOOTP协议、协议、TFTP协议、协议、RARP协议协议和和NFS文件系统的实现。文件系统的实现。ltools:生成生成U-Boot的工具,如:的工具,如:mkimage,crc等等。等等。ldoc:文档目录。文档目录。U-Boot有非常完善的文档,推荐参考阅读。有非常完善的文档,推荐参考阅读。yyyy-M-17/37U-bootU-boot的运行过程分析的运行过程分析U-Boot的阶段一代码通常放在的阶段一代码通常放在start.s文件中,用汇编语言写成,其主要文件中,用汇编语言写成,其主要功能是设置处理器状态、初始化中断和内存时序、对整个功能是设置处理器状
19、态、初始化中断和内存时序、对整个U-Boot目标代目标代码进行重新定位。码进行重新定位。阶段一刚开始的代码是处理器的异常处理向量表:阶段一刚开始的代码是处理器的异常处理向量表:.globl_start;系统复位的位置,由;系统复位的位置,由U-Boot.ld决定决定_start:b reset;0 x00000000,各个异常向量对应的跳转代码,各个异常向量对应的跳转代码 ldr pc,_undefined_instruction;0 x00000004,未定义指令异常,未定义指令异常 ldrpc,_software_interrupt ;0 x00000008,软件中断异常软件中断异常 ld
20、r pc,_prefetch_abort ;0 x0000000c,预取中止异常,预取中止异常 ldrpc,_data_abort ;0 x00000010,数据中止异常,数据中止异常 ldrpc,_not_used ;0 x00000014,未使用,未使用 ldrpc,_irq ;0 x00000018,中断异常,中断异常 ldrpc,_fiq ;0 x0000001c,快速中断异常,快速中断异常当发生各类异常时,当发生各类异常时,CPU将执行将执行interrupts.c中对应定义的中断处理函数。中对应定义的中断处理函数。yyyy-M-18/37U-bootU-boot的运行过程分析的运行
21、过程分析reset:/*set the cpu to SVC32 mode*/mrsr0,cpsrbicr0,r0,#0 x1forrr0,r0,#0 xd3msrcpsr,r0 从以上代码可以看出,其功能主要是修改程序状态寄从以上代码可以看出,其功能主要是修改程序状态寄存器存器CPSR的相关值,修改后的相关值,修改后CPSR的低八位变为二进制值的低八位变为二进制值11x10011,依其值可知,依其值可知CPU进入进入SVC管理模式,且中断管理模式,且中断和快速中断均被关闭。和快速中断均被关闭。后续代码功能分别是关闭看门狗、禁止中断、配置处后续代码功能分别是关闭看门狗、禁止中断、配置处理器内部
22、时钟、配置内存区控制寄存器等,然后是代码搬理器内部时钟、配置内存区控制寄存器等,然后是代码搬移指令代码移指令代码。yyyy-M-19/37U-bootU-boot的运行过程分析的运行过程分析接着通过下列语句跳转到接着通过下列语句跳转到C代码执行,阶段一的使命也就代码执行,阶段一的使命也就完成了。完成了。ldrpc,_start_armboot_start_armboot:.word start_armboot start_armboot()在在board.c中定义,是中定义,是Bootloader中的中的C语言开语言开始的函数,也是整个启动代码中始的函数,也是整个启动代码中C语言的主函数,同时
23、还是整个语言的主函数,同时还是整个UBoot(armboot)的主函数。它类似于)的主函数。它类似于Linux内核的内核的start_kernel(),是一种系统初始化的接口函数,完成初始化工作。是一种系统初始化的接口函数,完成初始化工作。该函数主要完成如下操作:调用一系列初始化函数完成该函数主要完成如下操作:调用一系列初始化函数完成CPU的基的基本设置、开发板的初始化、中断向量的初始化、环境变量的初始化、本设置、开发板的初始化、中断向量的初始化、环境变量的初始化、串口初始化等;配置可用的串口初始化等;配置可用的Flash区;内存初始化;区;内存初始化;I2C、LCD、video、音频等外围设
24、备初始化;网络设备初始化等等,最后进入、音频等外围设备初始化;网络设备初始化等等,最后进入U-Boot命命令行。令行。yyyy-M-20/37嵌入式操作系统嵌入式操作系统yyyy-M-21/37l嵌入式实时操作系统嵌入式实时操作系统RTlinux及其他嵌入式实时及其他嵌入式实时LinuxuC/OS IIeCOSVxworks(wind river systems公司)公司)QNX(QNX software systems公司)公司)pSOSOS/9VRTXThreadXl嵌入式非实时操作系统嵌入式非实时操作系统 一些嵌入一些嵌入inux系统系统Windows CE、Embedded windo
25、ws xp(Microsoft公司)公司)Palm OS(Palm公司)公司)EPOC(Symbian公司公司)yyyy-M-22/37LinuxLinux嵌入式操作系统嵌入式操作系统Linux是一个是一个类类Unix(Unix-like)的、)的、免费免费的、的、源代码源代码开放开放的、符合的、符合POSIX(Portable Operating System Interface Standard)标准规范的操作系统;)标准规范的操作系统;严格来说,严格来说,Linux指由指由Linux Torvalds维护的(及通过维护的(及通过主要镜像网站发布的)主要镜像网站发布的)内核,内核,而整个而
26、整个Linux系统的其它系统的其它大部分都建立在大部分都建立在GNU软件之上;软件之上;嵌入式嵌入式Linux内核内核为特殊的硬件配置、或为了支持特别的应用而经过特别的裁剪的修改过为特殊的硬件配置、或为了支持特别的应用而经过特别的裁剪的修改过的的Linux内核;内核;通常具有不同于工作站与服务器的内核配置;通常具有不同于工作站与服务器的内核配置;嵌入式嵌入式Linux系统系统基于基于Linux内核的嵌入式系统;内核的嵌入式系统;嵌入式嵌入式Linux发行套件发行套件开发嵌入式开发嵌入式Linux系统的平台;系统的平台;各种为了在嵌入式系统中使用而剪裁过的应用软件;各种为了在嵌入式系统中使用而剪
27、裁过的应用软件;yyyy-M-23/37LinuxLinux内核的发展历史内核的发展历史l1991年年11月,芬兰赫尔辛基大学的学生月,芬兰赫尔辛基大学的学生 Linus Torvalds写了个写了个小程序,取名为小程序,取名为Linux,放在互联网上。他表达了一个愿望,希望,放在互联网上。他表达了一个愿望,希望借此搞出一个操作系统的借此搞出一个操作系统的“内核内核”来,这完全是一个偶然事件;来,这完全是一个偶然事件;l1993,在一批高水平黑客的参与下,诞生了,在一批高水平黑客的参与下,诞生了Linux 1.0 版版;l1994年,年,Linux 的第一个商业发行版的第一个商业发行版 Sla
28、ckware 问世;问世;l1996年,美国国家标准技术局的计算机系统实验室确认年,美国国家标准技术局的计算机系统实验室确认 Linux 版版本本 1.2.13(由(由 Open Linux 公司打包)符合公司打包)符合 POSIX 标准;标准;l2001年,年,Linux2.4版内核发布版内核发布;l2003年,年,Linux2.6版内核发布;版内核发布;lLinux内核版本号由内核版本号由3位数字组成位数字组成r.x.y第1位数字r为主版本号 第2位数字x为说明版本类型的次版本号,如果x为偶数,则表示为产品化版本,为奇数时表示为实验版本 第3位数字y为修改号,表示错误修补的次数 yyyy-
29、M-24/37几种流行的几种流行的Linux OSLinux OS发行版本发行版本yyyy-M-25/37嵌入式嵌入式LinuxLinux系统结构图系统结构图 嵌入式嵌入式Linux具有分层的体系结构,一般可分为具有分层的体系结构,一般可分为3小层及内核小层及内核空间和用户空间两大块,每一层模块都屏蔽了其以下各层的具体空间和用户空间两大块,每一层模块都屏蔽了其以下各层的具体细节,只对上层提供功能接口或图形界面。上层模块不需要知道细节,只对上层提供功能接口或图形界面。上层模块不需要知道其以下各层模块的实现方式,只需要利用下层提供的接口完成相其以下各层模块的实现方式,只需要利用下层提供的接口完成相
30、应功能即可。这样的层次模型大大增加了嵌入式应功能即可。这样的层次模型大大增加了嵌入式Linux的安全性、的安全性、稳定性、裁减或增添模块的便利性。稳定性、裁减或增添模块的便利性。yyyy-M-26/37LinuxLinux内核的各子系统之间的关系内核的各子系统之间的关系 嵌入式嵌入式Linux内核一般可以分为内核一般可以分为4个部分:进程调度管理、内个部分:进程调度管理、内存管理、文件系统和设备驱动程序,它们之间的关系如存管理、文件系统和设备驱动程序,它们之间的关系如上上图所示。图所示。进程调度处于中心位置,其他所有子系统都依赖于它。在嵌入式进程调度处于中心位置,其他所有子系统都依赖于它。在嵌
31、入式系统中,嵌入式系统中,嵌入式Linux的实时性能改造与进程调度有很大的关系,的实时性能改造与进程调度有很大的关系,调度策略的算法直接关系到系统的实时性能。调度策略的算法直接关系到系统的实时性能。yyyy-M-27/37嵌入式嵌入式LinuxLinux中的文件系统结构中的文件系统结构 嵌入式嵌入式Linux的文件系统建立在块设备上,不采用驱动器号或的文件系统建立在块设备上,不采用驱动器号或驱动器名称来标识,而是采用了树形结构,每个独立文件系统为驱动器名称来标识,而是采用了树形结构,每个独立文件系统为一个子树,组成树形的层次化的结构。当引入新的文件系统时,一个子树,组成树形的层次化的结构。当引
32、入新的文件系统时,嵌入式嵌入式Linux通过挂载方式将其连接到某个目录,从而使不同的文通过挂载方式将其连接到某个目录,从而使不同的文件系统组合成一个整体成为可能。件系统组合成一个整体成为可能。yyyy-M-28/37嵌入式嵌入式LinuxLinux内核移植内核移植l如果一个系统是可以在不同的硬件平台上运行,那么这个如果一个系统是可以在不同的硬件平台上运行,那么这个系统就是可移植的。系统就是可移植的。Linux内核移植指根据自己的硬件平内核移植指根据自己的硬件平台对内核源代码进行台对内核源代码进行修改修改,同时对内核进行,同时对内核进行裁剪裁剪,编译出,编译出适合自己硬件平台的内核镜像文件。适合
33、自己硬件平台的内核镜像文件。Linux内核源代码包括多个目录:内核源代码包括多个目录:(1)arch:包括硬件特定内核代码,如:包括硬件特定内核代码,如arm、mips等;等;(2)drivers:包含硬件驱动代码;:包含硬件驱动代码;(3)include:通用头文件及针对不同平台的特定头文件;:通用头文件及针对不同平台的特定头文件;(4)init:内核初始化代码;:内核初始化代码;(5)ipc:进程间通信代码;:进程间通信代码;(6)kernel:内核核心代码;:内核核心代码;(7)mm:内存管理代码;:内存管理代码;(8)net:与网络协议栈相关的代码;:与网络协议栈相关的代码;(9)fs
34、:文件系统相关代码,如:文件系统相关代码,如nfs、vfat等;等;(10)lib:库文件,与平台无关的:库文件,与平台无关的strlen、strcpy等等yyyy-M-29/37LinuxLinux下驱动程序设计示例下驱动程序设计示例lLinux操作系统对串口有着很好的支持,其中的串操作系统对串口有着很好的支持,其中的串口驱动程序对用户屏蔽了底层硬件的相关信息,口驱动程序对用户屏蔽了底层硬件的相关信息,而且为用户提供了一系列的标准调用函数,极大而且为用户提供了一系列的标准调用函数,极大的方便了串口通信的操作。用户编写串口应用程的方便了串口通信的操作。用户编写串口应用程序的时候不需要考虑硬件相
35、关的问题,只需要根序的时候不需要考虑硬件相关的问题,只需要根据据Linux操作系统提供的调用函数来实现自己需要操作系统提供的调用函数来实现自己需要的功能的功能。l在在Linux操作系统下,串口是被当做文件来对待的,操作系统下,串口是被当做文件来对待的,因此对它进行数据收发等效于对文件进行读写操因此对它进行数据收发等效于对文件进行读写操作。对串口的操作一般分为四个步骤:作。对串口的操作一般分为四个步骤:打开串口打开串口、设置串口设置串口、读写串口读写串口和和关闭串口关闭串口。yyyy-M-30/37(1)(1)打开串口打开串口l在在ARM平台中平台中Linux操作系统下的串口设备文件操作系统下的
36、串口设备文件为为/dev/ttySAC0。示例程序如下:示例程序如下:int fd;fd=open(/dev/ttySAC0,O_RDWR);/*以读写方式打开串口以读写方式打开串口*/if(fd=-1);/*如果打开串口错误则输出提示信息如果打开串口错误则输出提示信息*/perror(Cant Open Serial Port);yyyy-M-31/37(2)(2)设置串口设置串口l与无操作系统的情况下对串口进行初始化设置类与无操作系统的情况下对串口进行初始化设置类似,在似,在Linux下最基本的串口设置工作主要包括波下最基本的串口设置工作主要包括波特率、校验位和停止位的设置,其设置方式主要
37、特率、校验位和停止位的设置,其设置方式主要是对是对struct termios结构体各成员值进行设置。结构体各成员值进行设置。l在不同应用中通常需要设置的波特率及数据格式在不同应用中通常需要设置的波特率及数据格式等参数都不一样,可以将结构体成员赋值的功能等参数都不一样,可以将结构体成员赋值的功能编写成函数,通过对该函数入口参数的修改,即编写成函数,通过对该函数入口参数的修改,即可方便的实现不同的设置。可方便的实现不同的设置。yyyy-M-32/37波特率设置函数波特率设置函数void set_speed(int fd,int speed)int i;int status;struct term
38、iosOpt;tcgetattr(fd,&Opt);/*得到机器原端口的默认设置得到机器原端口的默认设置*/for(i=0;i sizeof(speed_arr)/sizeof(int);i+)if(speed=name_arri)tcflush(fd,TCIOFLUSH);/*清除输入清除输入/输出数据输出数据*/cfsetispeed(&Opt,speed_arri);/设置输入波特率设置输入波特率cfsetospeed(&Opt,speed_arri);/设置输出波特率设置输出波特率status=tcsetattr(fd,TCSANOW,&Opt);/将设置写入串口将设置写入串口if(s
39、tatus!=0)perror(tcsetattr fd1);return;tcflush(fd,TCIOFLUSH);yyyy-M-33/37数据格式数据格式设置函数设置函数int set_Parity(int fd,int databits,int stopbits,int parity)struct termios options;if(tcgetattr(fd,&options)!=0)/*得到机器原端口的默认设置得到机器原端口的默认设置*/perror(SetupSerial 1);return(FALSE);options.c_cflag&=CSIZE;switch(databit
40、s)/设置数据位个数设置数据位个数 case 7:options.c_cflag|=CS7;/设置数据位为设置数据位为7位位 break;case 8:options.c_cflag|=CS8;/设置数据位为设置数据位为8位位 break;default:fprintf(stderr,Unsupported data sizen);return(FALSE);yyyy-M-34/37数据格式数据格式设置函数设置函数switch(stopbits)/设置停止位个数设置停止位个数 case 1:options.c_cflag&=CSTOPB;/设置停止位为设置停止位为1位位 break;case
41、2:options.c_cflag|=CSTOPB;/设置停止位为设置停止位为2位位 break;default:fprintf(stderr,Unsupported stop bitsn);return(FALSE);yyyy-M-35/37switch(parity)/设置校验位属性设置校验位属性 case n:case N:options.c_cflag&=PARENB;/关闭奇偶校验关闭奇偶校验 options.c_iflag&=INPCK;/关闭输入奇偶校验检测关闭输入奇偶校验检测 break;case o:case O:options.c_cflag|=(PARODD|PARENB
42、);/设置为奇效验设置为奇效验 options.c_iflag|=INPCK;/打开输入奇偶校验检测打开输入奇偶校验检测 break;case e:case E:options.c_cflag|=PARENB;/打开奇偶校验打开奇偶校验 options.c_cflag&=PARODD;/设置为偶效验设置为偶效验 options.c_iflag|=INPCK;/打开输入奇偶校验检测打开输入奇偶校验检测 break;default:fprintf(stderr,Unsupported parityn);/不能识别的校验类型不能识别的校验类型 return(FALSE);yyyy-M-36/37(3
43、)(3)读写串口实现数据传输读写串口实现数据传输从串口发送数据:从串口发送数据:使用文件操作使用文件操作write函数实现数据发送,示例程序如下:函数实现数据发送,示例程序如下:charbuffer1024;int Length;int writeByte;writeByte=write(fd,buffer,Length);功能:将发送缓冲区功能:将发送缓冲区buffer中中Length大小的数据从串口发出。大小的数据从串口发出。从串口接收数据:从串口接收数据:使用文件操作使用文件操作read函数实现数据接收,示例程序如下:函数实现数据接收,示例程序如下:charbuffer1024;int Length;int readByte;readByte=read(fd,buffer,Length);功能:读取串口接收到的功能:读取串口接收到的Length大小的数据,并放到接收缓冲区大小的数据,并放到接收缓冲区buffer中。中。yyyy-M-37/37(4)(4)关闭关闭串口串口关闭串口就是关闭设备文件,使用文件操作关闭串口就是关闭设备文件,使用文件操作close函数实现。函数实现。close(fd););
限制150内