gpt4 book ai didi

c - 轮询和去抖动 GPIO (posix)

转载 作者:行者123 更新时间:2023-11-30 16:43:49 26 4
gpt4 key购买 nike

我编写了一个函数来处理来自用户空间的自定义键盘的输入。我用“方向”(输入)和“边缘”(上升)属性配置了 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 读取,而不是中断,所以我现在不知道它是否可行。

最佳答案

这对我在投票时有用。

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;
}

关于c - 轮询和去抖动 GPIO (posix),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44966525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com