как обнаружить смену выводов GPIO на плате Linux
Я использую ядро 3.12 на плате Linux на основе ARM (процессор imx233). Моя цель - обнаружить смену контактов GPIO (от 1 до 0).
Я могу прочитать значение вывода, постоянно вызывая функцию ниже (в цикле while (1))
int GPIO_read_value(int pin){
int gpio_value = 0;
char path[35] = {'\0'};
FILE *fp;
sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
//error
}
fscanf(fp, "%d", &gpio_value);
fclose(fp);
return gpio_value;
}
Но это вызывает слишком большую нагрузку на процессор. Я не пользуюсьusleep
или жеnanosleep
потому что замена булавки происходит в течение очень короткого времени, которое заставило бы меня пропустить событие.
Насколько я узнаю, невозможно использоватьpoll()
, Есть лиpoll()
Как функция, которую я могу использовать для обнаружения смены контактов GPIO?
РЕДАКТИРОВАТЬ: на всякий случай, если я делаю что-то не так, вот мойpoll()
использование, которое не обнаруживает смену штифта
struct pollfd pollfds;
int fd;
int nread, result;
pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
int timeout = 20000; /* Timeout in msec. */
char buffer[128];
if( pollfds.fd < 0 ){
printf(" failed to open gpio \n");
exit (1);
}
pollfds.events = POLLIN;
printf("fd opens..\n");
while (1)
{
result = poll (&pollfds, 0, timeout);
switch (result)
{
case 0:
printf ("timeout\n");
break;
case -1:
printf ("poll error \n");
exit (1);
default:
printf("something is happening..\n");
if (pollfds.revents & POLLIN)
{
nread = read (pollfds.fd, buffer, 8);
if (nread == 0) {
printf ("result:%d\n", nread);
exit (0);
} else {
buffer[nread] = 0;
printf ("read %d from gpio: %s", nread, buffer);
}
}
}
}
close(fd);
EDIT2: код наhttps://developer.ridgerun.com/wiki/index.php/Gpio-int-test.c отлично работает сpoll()
Мне нужно было определить нарастающий / падающий фронт для прерывания и немного исправить это определение. Это решает мою проблему, однако, для меня и некоторых других людей было бы хорошо услышать / узнать альтернативные методы.