【发布时间】:2013-11-30 12:20:12
【问题描述】:
我正在开发一个 Linux 内核模块,该模块为来自定制板的中断注册回调,并将接收到的数据放入 char 设备接口后面的队列中,以供应用程序处理。该模块需要不断地监控和测量来自板子的中断和数据,即使板子没有中断,所以它还有一个根据时间触发的回调。
当前实现使用 RTC 中断作为恒定定时器源。我禁用内核 RTC 驱动程序 (CONFIG_RTC_DRV_CMOS) 并请求 IRQ 8 并将定时器回调挂钩为 RTC 中断处理程序。 RTC 芯片每秒都会产生中断。
问题是我们必须失去一些 Linux 以这种方式管理时间的能力,因为一次只能加载 rtc-cmos 或板模块中的一个(显然我们已经选择了板模块)。
目标架构是 i386 PC。
我不是内核开发人员,因此对内核模块开发没有全面的了解,但我正在努力寻找自己的方式,这些是我想到的最接近解决方案的事情:
- 以某种方式在两个模块之间共享 IRQ 8(可能像
request_irq(8, rtc_handler, IRQF_SHARED, rtc_handler)?)或链式加载 IRQ 处理程序。 - 寻找另一种方法将处理程序从内核模块挂钩到 RTC 中断,而不是注册 IRQ 8。
- 找到另一个可在内核模块中使用的 1 秒计时器事件来源,也许有一个标准的内核 API,我不知道。
我想可能有一种简单而标准的方法可以做到这一点,如果有人对这些解决方案中的任何一个发表评论或提出其他建议,我会很高兴。
【问题讨论】:
标签: linux linux-kernel linux-device-driver embedded-linux interrupt