如果内存地址的值已更改,则进行有效检测?

时间:2013-09-17 22:46:50

标签: linux linux-kernel embedded

这是一个普遍的问题。考虑外部设备。该设备有时会通过其设备驱动程序将数据写入特定的内存地址。我想写一个小C程序来读出这些数据。有没有比仅轮询此地址更好的方法来检查值是否已更改?我想保持CPU负载低。

我做了一些进一步的研究

“内存映射IO”是一个选项吗?我天真的想法是让外部设备将标志写入“内存映射IO” - 地址,触发内核设备驱动程序。然后,驱动程序“通知”程序继续执行该值。这可以吗?司机如何通知程序?

1 个答案:

答案 0 :(得分:1)

答案可能取决于您打算使用的处理器,设备是什么以及您使用的是操作系统还是RTOS。

内存映射I / O 本身不是一种解决方案,它只是指可以通过普通内存访问指令直接寻址的I / O设备寄存器。当某些寄存器更新或包含新的有效数据时,大多数器件都会产生中断。

通常,如果使用RTOS,您可以安排设备驱动程序通过合适的IPC机制发出需要处理数据的任何客户端线程的信号。如果您没有使用RTOS,您只需使用设备驱动程序注册回调,只要数据更新,它就会调用它。客户在回叫中所做的是其业务 - 包括阅读新数据。

如果有问题的设备产生中断,则可以在中断时进行处理,如果设备能够进行DMA,那么它可以在DMA控制器向处理程序生成DMA中断之前自主处理数据块。