c++ - 处理许多 GPIO 中断 C++ Linux

标签 c++ linux gpio

我遇到了中断问题。我正在开发一个应用程序,该应用程序必须通过中断来处理许多按钮。我正在使用这个程序来处理一个:

int main(){
 gpio_export(gpio);
 gpio_set_dir(gpio, 0);
 gpio_set_edge(gpio, "falling");
 gpio_fd = gpio_fd_open(gpio);
timeout = POLL_TIMEOUT;


while (1) {
    memset((void*)fdset, 0, sizeof(fdset));

    fdset[0].fd = STDIN_FILENO;
    fdset[0].events = POLLIN;

    fdset[1].fd = gpio_fd;
    fdset[1].events = POLLPRI;

    rc = poll(fdset, nfds, timeout);


    if (rc < 0) {
        printf("\npoll() failed!\n");
        return -1;
    }

    if (rc == 0) {
        printf(".");
    }

    if (fdset[1].revents & POLLPRI) {
        len = read(fdset[1].fd, buf, MAX_BUF);
        printf("\npoll() GPIO %d interrupt occurred\n", gpio);
    }


    if (fdset[0].revents & POLLIN) {
        (void)read(fdset[0].fd, buf, 1);
        printf("POLLIN");
        //printf("\npoll() stdin read 0x%2.2X\n", (unsigned int) buf[0]);
    }


    fflush(stdout);
}

gpio_fd_close(gpio_fd);
gpio_fd_close(gpio_fd2);
return 0;

}

它工作得很好,我的问题是我想做的是处理更多的中断,所以我尝试的是这样的:

while (1) {
    memset((void*)fdset, 0, sizeof(fdset));

    fdset[0].fd = STDIN_FILENO;
    fdset[0].events = POLLIN;

    fdset[1].fd = gpio_fd;
    fdset[1].events = POLLPRI;

    rc = poll(fdset, nfds, timeout);

    memset((void*)fdset2, 0, sizeof(fdset2));

    fdset2[0].fd = STDIN_FILENO;
    fdset2[0].events = POLLIN;

    fdset2[1].fd = gpio_fd2;
    fdset2[1].events = POLLPRI;

    rc2 = poll(fdset2, nfds, timeout);

    if (rc < 0 || rc2 < 0) {
        printf("\npoll() failed!\n");
        return -1;
    }

    if (rc == 0 || rc2==0) {
        printf(".");
    }

    if (fdset[1].revents & POLLPRI) {
        len = read(fdset[1].fd, buf, MAX_BUF);
        printf("\npoll() GPIO %d interrupt occurred\n", gpio);
    }
    if (fdset2[1].revents & POLLPRI) {
        len = read(fdset2[1].fd, buf, MAX_BUF);
        printf("\npoll() GPIO %d interrupt occurred\n", gpio2);
    }

    if (fdset[0].revents & POLLIN) {
        (void)read(fdset[0].fd, buf, 1);
        printf("POLLIN");
        //printf("\npoll() stdin read 0x%2.2X\n", (unsigned int) buf[0]);
    }

    if (fdset2[0].revents & POLLIN) {
        (void)read(fdset2[0].fd, buf, 1);
        printf("POLLIN");
                //printf("\npoll() stdin read 0x%2.2X\n", (unsigned int) buf[0]);
    }

    fflush(stdout);
}

gpio_fd_close(gpio_fd);
gpio_fd_close(gpio_fd2);
return 0;

}

基本上我尝试处理同一程序中的两个中断,但是当我按下任何按钮时什么也没有发生。我能做什么呢?我应该使用线程吗?

谢谢大家

最佳答案

在调用 poll 之前,您必须合并 fdset-s。基本上,程序在第一个轮询调用时等待,而不是并行等待第一个和第二个调用。因此,您可以使用线程或对所有 fdset-s 调用一次轮询。

关于c++ - 处理许多 GPIO 中断 C++ Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23930423/

相关文章:

c++ - 在包含 OR 运算的 IF 语句中首先计算哪个 bool 表达式?

c++ - 将 csv 文件的一行拆分为 std::vector?

linux - 我的 shell 脚本中的 URL 中断

function - 什么是 Linux 中的 outb() 函数调用?

python - 使用Python从MCP23017获取信息

c++ - 在 C++ 中迭代 map<boost::tuple<int, string>, int>

c++ - 部署带有标识的Qt程序加载

python - gmate 错误 - 尝试打开 gmate 时没有名为 gconf 的模块

mysql - 在 Laravel 中使用 key 环