1

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

我做了一些进一步的研究

“内存映射IO”是一种选择吗?我幼稚的想法是让外部设备将标志写入“内存映射 IO”地址,从而触发内核设备驱动程序。然后驱动程序“通知”程序执行该值。这能行吗?驱动程序如何通知程序?

4

1 回答 1

1

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

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

一般来说,如果使用 RTOS,您可以安排设备驱动程序通过合适的 IPC 机制向任何需要处理数据的客户端线程发出信号。如果您不使用 RTOS,您可以简单地向设备驱动程序注册一个回调,它会在数据更新时调用该回调。客户端在回调中所做的是它的业务——包括读取新数据。

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

于 2013-09-18T16:54:51.597 回答