如何在Linux用户空间中处理类似GPIO中断的处理

时间:2019-05-16 10:38:21

标签: c++ linux gpio

不确定我是否应该在此处发布此信息,但我必须要问。

上下文:

  • 嵌入式平台上的Linux(CPU @〜500MHz)
  • 一个团队研究单一用户空间软件
  • 一个团队致力于Linux +驱动程序+ uboot等。

该软件必须处理GPIO,一些输出(在需要时写入),一些输入(在某些情况下需要读取,其他情况下最好像中断一样)。

该软件是一个多线程应用,在SCHED_FIFO调度策略中具有约10-15个线程。

比方说,我有一个名为WGPIO的模块,它是处理GPIO的包装器。 (这是由Linux团队btw开发的。WGPIO仍在用户空间中,但是他们可以根据需要开发驱动程序)

这是我们所说的设计的伪代码。

gpio_state state = ON;
// IO_O is output. Set to ON, don't care if it's active_high or active_low btw
WGPIO_WriteOutput(IO_O,state);

// IO_I is input, read when needed
WGPIO_ReadInput(IO_I,&state);

// register callback when rising edge occurs on IO named IO_IT
WGPIO_SetCallback(IO_IT,EDGE_RISING,my_callback);
// Unmask to enable further IT-like processing
WGPIO_UnmaskIRQ(IO_IT);

我必须能够在5到10毫秒内处理一些GPIO更改。

是否在多个FD上进行了一些用户空间轮询(WGPIO将具有SCHED_FIFO线程),足以模拟我的应用程序中的“类似中断”的处理?这看起来是最简单的想法。

如果您需要更多详细信息,请随时询问。 提前致谢。

1 个答案:

答案 0 :(得分:2)

来自kernel gpio/sysgs.txt

"value" ... reads as either 0 (low) or 1 (high). If the GPIO
  is configured as an output, this value may be written;
  any nonzero value is treated as high.

  If the pin can be configured as interrupt-generating interrupt
  and if it has been configured to generate interrupts (see the
  description of "edge"), you can poll(2) on that file and
  poll(2) will return whenever the interrupt was triggered. If
  you use poll(2), set the events POLLPRI and POLLERR. If you
  use select(2), set the file descriptor in exceptfds. After
  poll(2) returns, either lseek(2) to the beginning of the sysfs
  file and read the new value or close the file and re-open it
  to read the value.

"edge" ... reads as either "none", "rising", "falling", or
  "both". Write these strings to select the signal edge(s)
  that will make poll(2) on the "value" file return.

  This file exists only if the pin can be configured as an
  interrupt generating input pin.

首选方法通常是在/sys/class/gpio/gpioN/edge上为poll(2)POLLPRI | POLLERR/sys/class/gpio/gpioN/value配置中断(重要的是 not POLLIN!) 。如果您的流程是一些需要实时处理事件的“实时”流程,请考虑降低其美观程度。

您甚至可以在github上找到一些使用民意测验的示例代码。 this repo