8

我正在处理 gpio 中断。我在“/sys/class/gpio/gpio38/value”中有一个文件。每当属性值发生变化时,我都想要一个通知。那么我怎样才能在用户空间中实现这一点。由于我已经收集了信息,我可以使用 select()、poll() 或 epoll()。那么哪个对这个应用程序是正确的?或者请建议我是否可以使用 /proc/irq 或其他东西。谢谢 :)

4

2 回答 2

3

我在这里找到了一些可能有帮助的东西:

GPIO 信号的路径类似于 /sys/class/gpio/gpio42/(用于 GPIO #42),并具有以下读/写属性:

"value" ... 读取为 0(低)或 1(高)。如果 GPIO 配置为输出,则可以写入该值;任何非零值都被视为高。

如果引脚可以配置为产生中断的中断并且它已被配置为产生中断(参见“边缘”的描述),您可以对该文件进行 poll(2),并且 poll(2) 将在中断发生时返回触发。如果使用 poll(2),请设置事件 POLLPRI 和 POLLERR。如果使用 select(2),请在 exceptfds 中设置文件描述符。在 poll(2) 返回后,lseek(2) 到 sysfs 文件的开头并读取新值或关闭文件并重新打开以读取值。

虽然它说它适用于“gpio42”,但我猜这可能适用于您的情况。如果没有,请在我的回答中发表评论。

于 2012-09-22T08:05:40.087 回答
1

你可以使用它们中的任何一个。这里的重点是您打开 sysfs 文件以获取 GPIO 线的值(例如/sys/class/gpio/gpio42/value,然后阻止它。

线路状态的变化被表示为异常条件而不是写入(可能是直观的)。

在选择的情况下:

fd_set exceptfds;
int    res;    

FD_ZERO(&exceptfds);
FD_SET(gpioFileDesc, &exceptfds);

res = select(gpioFileDesc+1, 
             NULL,               // readfds - not needed
             NULL,               // writefds - not needed
             &exceptfds,
             NULL);              // timeout (never)

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds))
{
     // GPIO line changed
}
于 2012-09-23T19:07:52.830 回答