Linux sysfs GPIO:什么重新武装中断? [英] Linux sysfs gpio: what re-arms interrupt?
本文介绍了Linux sysfs GPIO:什么重新武装中断?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
响应边沿触发的GPIO中断的常用方法是使用旧的sysfs GPIO接口,如下所示:
repeat forever
poll() on POLLPRI event on GPIO fd
lseek() back to 0 on GPIO fd
read() current state from GPIO fd
如果我将实际处理中断的代码放在read()
之后,是否保证在再次调用poll()
之前发生的任何新中断都会导致下一个poll()
立即返回?换句话说,是什么步骤重新武装了中断?从poll()
返回、调用lseek()
、调用read()
还是下一次调用poll()
?如果这是最后一个中断,我看不到任何方法来保证中断不会丢失。
还有,有必要做read()
吗?我不关心国家,只关心边缘事件。如果我不需要read()
,lseek()
有什么用吗?这在现实生活中很难测试,因为它需要在现有硬件上快速连续地生成中断。这些文档似乎都没有解释这一点。
推荐答案
我最近一直在使用sysFS,这段代码对我有帮助:
int main() {
struct pollfd myPollfd;
myPollfd.fd = open("/sys/class/gpio/GPIO_IN_WHEEL1/value", O_RDONLY); //store filedescriptor in struct, open(path, read-write-permission)
myPollfd.events = POLLPRI;
while (1) {
poll(&myPollfd, 1, -1); //poll(struct pollfd, max fd, timeout), timeout=-1 --> never
if(myPollfd.revents & POLLPRI) {
len = read(myPollfd.fd, buf, BUF_SIZE); //mandatory to make system register interrupt as served
printf("interrupt!
",);
}
lseek(myPollfd.fd, 0, 0); //return cursor to beginning of file or next read() will return EOF
}
close(myPollfd.fd);
return 0;
}
根据sysfs手册,是读操作使中断注册为已服务,因此为了响应下一个中断,必须在端点上调用Read(),即使端点本身的内容没有意义。
遗憾的是,我目前找不到上述文档,但如果我正确理解了您的问题,您需要知道的是,在第一次调用Read()和第一次调用Read()之间发生的所有中断都将丢失。
这篇关于Linux sysfs GPIO:什么重新武装中断?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文