用户态使用gpio监听中断

来源:互联网 发布:直播网络说唱歌曲大全 编辑:程序博客网 时间:2024/06/06 10:06

比如我想监听PA7上的电平变化(也就是边沿触发),那么应该先向“/sys/class/gpio/gpio7/direction”写入“in”,然后向“/sys/class/gpio/gpio7/edge”写入“both”,然后对”/sys/class/gpio/gpio7/value”执行select/poll操作。

代码如下:

poll_test.c

#include <stdio.h>#include <fcntl.h>#include <poll.h>#include <unistd.h>int main(){    int fd=open("/sys/class/gpio/gpio7/value",O_RDONLY);    if(fd<0)    {        perror("open '/sys/class/gpio/gpio7/value' failed!\n");          return -1;    }    struct pollfd fds[1];    fds[0].fd=fd;    fds[0].events=POLLPRI;    while(1)    {        if(poll(fds,1,0)==-1)        {            perror("poll failed!\n");            return -1;        }        if(fds[0].revents&POLLPRI)        {            if(lseek(fd,0,SEEK_SET)==-1)            {                perror("lseek failed!\n");                return -1;            }            char buffer[16];            int len;            if((len=read(fd,buffer,sizeof(buffer)))==-1)            {                perror("read failed!\n");                return -1;            }            buffer[len]=0;            printf("%s",buffer);        }    }    return 0;}

这个小程序的作用就是就是不断poll(“/sys/class/gpio/gpio7/value”)。一旦poll()返回,就输出PA7的值。

假设代码放在~目录下,然后输入如下命令:

cd ~gcc poll_test.c -o poll_testecho in > /sys/class/gpio/gpio7/directionecho both > /sys/class/gpio/gpio7/edge./poll_test

用1K电阻把PA7上拉到VCC,然后用一根导线把PA7与GND连接又断开,会发现不断输出1和0(当PA7连上GND的瞬间输出0,与GND断开的瞬间输出1)。说明poll()确实能检测到电平变化。