嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程

上传人:E**** 文档编号:89407760 上传时间:2019-05-24 格式:PPT 页数:50 大小:1.38MB
返回 下载 相关 举报
嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程_第1页
第1页 / 共50页
嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程_第2页
第2页 / 共50页
嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程_第3页
第3页 / 共50页
嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程_第4页
第4页 / 共50页
嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程》由会员分享,可在线阅读,更多相关《嵌入式应用程序设计 教学课件 ppt 华清远见嵌入式学院 穆煜 第2章 嵌入式文件IO编程(50页珍藏版)》请在金锄头文库上搜索。

1、嵌入式应用程序设计 第2章 嵌入式文件I/O编程,2,第1章 搭建嵌入式Linux开发环境 第2章 嵌入式文件I/O编程 第3章 嵌入式Linux多任务编程 第4章 嵌入式Linux进程间通行 第5章 嵌入式Linux多线程编程 第6章 嵌入式Linux网络编程 第7章 Qt图形编程 第8章 嵌入式Linux设备驱动编程 第9章 Qt聊天项目设计,课程安排:,3,2.1 Linux系统调用及用户编程接口 2.2 Linux文件I/O系统概述 2.3 底层文件I/O操作 2.4 嵌入式Linux串口应用编程 2.5 标准I/O编程 2.6 实验内容 2.7 小结 2.8 思考与练习,本章课程:,

2、4,2.1.1 系统调用,2.1 Linux系统调用及用户编程接口,系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口获得操作系统内核提供的服务。例如用户可以通过进程控制相关的系统调用来创建进程、实现进程之间的通信等。,5,2.1.2 用户编程接口,2.1 Linux系统调用及用户编程接口,在Linux中,用户编程接口(API)遵循了在Unix中最流行的应用编程界面标准POSIX标准。POSIX标准是由IEEE和ISO/IEC共同开发的标准系统。该标准基于当时现有的Unix实践和经验,描述了操作系统的系统调用编程接口(实际上就是API),用于保证应用程序

3、可以在源代码一级上在多种操作系统上移植运行。这些系统调用编程接口主要是通过C库(libc)实现的。,6,2.1.3 系统命令,2.1 Linux系统调用及用户编程接口,系统命令相对API更高了一层,它实际上一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能 ,它们之间的关系如图:,7,2.2.1 虚拟文件系统 Linux系统成功的关键因素之一就是具有与其他操作系统和谐共存的能力。Linux的文件系统由两层结构构建。第一层是虚拟文件系统(VFS),第二层是各种不同的具体的文件系统。 VFS在linux系统中的位置如图:,2.2 Linux文件I/O系统概述,8,2.2.2 中文

4、件及文件描述符 对于Linux而言,所有对设备和文件的操作都是使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。 一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理,2.2 Linux文件I/O系统概述,9,2.3.1 基本文件操作 open函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。 所需头文件: #include #include #includ

5、e 原型: int open(const char *pathname, int flags, int perms),2.3 底层文件I/O操作,10,2.3.1 基本文件操作 open函数语法要点,2.3 底层文件I/O操作,11,2.3.1 基本文件操作 close()函数是用于关闭一个被打开的文件。 close函数语法要点:,2.3 底层文件I/O操作,12,2.3.1 基本文件操作 read()函数是用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数 。 read函数语法要点:,2.3 底层文件I/O操作,13,2.3.1 基本文件操作 write()函数是用于向

6、打开的文件写数据,写操作从文件的当前指针位置开始。 write函数语法要点:,2.3 底层文件I/O操作,14,2.3.1 基本文件操作 lseek()函数是用于在指定的文件描述符中将文件指针定位到相应的位置。 lseek函数语法要点:,2.3 底层文件I/O操作,15,2.3.2 文件锁 fcntl()函数具有很丰富的功能,它可以对已打开的文件描述符进行各种操作,不仅包括管理文件锁,还包括获得设置文件描述符和文件描述符标志、文件描述符的复制等很多功能。,2.3 底层文件I/O操作,16,2.3.2 文件锁 fcntl()函数语法要点,2.3 底层文件I/O操作,17,2.3.2 文件锁 fc

7、ntl()函数第三个参数lock说明 lock为结构体flock它的定义为: struct flock flock成员取值含义如表: short l_type; off_t l_start; short l_whence; off_t l_len; pid_t l_pid; ,2.3 底层文件I/O操作,18,2.3.3 多路复用 I/O处理模型 阻塞I/O模型 非阻塞模型 I/O多路转接模型 信号驱动I/O模型 异步I/O模型 select和poll的I/O转接模型是处理I/O复用的一个高效的方法,2.3 底层文件I/O操作,19,2.3.3 多路复用 select()函数的语法格式 :,2

8、.3 底层文件I/O操作,20,2.3.3 多路复用 select()对文件描述符进行了分类处理,处理涉及4个宏:,2.3 底层文件I/O操作,21,2.3.3 多路复用 poll函数语法格式:,2.3 底层文件I/O操作,22,2.4.1 串口编程基础知识 常见的数据通信的基本方式可分为并行通信与串行通信两种。 并行通信是指利用多条数据传输线将一个字数据的各比特位同时传送。它的特点是传输速度快,适用于传输距离短且传输速度较高的通信。 串行通信是指利用一条传输线将数据以比特位为单位顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于传输距离长且传输速度较慢的通信。,2.4

9、 嵌入式Linux串口应用编程,23,2.4.1 串口编程基础知识 串口是计算机一种常用的接口,常用的串口有RS-232-C接口。 DB9串口接口:,2.4 嵌入式Linux串口应用编程,24,2.4.2 串口配置 串口设置主要是设置struct termios结构体的各个成员 #include struct termios unsigned short c_iflag; /* 输入模式标志 */ unsigned short c_oflag; /* 输出模式标志 */ unsigned short c_cflag; /* 控制模式标志*/ unsigned short c_lflag; /*

10、 本地模式标志 */ unsigned char c_line; /* 线路规程 */ unsigned char c_ccNCC; /* 控制特性 */ speed_t c_ispeed; /* 输入速度 */ speed_t c_ospeed; /* 输出速度 */ ;,2.4 嵌入式Linux串口应用编程,25,2.4.2 串口配置 保存原先串口设置 为了安全起见和以后调试程序方便,可以先保存原先串口的配置,在这里可以使用函数tcgetattr(fd, ,2.4 嵌入式Linux串口应用编程,26,2.4.2 串口配置 激活选项 CLOCAL和CREAD分别用于本地连接和接受使能,因此,

11、首先要通过位掩码的方式激活这两个选项。 newtio.c_cflag |= CLOCAL | CREAD; 调用cfmakeraw()函数可以将终端设置为原始模式,在后面的实例中,采用原始模式进行串口数据通信。 cfmakeraw(,2.4 嵌入式Linux串口应用编程,27,2.4.2 串口配置 设置波特率 设置波特率有专门的函数,用户不能直接通过位掩码来操作。设置波特率的主要函数有:cfsetispeed()和cfsetospeed()。 示例: cfsetispeed(,2.4 嵌入式Linux串口应用编程,28,2.4.2 串口配置 设置字符大小 与设置波特率不同,设置字符大小并没有现

12、成可用的函数,需要用位掩码。一般首先去除数据位中的位掩码,再重新按要求设置 示例: new_cfg.c_cflag ,2.4 嵌入式Linux串口应用编程,29,2.4.2 串口配置 设置奇偶校验位 设置奇偶校验位需要用到termios中的两个成员:c_cflag和c_iflag。首先要激活c_cflag中的校验位使能标志PARENB和是否要进行校验,这样会对输出数据产生校验位,而输入数据进行校验检查。同时还要激活c_iflag中的对于输入数据的奇偶校验使能(INPCK)。 示例: 奇校验 new_cfg.c_cflag |= (PARODD | PARENB); new_cfg.c_ifla

13、g |= INPCK; 偶校验 new_cfg.c_cflag |= PARENB; new_cfg.c_cflag ,2.4 嵌入式Linux串口应用编程,30,2.4.2 串口配置 设置停止位 设置停止位是通过激活c_cflag中的CSTOPB而实现的。若停止位为一个,则清除CSTOPB,若停止位为两个,则激活CSTOPB。 示例: new_cfg.c_cflag /* 将停止位设置为两个比特 */,2.4 嵌入式Linux串口应用编程,31,2.4.2 串口配置 设置最少字符和等待时间 在对接收字符和等待时间没有特别要求的情况下,可以将其设置为0,则在任何情况下read()函数立即返回,

14、此时串口操作会设置为非阻塞方式。 示例: new_cfg.c_ccVTIME = 0; new_cfg.c_ccVMIN = 0;,2.4 嵌入式Linux串口应用编程,32,2.4.2 串口配置 清除串口缓冲 由于串口在重新设置之后,需要对当前的串口设备进行适当的处理,这时就可调用在中声明的tcdrain()、tcflow()、tcflush()等函数来处理目前串口缓冲中的数据。 原型: int tcflush(int fd, int queue_selector); /* 用于清空输入/输出缓冲区*/ tcflush()函数,对于在缓冲区中的尚未传输的数据,或者收到的但是尚未读取的数据,其

15、处理方法取决于queue_selector的值,它可能的取值有以下几种。 TCIFLUSH:对接收到而未被读取的数据进行清空处理。 TCOFLUSH:对尚未传送成功的输出数据进行清空处理。 TCIOFLUSH:包括前两种功能,即对尚未处理的输入输出数据进行清空处理。 示例:tcflush(fd, TCIFLUSH);,2.4 嵌入式Linux串口应用编程,33,2.4.2 串口配置 激活配置 在完成全部串口配置之后,要激活刚才的配置并使配置生效。这里用到的函数是tcsetattr(),它的函数原型是: tcsetattr(int fd, int optional_actions, const

16、struct termios *termios_p); 其中参数termios_p是termios类型的新配置变量。 参数optional_actions可能的取值有以下三种: TCSANOW:配置的修改立即生效。 TCSADRAIN:配置的修改在所有写入fd的输出都传输完毕之后生效。 TCSAFLUSH:所有已接受但未读入的输入都将在修改生效之前被丢弃。 该函数若调用成功则返回0,若失败则返回1,代码如下所示:,2.4 嵌入式Linux串口应用编程,34,2.4.3 串口使用 打开串口 使用open函数打开串口 读写串口 使用read/write函数读写串口,2.4 嵌入式Linux串口应用编程,35,2.5.1 基本操作 打开文件 打开文件有三个标准函数,分别为:fopen()、fdopen()和freopen()。它们可以以不同的模式打开,但都返回一个指向FILE的指针,该指针指向对应的I/O流。 fopen()可以

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号