字符设备驱动之异步通知

2023-11-09

一,应用程序主动的去查询或 read


1.查询方式:很占资源。
2.中断机制:虽然有休眠,但在没有按键按下时 read()
3.poll 机制:指定超时时间。以上都是“应用程序”主动去读或查询。

二,异步通知:

有按键按下了,驱动程序来提醒(触发)“应用程序”去
进程之间发信号:
kill -9 pid
kill 是信号发送者,
pid 具体进程是信号接收者。
信号值是“9”

“信号”与“中断”差不多。注册中断处理函数时是用信号也是有一个“信号”和“处理函数”。
参数是“信号的值”,和要挂接的“信号处理函数”。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

程序"signal"一收到这个“Kill”信号时,就会调用里面的“信号处理函数”“my_signal_fun”。
-USR1 与 -10 是一样的。
kill -9 pid:9 这个信号处理函数就是让这个进程退出来。
1,先注册“信号处理函数”。
2,发送信号。
①,谁来发信号。
②,发给谁。
③,怎么发。

三,异步通知功能的驱动程序:

目标:按下按键时,驱动程序会主动通知应用程序
找一个字符驱动查看 kill_fasync 函数的用法。接上面 4 个步骤查看用法,下面找到一个:
在这里插入图片描述1,首先看这个字符设备中定义的一个“fasync_struct”结构的变量:rtc_async_queue。 2,看这个变量的定义,初始化和使用,整个 rtc.c 中有三处出现“rtc_async_queue”:
在这里插入图片描述
3,要清楚使用方法就要清楚“rtc_fasync()”在哪里定义:
在这里插入图片描述

在这个“rtc.c”中可以找到这个函数的定义,它是一个“file_operatons”结构中的成员。

以上弄清楚“kill_fasync”函数的用法之后,可以依照:
在“中断服务程序”中发:即当有按键按下时就发送一个信号给应用程序。
首先声明一个“fasync_struct”结构变量。
在这里插入图片描述
在这里插入图片描述

有按键按下了就发一个信号给应用程序。
其中要定义一个结构,取名为“button_async”.
以上便可以发送信号出去了。
发给谁肯定是这个结构中定义的。这个结构“button_async”要做些初始化。
有如下例子,这里的结构体是“rtc_async_queue”,看看这个“fasync_helper”函数是否在初
始化这个结构体。
在这里插入图片描述
rtc_fasync函数就是file_operations里的成员函数,需要我们自己实现
所以可以依照这个例子做。在“file_operations 结构中加一个成员。
在这里插入图片描述

然后加上这个初始化“button_async”结构的函数“fasync_help”:
在这里插入图片描述

这个函数“fifth_drv_fasync”什么情况下调用:
信号是驱动程序发的,在中断服务程序“buttons_irq”通过“kill_fasync (&button_async, SIGIO,
POLL_IN);” 来 发 。 发 给 谁 是 包 含 在 “ button_async ” 这 个 结 构 体 中 。 这 个 结 构 体 在
“fifth_drv_fasync”中由“fasync_helper”来初始化。这个函数“fifth_drv_fasync”什么时候被
调用,是应用程序调用“.fasync”

这么一个“.fasync”系统调用时,就会调用到:fifth_drv_fasync
所以显然是应用程序要调用“.fasync”来设置那个“发给谁”。

为了使设备支持异步通知机制,驱动程序中涉及以下 3 项工作:

  1. 支持 F_SETOWN 命令,能在这个控制命令处理中设置 filp->f_owner 为对应进程 ID。
    不过此项工作已由内核完成,设备驱动无须处理。
  2. 支持 F_SETFL 命令的处理,每当 FASYNC 标志改变时,驱动程序中的 fasync()函数将得以
    执行。
    驱动中应该实现 fasync()函数。
  3. 在设备资源可获得时,调用 kill_fasync()函数激发相应的信号

应用程序:

fcntl(fd, F_SETOWN, getpid()); // 告诉内核,发给谁
应用程序会调用“fcntl()”这个函数,把进程的 PID 号告诉给驱动程序。
应用程序还要通过“F_GETFL”读出“flags”,在 flags 上置上“FASYNC”位。
Oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, Oflags | FASYNC); // 改变 fasync 标记,最终会调用到驱动的 faync >
fasync_helper:初始化/释放 fasync_struct
如上面“fcntl(fd, F_SETFL, Oflags | FASYNC);”接口被调用时,下在函数中的“fasync_helper
()”就会被调用:

应用程序会调用“F_SETOWN”即“fcntl(fd, F_SETOWN, pid)”这样一个函数,来进程的 pid 告
诉驱动程序。
然后应用程序还要通过“F_GETFL”读出标志位,即 flags,先读出来再在这个 flags 上面修
改,加上一个“FASYNC”。异步通知的 flags.每当 FAYNC 标志“flags”改变时,驱动程序里
面的
在这里插入图片描述
这个函数会被调用。
这个函数也只是用一个“fasync_helper”,这是内核帮做的一个函数。是辅助作用。将结构体
变量“button_async”初始化,我们定义了但没去初始化它,这个内核辅助函数就去初始化它。
这个结构体“button_async”初始化后,中断服务程序“buttons_irq”就能调用:
在这里插入图片描述
当应用程序调用这个接口“fcntl(fd, SETFL, oflags | FASYNC)”时,函数“fasync_helper”
就会被调用。
驱动程序对“F_SETOWN”的处理是由内核完成的。

在这里插入图片描述

这是驱动测试程序。它不会主动去读按键值“read(fd, &key_val, 1); ”。这个“my_signal_fun”信号函数是在驱动服务程序“buttons_irq”里,发现有按键按下时,给应用程序发“kill_fasync
(&button_async, SIGIO, POLL_IN);”信号,这个信号会触发应用程序来调用它的信号处理函数“my_signal_fun”。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符设备驱动之异步通知 的相关文章

随机推荐

  • Selenium+Pytest自动化测试框架实战

    前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础 至少明白类与对象 封装继承 一定的selenium基础 本篇不讲selenium 不会的可以自己去看selenium中文翻译网 一 测试框架简介 测试框
  • vue2实现百度地图定位

    用的是vue2的地图定位插件 https dafrok github io vue baidu map zh control city list 1 首先肯定是先下载了 npm i vue baidu map S 2 下载完记得全局引入 在
  • Qt 插入Label到指定位置

    QLabel label new QLabel this label gt setFrameStyle QFrame Panel QFrame Sunken label gt setText first line nsecond line
  • [C++]中介者模式

    中介者模式 Mediator Pattern 是用来降低多个对象和类之间的通信复杂性 这种模式提供了一个中介类 该类通常处理不同类之间的通信 并支持松耦合 使代码易于维护 中介者模式属于行为型模式 github源码路径 https gith
  • VSCode配置C语言环境(完整版)

    基本步骤 要在VSCode中配置C语言环境 我们首先可能要一个VSCode 废话 所以先下载安装一个VSCode 然后肯定需要相关插件 因为VSCode不能直接拿来写C 然后任何语言的程序在运行前都需要编译 那还需要一个编译器 很可惜VSC
  • (Python)蚁群算法解决旅行商问题(ACO-TSP)

    蚁群算法又称蚂蚁算法 容易与其他算法相结合 但也存在收敛速度慢 容易陷入局部最优等缺点 coding utf 8 import random import copy import time import sys import math im
  • 【刷题】华为笔试面试机考 [HJ29] - 字符串加解密

    题目地址 点击跳转 题目描述 1 对输入的字符串进行加解密 并输出 2 加密方法为 当内容是英文字母时则用该英文字母的后一个字母替换 同时字母变换大小写 如字母a时则替换为B 字母Z时则替换为a 当内容是数字时则把该数字加1 如0替换1 1
  • 【性能测试】第五篇

    JMeter环境安装 安装JDK 1 JDK下载 官网下载 http www oracle com 提示 下载时注意电脑系统是32位还是64位 桌面 计算机 右击 属性 查看 系统类型 2 安装JDK 双击安装包进行安装 所有步骤选择默认选
  • AVL树的插入操作(四种情况)

    目录 前言 一 AVL树简介 平衡因子bf 二 AVL树的插入操作 不包含重复值 1 找到要插入的位置 和普通的二叉搜索树一样 2 平衡化 情况1 右旋 Single Right Rotation 情况2 左旋 Single Left Ro
  • ubuntu shell实现加减乘除

    bin sh a 8 b 4 c expr a b 乘法 c expr a b 加法 c expr a b 减法 c expr a b 除法
  • 【Windows】 谷歌翻译停服后,chrome无法自动翻译?解决办法来了~

    早前蓝点网提到谷歌翻译中国版和谷歌地图中国版同时停服 此次停服也影响到谷歌浏览器翻译功能的使用 谷歌给出的官方回应是谷歌翻译和谷歌地图的中国版使用率都太低 既然使用率太低那直接停服也情有可原 笑笑 只是谷歌浏览器内置的翻译功能也需要调用谷歌
  • LeetCode每日一题:1462. 课程表 IV(2023.9.12 C++)

    目录 1462 课程表 IV 题目描述 实现代码与解析 拓扑排序 原理思路 1462 课程表 IV 题目描述 你总共需要上 numCourses 门课 课程编号依次为 0 到 numCourses 1 你会得到一个数组 prerequisi
  • KVM-6、virsh 命令及功能详解

    1 虚拟机管理操作 attach device 从XML文件附加设备 attach disk 附加磁盘设备 attach interface 连接网络接口 autostart 自动启动一个域 blkdeviotune 设置或查询块设备I O
  • IDEA报错Project lease-web: there is circular dependency between tests of ‘service-util‘ module, tests

    项目场景 当我创建多个模块时 为了模块化管理利于模块复用 我一层包一层 问题描述 例如 当我要运行的时候发现报错 Project lease web there is circular dependency between tests of
  • Linux 音视频开发杂记之二-使用FFmpeg

    FFmpeg简介 FFmpeg是一套可以用来记录 转换数字音频 视频 并能将其转化为流的开源计算机程序 采用LGPL或GPL许可证 它提供了录制 转换以及流化音视频的完整解决方案 ubuntu下FFmpeg下载 编译并安装 1 基础依赖库安
  • 动态规划基础之挖金矿问题

    问题 有一个国家发现了5座金矿 每座金矿的黄金储量不同 需要参与挖掘的工人数也不同 情况如下图 金矿编号 黄金储量 需要人数 1 500 5 2 200 3 3 300 4 4 350 3 5 400 5 参与挖矿工人的总数是10人 每座金
  • 点云目标检测 国内外现状 2000字

    国内外现状近年来 点云目标检测技术受到了越来越多的关注 其中包括传统的统计学习方法和深度学习方法 由于深度学习方法的出现 点云目标检测研究取得了长足的进步 首先 深度学习方法大大提高了点云目标检测的准确率 其次 深度学习方法也大大简化了点云
  • C++:防止int32溢出--以反转数字为例

    int32溢出 在C 等语言中int类型的整数占4个字节 一般而言 而一个字节是8bit 所以int型可表示32位的整数 又因为int可以表示负数 所以int的范围是 2 31 2 31 231
  • Unity3D之UI按键绑定事件(六)

    六 通过unity系统自带接口和观察者模式绑定按键事件 UI UGUI 如何判断UI元素被点击时是鼠标哪个按键 五 中我们可以根据eventData pointerId来监听是我们按下的是鼠标左键还是右键 通过前面几部分学习我们已经实现对U
  • 字符设备驱动之异步通知

    一 应用程序主动的去查询或 read 1 查询方式 很占资源 2 中断机制 虽然有休眠 但在没有按键按下时 read 3 poll 机制 指定超时时间 以上都是 应用程序 主动去读或查询 二 异步通知 有按键按下了 驱动程序来提醒 触发 应