0

我编写了一个函数来处理来自用户空间的自定义键盘的输入。我用“direction”(输入)和“edge”(上升)属性配置了 gpios。然后我的函数使用 poll 来获取文件描述符的中断:

    const unsigned int POLL_TIMEOUT = 3000;
    const unsigned int MAX_BUF = 64;
    struct pollfd fdset[6];
    int nfds = 6;
    int KEY_UP_fd, KEY_DOWN_fd, KEY_STOP_fd, KEY_LEFT_fd, KEY_RIGHT_fd, KEY_OK_fd;
    char *buf0[MAX_BUF], *buf1[MAX_BUF], *buf2[MAX_BUF],*buf3[MAX_BUF],*buf4[MAX_BUF],*buf5[MAX_BUF];
    int len,timeout, rc;

    KEY_UP_fd = gpio_fd_open(KEY_UP);
    KEY_DOWN_fd = gpio_fd_open(KEY_DOWN);
    KEY_STOP_fd = gpio_fd_open(KEY_STOP);
    KEY_EVAC_fd = gpio_fd_open(KEY_LEFT);
    KEY_CANCEL_fd = gpio_fd_open(KEY_RIGHT);
    KEY_OK_fd = gpio_fd_open(KEY_OK);

    timeout = POLL_TIMEOUT;


    while (1)
{

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

                fdset[0].fd = KEY_UP_fd;
                fdset[0].events = POLLPRI;

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

                fdset[2].fd = KEY_STOP_fd;
                fdset[2].events = POLLPRI;

                fdset[3].fd = KEY_LEFT_fd;
                fdset[3].events = POLLPRI;

                fdset[4].fd = KEY_RIGHT_fd;
                fdset[4].events = POLLPRI;

                fdset[5].fd = KEY_OK_fd;
                fdset[5].events = POLLPRI;

                rc = poll(fdset, nfds, timeout);

                if (rc < 0) {
                    printf("Error!");
                }

                if (fdset[0].revents & POLLPRI) {
                    lseek(fdset[0].fd, 0, SEEK_SET);
                    len = read(fdset[0].fd, buf0, MAX_BUF);
                }

                if (fdset[1].revents & POLLPRI) {
                    lseek(fdset[1].fd, 0, SEEK_SET);
                    len = read(fdset[1].fd, buf1, MAX_BUF);
                }

                if (fdset[2].revents & POLLPRI) {
                    lseek(fdset[2].fd, 0, SEEK_SET);
                    len = read(fdset[2].fd, buf2, MAX_BUF);
                                }

                if (fdset[3].revents & POLLPRI) {
                    lseek(fdset[3].fd, 0, SEEK_SET);
                    len = read(fdset[3].fd, buf3, MAX_BUF);
                                }

                if (fdset[4].revents & POLLPRI) {
                    lseek(fdset[4].fd, 0, SEEK_SET);
                    len = read(fdset[4].fd, buf4, MAX_BUF);
                                }

                if (fdset[5].revents & POLLPRI) {
                    lseek(fdset[5].fd, 0, SEEK_SET);
                    len = read(fdset[5].fd, buf5, MAX_BUF);
                                }
                fflush(stdout);

有没有办法在代码中添加去抖动功能?通常去抖动器使用“直接” gpio 读取,而不是中断,所以我现在不知道它是否可行。

4

1 回答 1

0

这在投票时对我有用。

static inline int microsleep(long micros)
{
    struct timespec ts = {0, micros * MICROS_PER_NANO};
    struct timespec remainder = {0, 0};

    int retval;

    while(1)
    {
        retval = nanosleep(&ts, &remainder);
        if (retval < 0)
        {
            if (errno == EINTR)
            {
                ts = remainder;
                errno = 0;
            }
            else
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    return retval;
}
于 2019-02-01T15:36:32.943 回答