gpt4 book ai didi

c - 使用 Poll() 中断 BeagleBone Black GPIO

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:24 26 4
gpt4 key购买 nike

我正在尝试使用 Poll() 函数让基于 GPIO 的中断在 BeagleBone GPIO 上工作。下面是我的代码,但简而言之:

虽然我将引脚接地,但没有任何反应(如预期)。

当我将引脚连接到高电平时,会生成一个中断。但是,它要么永远不会清除,要么会极快地再生。我实现了一个计数,当它变高时计数会增加,几秒钟后计数器就超过 10,000。我在我的设置中遗漏了什么吗?问题可能出在我的 main() 函数中,但为了完整性,我已经包含了其他函数。

感谢您的帮助,

查尔斯

#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define MAX_BUF 64

int gpio_export(unsigned int gpio)
{
int fd, len;
char buf[MAX_BUF];

fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY);
if (fd < 0) {
perror("gpio/export");
return fd;
}

len = snprintf(buf, sizeof(buf), "%d", gpio);
write(fd, buf, len);
close(fd);

return 0;
}

int gpio_set_dir(unsigned int gpio, unsigned int direction)
{
int fd, len;
char buf[MAX_BUF];

len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/direction", gpio);

fd = open(buf, O_WRONLY);
if (fd < 0) {
perror("gpio/direction");
return fd;
}

if (direction)
write(fd, "out", 4);
else
write(fd, "in", 3);

close(fd);
return 0;
}

int gpio_set_edge(unsigned int gpio, char *edge)
{
int fd, len;
char buf[MAX_BUF];

len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/edge", gpio);

fd = open(buf, O_WRONLY);
if (fd < 0) {
perror("gpio/set-edge");
return fd;
}

write(fd, edge, strlen(edge) + 1);
close(fd);
return 0;
}

int gpio_fd_open(unsigned int gpio)
{
int fd, len;
char buf[MAX_BUF];

len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);

fd = open(buf, O_RDONLY | O_NONBLOCK );
if (fd < 0) {
perror("gpio/fd_open");
}
return fd;
}

int gpio_fd_close(int fd)
{
return close(fd);
}

int main()
{
struct pollfd fdset;
int nfds = 1;
int gpio_fd, timeout, rc;
char *buf[MAX_BUF];
unsigned int gpio;
int len;
char* c;


gpio = 26;

gpio_export(gpio);
gpio_set_dir(gpio, 0);
gpio_set_edge(gpio, "rising");
gpio_fd = gpio_fd_open(gpio);

timeout = 1;

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

fdset.fd = gpio_fd;
fdset.events = POLLPRI | POLLERR;

len = read(fdset.fd, c, 1);

rc = poll(&fdset, nfds, timeout);

//printf("POLLPRI is %02x, POLLERR is %02x\r\n", POLLPRI, POLLERR);

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

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

if (fdset.revents & POLLPRI) {
if (len==-1)
{
printf("Hex of revents is %02x, return code is %02x\r\n", fdset.revents, rc);
}
len = read(fdset.fd, buf, MAX_BUF);
}

if (fdset.revents & POLLERR)
{
printf("errno: %d", errno);
}
}

gpio_fd_close(gpio_fd);
return 0;
}

最佳答案

我在 BeagleBone Black 上重新安装了 Debian 镜像,它现在可以正常工作了。我不确定它之前为什么不工作,但看起来是操作系统问题。

关于c - 使用 Poll() 中断 BeagleBone Black GPIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529487/

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