request_threaded_irq 的“处理函数”中的 I2c 读取和写入操作如何影响整个驱动程序?

2024-02-10

我有一个带有 request_threaded_irq 的处理函数和线程函数的驱动程序代码,与此类似:

irq-handler fn()
{
      /*disable device interrupt*/
      i2c read from register;
      set disable bit to client-device-interrupt 
      i2c write back;
      return IRQ_WAKe_THREAD;
}



irq-thread fn()
{
      i2c read from register;
      ....
      ....
      /*enable device interrupt*/
      i2c read from register;
      set enable bit to client-device-interrupt 
      i2c write back;
      /*Rest of the operation*/
      ..........
      ..........
      return IRQ_HANDLED;
}

我对上述实施没有什么疑问。

  1. “handler fn”中的 2 i2c 操作会花费大量时间吗?

  2. 我是否需要在“handler fn”原子中进行位操作?

  3. 我是否应该将“启用设备中断”之前执行的操作从“线程 fn”移动到“处理程序 fn”(这将花费我 4 个以上的 i2c 操作和一位操作)? - 原因是,按照上面的代码实现,我可能会错过中断。

  4. 如果我这样做(按照问题 3)。它如何影响其他设备中断。(因为我有一个基本疑问:硬 IRQ 上下文中的“handler fn”是否在禁用中断的情况下运行)

请为我提供针对上述情况的良好且最佳的解决方案。

提前致谢。


I2C 读/写传输不是确定性的。

该协议允许外围从 IC 执行时钟拉伸 http://en.wikipedia.org/wiki/I%C2%B2C#Clock_stretching_using_SCL从而允许他们“抓住”主人直到他们准备好。 然而,这不是常见情况,因此每个 I2C 传输通常在大多数情况下以预定间隔完成。然而,这并不能保证,因此在 ISR 中执行多次 I2C 传输并不是一个好主意。

This link http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-March/001118.html包含关于线程 irq 的基础知识及其正确用法的很好的解释。


上述场景的最佳设计?

使用线程中断处理程序方法不会有太多好处,因为尝试启用/禁用设备上的中断会增加延迟。

在您当前的情况下(来自单个设备的单个中断),可以坚持常规request_irq()注册中断服务程序(ISR)。

ISR code :
1. 在 ISR 中,调用disable_irq()以防止进一步的中断。
2. 安排一个下半部分处理函数(工作队列是一个不错的选择)。
3. 返回IRQ_HANDLED来自ISR。

下半部分处理程序 code :
4. 执行 I2C 传输。
5. 打电话enable_irq()并退出。


NOTE :
实现相同设计的另一种方法是使用没有 ISR 的线程中断。这实现了与上述设计相同的效果,并且无需在代码中单独定义/初始化/清理下半部处理程序。

In 这种方法一 http://lxr.free-electrons.com/source/drivers/input/touchscreen/qt602240_ts.c?v=2.6.38#L1283将把所有 I2C 读/写代码放在IRQ线程函数 http://lxr.free-electrons.com/source/drivers/input/touchscreen/qt602240_ts.c?v=2.6.38#L677并将其传递给request_threaded_irq()随着handler = NULL即空 ISR。

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

request_threaded_irq 的“处理函数”中的 I2c 读取和写入操作如何影响整个驱动程序? 的相关文章

  • syn队列和accept队列的混淆

    在阅读TCP源码时 我发现一个困惑的事情 我知道 TCP 在 3 次握手中有两个队列 第一个队列存储服务器收到的连接SYN并发回ACK SYN 我们称之为同步队列 第二个队列存储3WHS成功并建立连接的连接 我们称之为接受队列 但在阅读代码
  • 由于 system.out.println 语句导致运行线程延迟[重复]

    这个问题在这里已经有答案了 在下面的代码中 如果我在 for 循环内使用 sysout 语句 则代码将执行并在满足条件后进入循环内部 但如果我不在循环内使用 sysout 语句 则无限循环将继续进行 而不会进入 if 条件 即使if 条件满
  • USB 端口速度 Linux [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何以编程方式确定运行 Linux 内核的嵌入式设备中的 USB 端口速度 你可以阅读 sys bus usb devices usb s
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • dmesg 和 /var/log/kern.log 之间的区别

    我正在修改kvm模块 并在内核代码中添加了printk语句 运行虚拟机后 printk为我提供了错误地址和有关客户操作系统的其他信息 我需要根据此信息生成统计信息 当我使用 dmesg 时 我只能看到错误地址 在内核空间中 即它们的地址高于
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 将 mmap 内核启动参数保留的内存映射到用户空间

    正如中所讨论的this https stackoverflow com q 1911473 143897问题 我在启动时使用内核启动参数保留一个内存块memmap 8G 64G 我写了一个字符驱动程序 http pete akeo ie 2
  • 内核与系统中的 Windows 进程

    我有一些与内核和用户模式下的 Windows 进程相关的问题 如果我有一个 hello world 应用程序和一个公开新系统调用 foo 的 hello world 驱动程序 我很好奇一旦处于内核模式 我能做什么和不能做什么 对于初学者来说
  • 为什么一个线程会中断另一个线程[重复]

    这个问题在这里已经有答案了 在Java多线程应用程序中 我们处理InterruptedThreadException 如果另一个线程中断当前线程 则会抛出此异常 现在 当另一个线程知道它将导致异常时 它可能想要中断当前线程的原因是什么 很多
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 同步 I/O 是否会使线程繁忙?

    假设我正在同步 I O 套接字上执行 I O 该套接字已准备好read or write手术 这意味着调用线程不会在操作上被阻塞 无论非阻塞 SOCK NONBLOCK 套接字的阻塞性质 但以下事情我不清楚 实际转移何时发生 当套接字标记为
  • 树莓派的设备树驱动内核

    我想用设备树驱动的 Linux 内核启动树莓派 有什么特别的事情要做吗 谁能指出为树莓派设置基于设备树的内核启动需要什么 我可能需要有树莓派内核源代码 其中设备驱动程序应与设备树兼容 如果是这样 我在哪里可以找到 Raspberry Pi
  • 各种中断的区别:SCI、SMI、NMI、普通中断

    我正在学习英特尔架构 到目前为止我遇到过几种类型的中断 SCI 系统控制中断 硬件使用的系统中断 用于向操作系统通知 ACPI 事件 SCI 是一个有效 低电平 可共享的电平中断 SMI 系统管理中断 由遗留系统上的中断事件生成的操作系统透
  • 当 mov 指令导致页面错误并且在 x86 上禁用中断时会发生什么?

    我最近在自定义 Linux 内核 2 6 31 5 x86 驱动程序中遇到一个问题 其中 copy to user 会定期不将任何字节复制到用户空间 它将返回传递给它的字节数 表明它没有复制任何内容 经过代码检查 我们发现代码在调用 cop
  • 读取文件而不从操作系统页面缓存中逐出

    这主要适用于 Linux 或者理想情况下适用于任何 POSIX 系统 当我阅读以下页面时 我正在寻找一种读取大量文件 其中任何一个文件本身可能高达 1GB 的方法 具有以下特征 如果相关磁盘页面已在文件系统缓存中 则使用该页面 如果相关页面
  • 编译内核进行页表遍历时出现错误

    我正在执行页表遍历 当我准备更新内核时出现错误 kernel sys c In function do sys get page info kernel sys c 2745 23 error passing argument 1 of p
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 我的属性太活泼了,我该怎么办?

    在 Linux 设备驱动程序中 创建 sysfs 属性probe太活泼了 具体来说 它经历了与用户空间的竞争条件 http kroah com log blog 2013 06 26 how to create a sysfs file c

随机推荐