我开始使用Linux和嵌入式系统(路由器、硬件和openwrt)进行C编程。我已经启用了对GPIOs的干预,使用了民意测验.差一点。
我可以使用poll(),如果我按下按钮触发中断,poll()返回值> 0。到目前一切尚好。现在,我尝试同时在几个GPIOs上使用poll(),因此需要分析每个潜在的中断源的流。尽管中断似乎有效,但我得到了POLLPRI和POLLERR,我不明白为什么。将pollfd结构减少到1条目不会改变任何事情。
char value;
int fd_btn1 = open("/sys/class/gpio/gpio14/value", O_RDONLY);
int fd_left = open("/sys/class/gpio/gpio12/value", O_RDONLY);
int fd_right = open("/sys/class/gpio/gpio13/value", O_RDONLY);
struct pollfd fds[3];
fds[0].fd = fd_btn1;
fds[1].fd = fd_left;
fds[2].fd = fd_right;
fds[0].events = POLLPRI;
fds[1].events = POLLPRI;
fds[2].events = POLLPRI;
read(fd_btn1, &value, 1);
read(fd_left, &value, 1);
read(fd_right, &value, 1);
ret = poll(fds, 1, 10000);
//debugging purpose
printf("ret: %i - revents[0]: %i", ret, fds[0].revents);
按下按钮(中断触发):ret=1d,revents=10d
如果没有按下,两者都是0d。
发布于 2015-01-07 11:02:33
我找到了一些暗示你的问题的答案:processors/f/716/t/182883
我刚碰到了你也看到的那件事。事实证明,这就是所有sysfs文件的工作方式,您正在通过sysfs接口使用gpio。 从sysfs GPIO内核文档:如果可以将引脚配置为产生中断的中断,如果它已被配置为生成中断(请参阅“edge”的描述),您可以对该文件轮询(2),每当中断被触发时,轮询(2)将返回。如果使用轮询(2),则设置事件POLLPRI和POLLERR。另外,如果您查看fs/sysfs/file.c中的内核代码,您将看到sysfs_poll返回DEFAULT_POLLMASK \ POLLERR \ POLLPRI。 尽管如此,sysfs文件返回POLLERR似乎确实很奇怪,我不知道他们为什么选择这样做。
https://stackoverflow.com/questions/27411013
复制相似问题