处理许多Gpio中断C ++ Linux

时间:2014-05-29 09:47:34

标签: 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;

}

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

谢谢你们

1 个答案:

答案 0 :(得分:0)

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