Linux内核:从内核空间调用用户空间的回调函数

2024-01-03

我正在编写 Linux 用户空间应用程序。我想从内核空间调用用户空间区域中注册的回调函数。

即中断到达 GPIO 引脚(开关按下事件)并在用户空间中调用注册函数。

有没有什么方法可以做到这一点。

Thanks


经过大量挖掘后,我发现了下面的代码,并且非常适合我。

处理来自 GPIO 的中断 在许多情况下,GPIO 输入可配置为在以下情况下生成中断: 更改状态,这允许您等待中断而不是轮询 低效的软件循环。如果GPIO位可以产生中断,则文件边沿 存在。最初,它的值为 none ,这意味着它不会生成中断。 要启用中断,您可以将其设置为以下值之一: • 上升:上升沿中断 • 下降:下降沿中断 • 两者:上升沿和下降沿均中断 • 无:无中断(默认) 您可以使用 poll() 函数以 POLLPRI 作为事件来等待中断。如果 如果您想等待 GPIO 48 上的上升沿,请首先启用中断:

#echo 48 > /sys/class/gpio/export

#echo 上升 > /sys/class/gpio/gpio48/edge

然后,您使用 poll() 等待更改,如以下代码示例所示:

 #include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <poll.h>>

 int main(void) {

         int f;
         struct pollfd poll_fds [1];
         int ret;
         char value[4];
         int n;

         f = open("/sys/class/gpio/gpio48", O_RDONLY);
         if (f == -1) {
              perror("Can't open gpio48");
              return 1;
         }

         poll_fds[0].fd = f;
         poll_fds[0].events = POLLPRI | POLLERR;

         while (1) {
              printf("Waiting\n");

              ret = poll(poll_fds, 1, -1);
              if (ret > 0) {
                  n = read(f, &value, sizeof(value));
                  printf("Button pressed: read %d bytes, value=%c\n", n, value[0]);
              }
         }     
      return 0; 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核:从内核空间调用用户空间的回调函数 的相关文章

  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • Fortran 中的共享库,最小示例不起作用

    我试图了解如何在 Linux 下的 Fortran 中动态创建和链接共享库 我有两个文件 第一个 liblol f90 看起来像这样 subroutine func print lol end subroutine func 我用它编译gf
  • C++:Linux平台上的线程同步场景

    我正在为 Linux 平台实现多线程 C 程序 其中我需要类似于 WaitForMultipleObjects 的功能 在搜索解决方案时 我发现有一些文章描述了如何在 Linux 中实现 WaitForMultipleObjects 功能
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • SMP 上如何处理中断?

    SMP 对称多处理器 多核 机器上如何处理中断 内存管理单元是只有一个还是多个 假设两个线程 A 和 B 运行在不同的内核上 同时 访问页表中不存在的内存页面 在这种情况下 将会出现页面错误 并从内存中引入新页面 将会发生的事件的顺序是什么
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 了解 Linux oom-killer 日志

    我的应用程序被 oom killer 杀死了 它是在实时 USB 上运行的 Ubuntu 11 10 无需交换 PC 具有 1 Gig 的 RAM 唯一运行的应用程序 除了所有内置的 Ubuntu 东西 是我的程序 flasherav 请注
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码

随机推荐

  • Three.js - 根据屏幕上像素位置着色的顶点着色器

    我使用 Three js 编写了一个顶点着色器 它根据渲染像素的屏幕象限对平面中的每个点进行着色 vertex shader uniform float width uniform float height varying float x
  • 在 .bashrc 中设置变量时是否需要“导出”?

    我想知道在 bashrc中设置变量时是否需要使用 export 在我的测试中编辑 bashrc 之间没有区别 foo bar and export foo bar 在这两种情况下 登录后 echo foo 输出 bar 我正在使用 Debi
  • 如何使用Summernote上传Excel文件?

    我正在我的网站中实施 CMS 工具 为此我使用 Summernote Editor 现在我想使用 Summernote 上传 Excel 文件 如何使用 Summernote 上传 Excel 文件 下面是创建文件上传自定义按钮的代码 单击
  • ContentValues 数组中出现重复的 ContentValues

    有任何帮助吗 当然这很简单 但看不到它 对内容提供程序 UserDictionary 进行批量插入 但所有插入都具有相同的 单词 值 问题是 ContentValues 数组 这是我的一些测试代码 public void mClick Vi
  • 如何移动 MongoDB 数组中的项目?

    有没有一种方法可以更新文档数组以将项目从一个索引移动到另一个索引 例如 name myDoc items it1 it2 it3 JQuery UI Sortable 事件的结果是 it2 和 it3 交换了位置 因此 我想更新它们在存储在
  • iOS:获取文件的元数据

    我的服务器上有一个 mp3 文件 我想获取该文件的信息 例如该文件的大小 艺术家姓名 专辑名称 文件创建时间 修改时间等 我想要所有这些信息 是否可以在不实际下载整个文件的情况下获取此信息 使用NSURLConnection或者其他什么 E
  • Fortran do-loop 任意索引,如 R 中的 for-loop?

    我有两个 p n 数组x and missx where x包含任意数字并且missx是一个包含 0 和 1 的数组 我需要对那些点执行递归计算missx为零 明显的解决方案是这样的 do i 1 n do j 1 p if missx j
  • JSTL c:forEach 不迭代集合

    有谁知道为什么这段代码可以工作
  • 在 C# 中的 Selenium Web 驱动程序中等待标签标签文本

    您好 Stack Overflow 社区 我有一个简单的问题 回答后 将帮助任何其他想要使用 Selenium 和 C 的人等待 直到文本出现在网页上 该文本不是可点击的链接 但显示在标签标记中 我有以下示例代码 div class cla
  • Gradle + Android 注释 + 合并清单 =“找不到 AndroidManifest”

    当我对不同的构建类型使用不同的清单时 我似乎遇到了 Android 注释查找 Android 清单的问题 我得到的错误是 java error Unexpected error Please report an issue on Andro
  • SQL postgres 按周对数据进行聚合/透视和总计

    我有一个事件日志表 它记录给定的事件详细信息 例如事件日期和费用 id place id start at total fee pennies 4242 40 2013 10 20 19 00 00 0100 8700 4288 48 20
  • 将 CSV 列保存到数组?

    我想将 CSV 文件中的三列保存到三个不同的数组中 一列用于用户名 一列用于 IP 地址 一列用于密码 但它似乎不起作用 至少从我的理解来看 这是代码 Importedcsv Import csv C my file is located
  • Actionscript 3:您需要删除事件监听器吗?

    在 ActionScript 3 中 我动态创建对象并添加事件监听器 这些对象被添加到数组中 稍后可能会再次删除 其他的可能稍后会再次添加 每次创建对象时 我都会将这些 EventListener 添加到其中 但是 在删除这些对象时是否也需
  • 从 AsyncTaskLoader 更新 UI

    我已经转换了我的AsyncTask to an AsyncTaskLoader 主要是为了处理配置更改 我有一个TextView我正在使用进度状态并且正在使用onProgressUpdate in the AsyncTask来更新它 看起来
  • EmberJS 嵌套视图和控制器

    我正在使用 EmberJS v1 0 pre 编写一个应用程序 我有一个ArrayController其中包含所有人的列表 有一堆嵌套视图显示人 他们的宠物以及每只宠物的注释 John lt Person Quincy Dog lt Pet
  • django unittest:即使我发送令牌,client.get 错误 401

    我尝试为方法注销创建一个单元测试 我有这个目的 response client get api v1 logout self assertEquals response status code 200 但在我的注销控制器中我有这个 perm
  • 长数字的 JSON 解组给出浮点数

    例如 我使用 golang 编组和解组 JSON 当我想使用数字字段时 golang 将其转换为浮点数 而不是使用长数字 我有以下 JSON id 12423434 Name Fernando After marshal它到地图上并且unm
  • Django 中随机发生运行时错误死锁

    在 Python 3 7 9 中运行 Django 我正在使用通道 因此使用 daphne 但即使我使用 Gunicorn 也会获得相同的结果 下面的错误是随机出现的 ERROR 2021 07 12 11 55 07 478 HTTP G
  • Fortran - lbound 抛出错误 6366“数组表达式的形状不符合”

    所以我又被Fortran弄糊涂了 去搞清楚 不管怎样 我正在尝试编写一个非常简单的例程 将值从数组末尾剥离 一切复杂的工作都很好 除了我想编写子例程 这样我就不必将输入数组的下限传递给它 这是子程序 subroutine Strip lis
  • Linux内核:从内核空间调用用户空间的回调函数

    我正在编写 Linux 用户空间应用程序 我想从内核空间调用用户空间区域中注册的回调函数 即中断到达 GPIO 引脚 开关按下事件 并在用户空间中调用注册函数 有没有什么方法可以做到这一点 Thanks 经过大量挖掘后 我发现了下面的代码