2013-12-13 2 views
3

Я пытаюсь обнаружить, когда штырь gpio идет от низкого к высокому, и у меня проблемы. Из того, что я прочитал, я должен быть в состоянии настроить булавку в качестве входных данных таким образом:beaglebone черный gpio select не работает

# echo in > /sys/class/gpio/gpio51/direction 
# echo rising > /sys/class/gpio/gpio51/edge 

Далее я пытаюсь запустить программы, которую программу ожидает нарастающий фронт с помощью выбора. Код выглядит следующим образом (обратите внимание, я закомментирована попытку просто прочитать файл, так как чтение предполагается блокировать, если не установлен O_NONBLOCK):

#include<stdio.h>                                         
#include<fcntl.h>                                         
#include <sys/select.h>                                       


int main(void) {                                         
    int fd = open("/sys/class/gpio/gpio51/value", O_RDONLY & ~O_NONBLOCK);                           
    //int fd = open("/sys/class/gpio/gpio51/value", O_RDONLY | O_NONBLOCK);                           
    //unsigned char buf[2];                                       
    //int x = read(fd, &buf, 2);                                     
    //printf("%d %d: %s\n", fd, x, buf);                                   
    fd_set exceptfds;                                        
    int res;                                          

    FD_ZERO(&exceptfds);                                       
    FD_SET(fd, &exceptfds);                                       
    //printf("waiting for %d: %s\n", exceptfds);                                 
    res = select(fd+1,                                        
       NULL,    // readfds - not needed                              
       NULL,    // writefds - not needed                              
       &exceptfds,                                      
       NULL);    // timeout (never)                                

    if (res > 0 && FD_ISSET(fd, &exceptfds)) {                                  
    printf("finished\n");                                       
    }                                            
    return 0;                                          
} 

программа не выходит сразу, независимо от того, в каком состоянии штифт (высокий или низкий). Может ли кто-нибудь увидеть что-то не так с тем, как я это делаю?

PS. У меня есть библиотека python, которая использует poll(), чтобы сделать именно это, и python работает так, как ожидалось. Я вытаскиваю штырь низко, вызываю python, он блокирует, тянет пинкер высоко и код продолжается. Поэтому я не думаю, что это проблема с драйвером linux gpio.

https://bitbucket.org/cswank/gadgets/src/590504d4a30b8a83143e06c44b1c32207339c097/gadgets/io/poller.py?at=master

ответ

4

Я понял это. Вы должны прочитать из дескриптора файла до того, как выйдет запрос выбора. Вот пример, который работает:

#include<stdio.h>                                                     
#include<fcntl.h>                                                     
#include <sys/select.h>                                                    

#define MAX_BUF 64                                                     

int main(void) {                                                     
    int len;                                                       
    char *buf[MAX_BUF];                                                    
    int fd = open("/sys/class/gpio/gpio51/value", O_RDONLY);                                           
    fd_set exceptfds;                                                     
    int res;                                                      

    FD_ZERO(&exceptfds);                                                    
    FD_SET(fd, &exceptfds);                                                   
    len = read(fd, buf, MAX_BUF); //won't work without this read.                                                 
    res = select(fd+1,                                                    
       NULL,    // readfds - not needed                                           
       NULL,    // writefds - not needed                                           
       &exceptfds,                                                   
       NULL);    // timeout (never)                                            

    if (res > 0 && FD_ISSET(fd, &exceptfds)) {                                              
    printf("finished\n");                                                   
    }                                                         
    return 0;                                                       
}                                                         
+1

Интересно, возможно ли это как-нибудь с помощью инструментов командной строки, таких как cat, tail, head, dd ... с некоторыми конкретными параметрами –

Смежные вопросы