Linux sysfs GPIO:什么重新武装中断? [英] Linux sysfs gpio: what re-arms interrupt?

查看:9
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆