2012-09-22 11 views
8

Pracuję z przerwaniami gpio. Mam plik w "/ sys/class/gpio/gpio38/value". Chcę otrzymywać powiadomienia o każdej zmianie wartości atrybutu o wartości. Jak mogę to osiągnąć w przestrzeni użytkownika? Jak już zebrałem informacje, mogę użyć select(), poll() lub epoll(). Co jest poprawne dla tej aplikacji? Lub proszę zasugeruj mi, czy mogę użyć/proc/irq lub coś takiego. Dzięki :)select(), poll() lub epoll()? dla atrybutu sysfs

Odpowiedz

2

Znalazłem coś here, które mogą być pomocne:

sygnały GPIO mają ścieżki jak/sys/class/GPIO/gpio42/(dla GPIO # 42) i mają następujące lektury/write attributes:

"wartość" ... odczytuje jako 0 (niska) lub 1 (wysoka). Jeśli GPIO jest skonfigurowany jako wyjście, ta wartość może być zapisana; każda niezerowa wartość jest traktowana jako wysoka.

Jeśli pin może być skonfigurowany jako przerwaniami generowania przerwań i jeśli został skonfigurowany do generowania przerwań (patrz opis „krawędzi” ), można sondować (2) na tym pliku i ankiecie (2) powróci po każdym wywołaniu przerwania. Jeśli użyjesz funkcji poll (2), ustaw zdarzenia POLLPRI i POLLERR. Jeśli użyjesz select (2), ustaw deskryptor pliku w exceptfds. Po ankieta (2) zwraca, lseek (2) na początku pliku sysfs i odczytać nową wartość lub zamknąć plik i ponownie otworzyć go , aby odczytać wartość.

Chociaż mówi się, że jest to "gpio42", zgaduję, że może to dotyczyć twojego przypadku. Jeśli nie, zrób komentarz w mojej odpowiedzi.

+0

dzięki @ tony-the-lwa, oznacza to mam do sondowania dla pliku krawędzi lub pliku wartości –

1

Możesz użyć dowolnego z nich. Chodzi o to, że po otwarciu pliku sysfs dla wartości linii GPIO (np /sys/class/gpio/gpio42/value a następnie zablokować go.

Zmiany stanu linii sygnalizowane są jako warunek raczej wyjątek niż zapisu (jak mogłoby być intuicyjne).

W przypadku Wybierz:

fd_set exceptfds; 
int res;  

FD_ZERO(&exceptfds); 
FD_SET(gpioFileDesc, &exceptfds); 

res = select(gpioFileDesc+1, 
      NULL,    // readfds - not needed 
      NULL,    // writefds - not needed 
      &exceptfds, 
      NULL);    // timeout (never) 

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds)) 
{ 
    // GPIO line changed 
} 
+1

Należy pamiętać, że nie wszystkie GPIOs są przerwaniami zdolny Jeżeli GPIO?. z którymi pracujesz nie obsługuje przerwań (zależy to od używanego procesora/SoC), będziesz musiał przeczytać go okresowo y. – duskwuff

+0

Nie ma wątpliwości, że jest to prawdą - szczególnie, gdy linia GPIO jest zaimplementowana z peryferyjnym lub audio kodekiem I2C. Jednak w takim przypadku nigdy nie wywołasz na nich opcji 'select()' 'pselect()', 'poll()' lub 'epoll()'. ['poll()' i jego bracia, w rzeczywistości nie sondujcie] – marko

+0

Witam @Marko Dziękuję bardzo za odpowiedź. Czy możesz podać mi przykładowy kod do wyboru, o którym wspomniałeś powyżej? tak naprawdę robię, kiedy robię echo 1> nazwa_pliku, wtedy powinno się wydrukować powiadomienie. Będzie to bardzo pomocne. –

Powiązane problemy