poll()返回两者,POLLPRI& POLLERR

时间:2014-12-10 21:21:01

标签: c interrupt-handling openwrt

我开始使用Linux和嵌入式系统(路由器硬件和openwrt)进行C编程。我已经启用了GPIO的中断,使用民意调查工作......差不多。

我可以使用poll(),如果按下按钮触发中断,poll()将返回值>到目前为止一切顺利。现在我尝试在几个GPIO上同时使用poll(),因此想要分析每个潜在中断源的revents。虽然中断似乎有效,但我得到了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

1 个答案:

答案 0 :(得分:6)

我在http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/t/182883

找到了一些答案来暗示你的问题
  

我刚刚遇到你正在看的POLLERR。事实证明这是   所有sysfs文件的工作方式,以及您通过sysfs使用gpio   接口。

     

从sysfs GPIO内核文档:如果引脚可以配置为   中断生成中断,如果已配置为   生成中断(参见“edge”的描述),你可以轮询(2)   在该文件上,poll(2)将在中断时返回   触发。如果使用poll(2),请设置事件POLLPRI和POLLERR。   另外,如果你看一下fs / sysfs / file.c中的内核代码,   你会看到sysfs_poll返回DEFAULT_POLLMASK | POLLERR |   POLLPRI。

     

所有这一切,sysfs文件返回似乎很奇怪   POLLERR,我不确定他们为什么选择这样做。