首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回两者,POLLPRI和POLLERR

返回两者,POLLPRI和POLLERR
EN

Stack Overflow用户
提问于 2014-12-10 21:21:00
回答 1查看 4.6K关注 0票数 5

我开始使用Linux和嵌入式系统(路由器、硬件和openwrt)进行C编程。我已经启用了对GPIOs的干预,使用了民意测验.差一点。

我可以使用poll(),如果我按下按钮触发中断,poll()返回值> 0。到目前一切尚好。现在,我尝试同时在几个GPIOs上使用poll(),因此需要分析每个潜在的中断源的流。尽管中断似乎有效,但我得到了POLLPRI和POLLERR,我不明白为什么。将pollfd结构减少到1条目不会改变任何事情。

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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似乎确实很奇怪,我不知道他们为什么选择这样做。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27411013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档