有时(但是很少!)一个驱动需要禁止一个特定中断线的中断递交. 内核提供了 3 个函数为 此目的, 所有都声明在 <asm/irq.h>. 这些函数是内核 API 的一部分, 因此我们描述它 们, 但是它们的使用在大部分驱动中不鼓励. 在其他的中, 你不能禁止共享的中断线, 并 且, 在现代的系统中, 共享的中断是规范. 已说过的, 它们在这里:

void disable_irq(int irq);

void disable_irq_nosync(int irq); void enable_irq(int irq);

调用任一函数可能更新在可编程控制器(PIC)中的特定 irq 的掩码, 因此禁止或使能跨所 有处理器的特定 IRQ. 对这些函数的调用能够嵌套 -- 如果 disable_irq 被连续调用 2 次, 需要 2 个 enable_irq 调用在 IRQ 被真正重新使能前. 可能调用这些函数从一个中 断处理中, 但是在处理它时使能你自己的 IRQ 常常不是一个好做法.

disable_irq 不仅禁止给定的中断, 还等待一个当前执行的中断处理结束, 如果有. 要知 道如果调用 disable_irq 的线程持有中断处理需要的任何资源(例如自旋锁), 系统可能 死锁. disable_irq_nosync 与 disable_irq 不同, 它立刻返回. 因此, 使用 disable_irq_nosync 快一点, 但是可能使你的设备有竞争情况.

但是为什么禁止中断? 坚持说并口, 我们看一下 plip 网络接口. 一个 plip 设备使用裸 并口来传送数据. 因为只有 5 位可以从并口连接器读出, 它们被解释为 4 个数据位和一 个时钟/握手信号. 当一个报文的第一个 4 位被 initiator (发送报文的接口) 传送, 时 钟线被拉高, 使接收接口来中断处理器. plip 处理者接着被调用来处理新到达的数据.

在设备已经被提醒了后, 数据传送继续, 使用握手线来传送数据到接收接口(这可能不是 最好的实现, 但是有必要与使用并口的其他报文驱动兼容). 如果接收接口不得不为每个 接收的字节处理 2 次中断, 性能可能不可忍受. 因此, 驱动在接收报文的时候禁止中断; 相反, 一个查询并延时的循环用来引入数据.

类似地, 因为从接收器到发送器的握手线用来确认数据接收, 发送接口禁止它的 IRQ 线 在报文发送时.

最新文章

  1. html中嵌入swf文件的几种方法
  2. cookie学习指南
  3. Ajax+PHP+MySQL 登陆示例
  4. 【C#】【Thread】SynchronizationContext线程间同步
  5. vagrant up时提示 Authentication failure. Retrying
  6. JS调用客户端EXE
  7. Linux下的内核测试工具——perf使用简介
  8. gcc中不同namespace中同名class冲突时
  9. ecos编译redboot,vmware运行redboot,执行hello world(图形配置)
  10. 允许Android随着屏幕转动的控制自由转移到任何地方(附demo)
  11. Oracle索引——位图索引
  12. For循环及例题
  13. EF Core 2.2 对多个 DbContext 单个数据库的情况进行迁移的示例
  14. C#创建ActiveX
  15. log4cplus在Linux下编译及使用
  16. 微信小程序案例大全
  17. 搭建k8s(一)
  18. fork/join 全面剖析
  19. k8s技能树
  20. hibernate.properties not found

热门文章

  1. 二.python数据结构的性能分析
  2. C++:static类
  3. 如何mock https请求
  4. IDEA切换git分支
  5. Oracle安装 卸载 和常见问题
  6. C++之MD5加密(签名)
  7. 寒哥教你学iOS - 经验漫谈
  8. MaxCompute SQL 使用正则表达式选列
  9. 洛谷 1463[SDOI2005] 反素数ant
  10. Oracle(ERROR SP2-0642)