驱动 5-23

news/2024/11/13 3:45:09/

驱动IO三种模型

非阻塞IO:

当在应用程序中读取硬件数据时,不管硬件数据有没有准备好,read()函数不会阻塞住,而是继续向下执行。

在应用程序中用open函数以非阻塞的方式打开文件,会直接使用驱动程序中的mycdev_read()函数的内容

阻塞IO:

当在应用程序中读取硬件数据时,如果硬件数据没有准备好,那么此时阻塞在read()函数位置,直到硬件数据准备就绪,通过read()读取硬件数据,应用程序向下执行,进程阻塞等待硬件数据此时处于休眠态。

特点:比较简单,只能监听一个硬件的数据,效率低。

在应用程序中使用open函数设置为阻塞状态,在硬件数据没有准备好的时候(condition标志量为0),将进程的task_struct添加到等待队列(先要定义等待队列再初始化等待队列)(wait_queue_head wq_head),将进程切换为休眠状态(可中断休眠\不可中断休眠)(wait_event\wait_event_interuptible)。当硬件数据准备好时将condition置1并唤醒进程(wake_up\wake_up_interruptible)

IO多路复用:

想要在一个进程中同时监听多个硬件的数据,就需要使用IO多路复用。实现机制有三种:select 、poll 、epoll。IO多路复用的基本思想是在用户空间中将监听的事件文件描述符添加到事件集合中,调用函数进行判断集合中文件描述符对应的硬件数据是否准备就绪,如果没有一个事件发生,将进程切换到休眠状态(可中断休眠状态)。当有一个或者多个硬件数据准备好了,将休眠的进程唤醒,对准备好的硬件数据进行读写。

特点:  1> 在单进程单线程的情况下,同时处理多个硬件数据输入输出请求。

           2> 由于不需要创建新的进程和线程,减少系统的资源开销,减少上下文切换的次数。

Selec:阻塞函数,让内核检测指定文件描述符集合中,是否有文件描述符准备就绪

 当文件描述符准备就绪后,该函数解除阻塞。

 当事件产生后,集合中会只剩下触发事件的文件描述符。

操作集合函数有:

void FD_CLR(int fd, fd_set *set);      将fd从集合中剔除

int  FD_ISSET(int fd, fd_set *set);     判断fd是否在集合中,在返回真,不在返回假

void FD_SET(int fd, fd_set *set);      将fd加入到集合中

void FD_ZERO(fd_set *set);          清空集合

Poll:阻塞函数,让内核检测指定文件描述符集合中,是否有文件描述符准备就绪

 当文件描述符准备就绪后,该函数解除阻塞。

Epoll:一颗树、一张表、三个接口

三者区别:

       select:监听的文件描述符有限制,Linux系统默认是1024

       poll:和select差不多, 比select优越的地方是监听的文件描述符个数可以不限

       epoll:

1) 监听的文件描述符个数不限   

2) select/poll有事件时,会无差别遍历所有文件描述符,依次判断是否有数据,复杂度为O(n); 而epoll 会把哪个流发生了怎样的I/O事件通知我们,复杂度为O(1)。显然epoll优势明显。(具体用法google一下)


http://www.ppmy.cn/news/93269.html

相关文章

【信息系统项目管理师】十大管理——1、整合管理

十大管理——1、整合管理 项目背景 项目概况 2021年6月,我有幸作为项目经理主持了“某省广电网络工程资源管理系统”项目的建设工作,该项目中标金额为888万元,建设工期为5年,该项目是该省广电网络公司的重点项目。 该项目整合…

Java中异常的处理及捕获

Java中异常的处理及捕获 一、异常的概述 (1)Java中异常的作用:增强程序的健壮性 (2)在Java中所有的Error(错误)和异常(Exception)都继承了同一个父类Throwable 二、异…

[元带你学: eMMC完全解读 9] 设备怎么复位到预空闲(Pre-Idle)状态

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC完全解读》 前言 在引导操作模式下,host (e-MMC主机)可以在发出CMD1之前,通过保持CMD线低电平或发送带有+0xFFFFFFFA参数的CMD0,才Device(e-MMC设备)读取引导Boot数据。根据寄存器设置,可…

小航编程题库机器人等级考试理论一级(2022年12月) (含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 单选题2.0分 删除编辑 答案:C 第1题下列哪个是机器人?( ) A、aB、bC、cD、d 答案解析: 单选题…

STM32 AT24CXX器件地址的理解(IIC通讯协议)

if (EE_TYPE > AT24C16) /* 24C16以上的型号, 分2个字节发送地址 */ { iic_send_byte(0XA0); /* 发送写命令, IIC规定最低位是0, 表示写入 */ iic_wait_ack(); /* 每次发送完一个字节,都要等待ACK */ iic_send_byte(addr >&…

印象笔记导出HTML再转markdown的方法

前言 我已经使用6年印象笔记了,越来越依赖它了,现在已经有6000多条笔记了,我就想着如果某一天印象笔记没了,那我这些心血就都没了,所以我想要把笔记全部转为markdown格式,然后自己存储起来。可以选择用百度…

Prometheus(普罗米修斯)

Prometheus : 入门 Prometheus简介Prometheus 的主要特点Prometheus架构:什么时候用它合适什么时候用它不合适Prometheus VS InfluxDB基本概念数据模型metric types(指标类型) Prometheus 安装部署二进制安装部署1、将安装包prometheus-2.6.1…

netty学习第一课

技术主题 Netty是一个基于Java NIO(非阻塞 I/O)框架的网络编程框架。它提供了一系列的高级网络编程API,使得开发者可以非常容易地实现高性能、高可靠性的网络应用。Netty具有非常好的可扩展性和灵活性,能够很好地支持多种协议和数…