我开始使用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
答案 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,我不确定他们为什么选择这样做。