第2章嵌入式文件IO编程.ppt

上传人:sccc 文档编号:4947538 上传时间:2023-05-25 格式:PPT 页数:50 大小:1.39MB
返回 下载 相关 举报
第2章嵌入式文件IO编程.ppt_第1页
第1页 / 共50页
第2章嵌入式文件IO编程.ppt_第2页
第2页 / 共50页
第2章嵌入式文件IO编程.ppt_第3页
第3页 / 共50页
第2章嵌入式文件IO编程.ppt_第4页
第4页 / 共50页
第2章嵌入式文件IO编程.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《第2章嵌入式文件IO编程.ppt》由会员分享,可在线阅读,更多相关《第2章嵌入式文件IO编程.ppt(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 思考与练习,本章课程:,4,2.1.1 系统调用,2.1

2、 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 中文件及文件描述符 对于Linux而言,所

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

5、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()函数是用于向打开的文件写数据,写操作从文件的当前指针位置开始。write函数语法要点

6、:,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 文件锁fcntl()函数第三个参数lock说明lock为结构体flock它的定义为:struc

7、t 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.3 底层文件I/O操作,20,2.3.3 多路复用select()对文件描述符进行了分类处理,处理涉及4个

8、宏:,2.3 底层文件I/O操作,21,2.3.3 多路复用poll函数语法格式:,2.3 底层文件I/O操作,22,2.4.1 串口编程基础知识常见的数据通信的基本方式可分为并行通信与串行通信两种。并行通信是指利用多条数据传输线将一个字数据的各比特位同时传送。它的特点是传输速度快,适用于传输距离短且传输速度较高的通信。串行通信是指利用一条传输线将数据以比特位为单位顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于传输距离长且传输速度较慢的通信。,2.4 嵌入式Linux串口应用编程,23,2.4.1 串口编程基础知识串口是计算机一种常用的接口,常用的串口有RS-232

9、-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;/*本地模式标志*/unsigned char c_line;/*线路规程*/unsigned char c_ccNCC;/*控制特性*/speed_t

10、c_ispeed;/*输入速度*/speed_t c_ospeed;/*输出速度*/;,2.4 嵌入式Linux串口应用编程,25,2.4.2 串口配置保存原先串口设置为了安全起见和以后调试程序方便,可以先保存原先串口的配置,在这里可以使用函数tcgetattr(fd,2.4 嵌入式Linux串口应用编程,26,2.4.2 串口配置激活选项CLOCAL和CREAD分别用于本地连接和接受使能,因此,首先要通过位掩码的方式激活这两个选项。newtio.c_cflag|=CLOCAL|CREAD;调用cfmakeraw()函数可以将终端设置为原始模式,在后面的实例中,采用原始模式进行串口数据通信。c

11、fmakeraw(,2.4 嵌入式Linux串口应用编程,27,2.4.2 串口配置设置波特率设置波特率有专门的函数,用户不能直接通过位掩码来操作。设置波特率的主要函数有:cfsetispeed()和cfsetospeed()。示例:cfsetispeed(,2.4 嵌入式Linux串口应用编程,28,2.4.2 串口配置设置字符大小与设置波特率不同,设置字符大小并没有现成可用的函数,需要用位掩码。一般首先去除数据位中的位掩码,再重新按要求设置示例:new_cfg.c_cflag,2.4 嵌入式Linux串口应用编程,29,2.4.2 串口配置设置奇偶校验位设置奇偶校验位需要用到termios

12、中的两个成员:c_cflag和c_iflag。首先要激活c_cflag中的校验位使能标志PARENB和是否要进行校验,这样会对输出数据产生校验位,而输入数据进行校验检查。同时还要激活c_iflag中的对于输入数据的奇偶校验使能(INPCK)。示例:奇校验new_cfg.c_cflag|=(PARODD|PARENB);new_cfg.c_iflag|=INPCK;偶校验new_cfg.c_cflag|=PARENB;new_cfg.c_cflag,2.4 嵌入式Linux串口应用编程,30,2.4.2 串口配置设置停止位设置停止位是通过激活c_cflag中的CSTOPB而实现的。若停止位为一个

13、,则清除CSTOPB,若停止位为两个,则激活CSTOPB。示例:new_cfg.c_cflag/*将停止位设置为两个比特*/,2.4 嵌入式Linux串口应用编程,31,2.4.2 串口配置设置最少字符和等待时间在对接收字符和等待时间没有特别要求的情况下,可以将其设置为0,则在任何情况下read()函数立即返回,此时串口操作会设置为非阻塞方式。示例:new_cfg.c_ccVTIME=0;new_cfg.c_ccVMIN=0;,2.4 嵌入式Linux串口应用编程,32,2.4.2 串口配置清除串口缓冲由于串口在重新设置之后,需要对当前的串口设备进行适当的处理,这时就可调用在中声明的tcdra

14、in()、tcflow()、tcflush()等函数来处理目前串口缓冲中的数据。原型:int tcflush(int fd,int queue_selector);/*用于清空输入/输出缓冲区*/tcflush()函数,对于在缓冲区中的尚未传输的数据,或者收到的但是尚未读取的数据,其处理方法取决于queue_selector的值,它可能的取值有以下几种。TCIFLUSH:对接收到而未被读取的数据进行清空处理。TCOFLUSH:对尚未传送成功的输出数据进行清空处理。TCIOFLUSH:包括前两种功能,即对尚未处理的输入输出数据进行清空处理。示例:tcflush(fd,TCIFLUSH);,2.4

15、 嵌入式Linux串口应用编程,33,2.4.2 串口配置激活配置在完成全部串口配置之后,要激活刚才的配置并使配置生效。这里用到的函数是tcsetattr(),它的函数原型是:tcsetattr(int fd,int optional_actions,const struct termios*termios_p);其中参数termios_p是termios类型的新配置变量。参数optional_actions可能的取值有以下三种:TCSANOW:配置的修改立即生效。TCSADRAIN:配置的修改在所有写入fd的输出都传输完毕之后生效。TCSAFLUSH:所有已接受但未读入的输入都将在修改生效之

16、前被丢弃。该函数若调用成功则返回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()可以指定打开文件的路径和模式 fopen函数格式:,2.5 标准I/O编程,36,2.5.1 基本操作打开文件mode类似于open(

17、)函数中的flag,可以定义打开文件的访问权限等,下面为mode的各种取值:,2.5 标准I/O编程,37,2.5.1 基本操作打开文件fdopen()可以指定打开的文件描述符和模式。fdopen函数格式:mode取值同fopen,2.5 标准I/O编程,38,2.5.1 基本操作打开文件freopen()除可指定打开的文件、模式外,还可指定特定的I/O流。freopen函数格式:mode取值同fopen,2.5 标准I/O编程,39,2.5.1 基本操作关闭文件关闭标准流文件的函数为fclose(),该函数将缓冲区内的数据全部写入到文件中,并释放系统所提供的文件资源。fclose()函数格式

18、:,2.5 标准I/O编程,40,2.5.1 基本操作读文件在文件流被打开之后,可对文件流进行读写等操作,其中读操作的函数为fread()。fread()函数格式:,2.5 标准I/O编程,41,2.5.1 基本操作写文件fwrite()函数是用于对指定的文件流进行写操作。fwrite()函数格式:,2.5 标准I/O编程,42,2.5.2 其他操作字符输入/输出字符输入函数:字符输出函数:,2.5 标准I/O编程,43,2.5.2 其他操作行输入/输出行输入函数:行输出函数:,2.5 标准I/O编程,44,2.5.2 其他操作格式化输入/输出格式化输入函数:,2.5 标准I/O编程,45,2

19、.5.2 其他操作格式化输入/输出格式化输出函数:,2.5 标准I/O编程,46,文件的读写与上锁实验目的通过编写文件读写及上锁的程序,进一步熟悉Linux中文件I/O相关的应用开发,并且熟练掌握open()、read()、write()、fcntl()等函数的使用。实验内容在Linux中FIFO是一种进程之间的管道通信机制。Linux支持完整的FIFO通信机制。本实验内容比较有趣,我们通过使用文件操作,仿真FIFO(先进先出)结构以及生产者-消费者运行模型。本实验中需要打开两个虚拟终端,分别运行生产者程序(producer)和消费者程序(customer)。此时两个进程同时对同一个文件进行读

20、写操作。因为这个文件是临界资源,所以可以使用文件锁机制来保证两个进程对文件的访问都是原子操作。先启动生产者进程,它负责创建仿真FIFO结构的文件(其实是一个普通文件)并投入生产,就是按照给定的时间间隔,向FIFO文件写入自动生成的字符(在程序中用宏定义选择使用数字还是使用英文字符),生产周期以及要生产的资源数通过参数传递给进程(默认生产周期为1秒,要生产的资源总数为10个字符,显然默认生产总时间为10秒钟)。后启动的消费者进程按照给定的数目进行消费,首先从文件中读取相应数目的字符并在屏幕上显示,然后从文件中删除刚才消费过的数据。为了仿真FIFO结构,此时需要使用两次拷贝来实现文件内容的偏移。每

21、次消费的资源数通过参数传递给进程,默认值为10个字符。,2.6 实验内容,47,多路复用式串口操作实验目的通过编写多路复用串口读写,进一步理解多路复用函数的用法,同时更加熟练掌握Linux设备文件的读写方法。实验内容本实验中,实现两台机器(宿主机和目标板)之间的串口通信,而且每台机器均可以发送和接收数据。除了串口设备名称不同(宿主机上使用串口1:/dev/ttyS0,而在目标板上使用串口2:/dev/ttyS1),两台机器上的程序基本相同。首先程序打开串口设备文件并进行相关配置。调用select()函数,使它等待从标准输入(终端)文件中的输入以及从串口设备的输入。如果有标准输入上的数据,则写入到串口,使对方读取。如果有串口设备上的输入,则将数据写入到普通文件中。,2.6 实验内容,48,系统调用、用户函数接口和系统命令的联系和区别多路复用文件I/O和标准I/O嵌入式Linux串口编程,2.7 小结,49,简述虚拟文件系统在Linux系统中的位置和通用文件系统模型。底层文件操作和标准文件操作之间有哪些区别?比较select()函数和poll()函数。然后使用多路复用函数实现3个串口的通信:串口1接收数据,串口2和串口3向串口1发送数据。,2.8 思考与练习,50,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号