Опрос не возвращается, даже если есть изменения в GPIO FD
Я пытаюсь прочитать значение GPIO, используя каждый раз, когда он меняет состояние.
/sys/class/gpio/gpio499/value
Я поставил /sys/class/gpio/gpio499/edge
быть одновременно
Я пытаюсь отслеживать изменение значения с помощью команды опроса в одном отдельном потоке. Вот фрагмент кода:
void PIN_gpio_poll(size_t gpio) //GPIO 499
{
char path[30];
char cValue;
int fd;
int ret_poll;
int ret_read;
struct pollfd pollfd;
int i;
pollfd.events = POLLPRI | POLLERR; /* look for GPIO status change. */
snprintf(path, 30, PHDRIVER_LINUX_CFG_DIR "/gpio%u/value", gpio);
fd = open(path, O_RDONLY);
if (fd == -1)
{
printf("Gpio_poll _ERROR\r\n");
}
pollfd.fd = fd;
ret_read = read(pollfd.fd, &cValue, 1); // Dummy Read to clear
while (1)
{
lseek(fd, 0, SEEK_SET);
ret_read = read(fd, &cValue, 1);
printf("Value=%c, RET READ=%d\n",cValue,ret_read);
// ret_poll = poll( &pollfd, 1, -1 );
ret_poll = poll( &pollfd, 1, 10000 ); //10sec timeout
printf("******REVENTS=%x\n",pollfd.revents);
if( ret_poll == -1 )
{
printf("Gpio_poll poll failed\r\n");
close(fd);
}else{
// if (pollfd.revents & POLLPRI )
{
lseek(fd, 0, SEEK_SET);
ret_read = read(pollfd.fd, &cValue, 1);
if(ret_read > 0)
{
printf("Cvalue = %c\n",cValue);
}
}
}
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что, если я установлю события как POLLIN, опрос немедленно возобновится. Это понятно, потому что всегда есть данные, которые нужно прочитать в GPIO со значением (0 или 1). Я сослался на https://www.kernel.org/doc/Documentation/gpio/sysfs.txt и установил события как POLLPRI | POLLERR . Но в этом методе опрос возвращается только после тайм-аута. Не возвращается при изменении значения GPIO. Есть что-нибудь, что я пропускаю здесь? Я также установил /sys/class/gpio/gpio499/edge
подниматься, падать, но, кажется, ничего не работает.
РЕДАКТИРОВАТЬ: Вот вывод grep -r . /sys/class/gpio/gpio499
/sys/class/gpio/gpio499/edge:both
/sys/class/gpio/gpio499/power/control:auto
/sys/class/gpio/gpio499/power/runtime_active_time:0
grep: /sys/class/gpio/gpio499/power/autosuspend_delay_ms: Input/output error
/sys/class/gpio/gpio499/power/runtime_status:unsupported
/sys/class/gpio/gpio499/power/runtime_suspended_time:0
/sys/class/gpio/gpio499/value:1
/sys/class/gpio/gpio499/active_low:0
/sys/class/gpio/gpio499/direction:in
Примечание: я хочу определить значение от 1 до 0.
1 ответ
Функция: poll()
не работает, как ожидается, опубликованный код.
Предложить: 1) прочитать файл, чтобы получить текущее значение ввода. 2) выполнить спин-цикл, считывая значение, пока значение не изменится, аналогично:
readbytes = read( fd, &cValue, 1 );
while( readbytes > 0 )
{
if( (off_t)-1 == lseek(fd, 0, SEEK_SET) )
{ // then lseek failed
perror( "lseek failed" );
exit( EXIT_FAILURE );
}
// implied else, lseek successful
readbytes = read(fd, &new_cValue, 1);
if( 0 >= readbytes )
{
perror( "read failed" );
exit( EXIT_FAILURE );
}
// implied else, read successful
if( cValue != new_cValue )
{ // then state changed
cValue = new_cValue;
break;
}
}
Этот цикл сжигает больше циклов процессора, но должен работать