我正在使用gpio中断。我在“/ sys / class / gpio / gpio38 / value”中有一个文件。只要属性值发生更改,我就会收到通知。那么我怎样才能在用户空间中实现这一点。由于我已经收集了信息,我可以使用select(),poll()或epoll()。那么这个应用哪个是正确的?或者请建议我,如果我可以使用/ proc / irq或其他东西。谢谢:))
答案 0 :(得分:3)
我找到了一些可能有帮助的here:
GPIO信号的路径类似于/ sys / class / gpio / gpio42 /(对于GPIO#42) 并具有以下读/写属性:
“value”...读为0(低)或1(高)。如果是GPIO 配置为输出,可以写入该值; 任何非零值都被视为高。
如果引脚可以配置为产生中断的中断 如果它已配置为生成中断(请参阅 “edge”的描述,你可以在那个文件上轮询(2)和 每当触发中断时,poll(2)将返回。如果 你使用poll(2),设置事件POLLPRI和POLLERR。如果你 使用select(2),在exceptfds中设置文件描述符。后 poll(2)返回lseek(2)到sysfs的开头 文件并读取新值或关闭文件并重新打开它 阅读价值。
虽然它说的是“gpio42”,但我猜这可能适用于你的情况。如果没有,请在我的回答中发表评论。
答案 1 :(得分: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
}