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
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.
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
}
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
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
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. –
dzięki @ tony-the-lwa, oznacza to mam do sondowania dla pliku krawędzi lub pliku wartości –