经过大量挖掘后,我发现了下面的代码,并且非常适合我。
处理来自 GPIO 的中断
在许多情况下,GPIO 输入可配置为在以下情况下生成中断:
更改状态,这允许您等待中断而不是轮询
低效的软件循环。如果GPIO位可以产生中断,则文件边沿
存在。最初,它的值为 none ,这意味着它不会生成中断。
要启用中断,您可以将其设置为以下值之一:
• 上升:上升沿中断
• 下降:下降沿中断
• 两者:上升沿和下降沿均中断
• 无:无中断(默认)
您可以使用 poll() 函数以 POLLPRI 作为事件来等待中断。如果
如果您想等待 GPIO 48 上的上升沿,请首先启用中断:
#echo 48 > /sys/class/gpio/export
#echo 上升 > /sys/class/gpio/gpio48/edge
然后,您使用 poll() 等待更改,如以下代码示例所示:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <poll.h>>
int main(void) {
int f;
struct pollfd poll_fds [1];
int ret;
char value[4];
int n;
f = open("/sys/class/gpio/gpio48", O_RDONLY);
if (f == -1) {
perror("Can't open gpio48");
return 1;
}
poll_fds[0].fd = f;
poll_fds[0].events = POLLPRI | POLLERR;
while (1) {
printf("Waiting\n");
ret = poll(poll_fds, 1, -1);
if (ret > 0) {
n = read(f, &value, sizeof(value));
printf("Button pressed: read %d bytes, value=%c\n", n, value[0]);
}
}
return 0;
}