- 安装中断
中断处理可以在驱动初始化时或者在设备第一次打开时安装. 但不建议在模块的初始化函数中安装 调用 request_irq 的正确位置是当设备第一次打开时, 在硬件被指示来产生中断前. 调用 free_irq的位置是设备最后一次被关闭时, 在硬件被告知不要再中断处理器之后. 这个技术的缺点是你需要保持一个每设备的打开计数,以便于你知道什么时候中断可以被禁止. |
实现一个中断处理
irqreturn_t short_interrupt(int irq, void *dev_id)中断函数有一些处理上的限制。
{
return IRQ_HANDLED;
}
- 不能传递数据到或者从用户空间, 因为它不在进程上下文执行.
- 不能做任何可能睡眠的事情, 例如调用 wait_event, 使用除 GFP_ATOMIC 之外任何东西来分配内存, 或者加锁一个旗标.
- 不能调用调度(schedue).
- 尽量在短时间内完成。 如果需要长时间,最好使用tasklet 或者 workqueue 来调度。
- 清除"中断挂起"位
- 唤醒睡眠在设备上的进程。
使能和禁止中断
中断处理函数当持有一个自旋锁来避免死锁系统时,中断必须被阻塞,否则造成中断处理函数的并发死锁。
如果 disable_irq 被连续调用 2 次, 需要 2 个 enable_irq 调用使能
若调用 disable_irq 的线程持有中断处理需要的任何资源(例如自旋锁), 系统可能死锁. disable_irq_nosync 与 disable_irq 不同, 它立刻返回. |
|