LINUX.ORG.RU

[embedded] поллинг файлового дескриптора

 


0

0

Приветствую,

на mips платформе работает линукс 2.6. От производителя чипа имеется библиотека для работы с gpio (открыть /dev/gpio, читать/писать пины). Понадобилось написать небольшое приложение для поллинга gpio, а точнее кнопки повешенной на пин.

Выбрал следующий классическйи подход:

int gpio_fd;
fd_set rfds;

gpio_fd = gpio_open("/dev/gpio");

while (1) {
    FD_ZERO(&rfds);
    FD_SET(gpio_fd, &rfds);

    if (select(gpio_fd + 1, &rfds, NULL, NULL, NULL) > 0) {
        if (FD_ISSET(gpio_fd, &rfds)) {
            /* read pins and similar ... */
        }
    }
}

Но проблема в том, что запущенная в фоне программа потребляет 98% CPU. Посмотрел в сорцы драйвера gpio, обнаружил что там не реализован 'poll'. Собственно меня интересует - намеренно ли этот метод не написали (IMHO ведь в отличии, например, от сокета, gpio файловый дескриптор всегда готов) или забыли, и мне стоит его допилить и тогда настанет счастье?

Будет признателен за советы.

★★

> намеренно ли этот метод не написали (IMHO ведь в отличии, например, от сокета, gpio файловый дескриптор всегда готов)

Похоже, намеренно - в данном случае poll тупо не имеет смысла.

мне стоит его допилить и тогда настанет счастье?

Тебе решать. Но счастье точно не настанет - любой poll, в который ты передашь этот дескриптор, мгновенно выродится в busy wait.

tailgunner ★★★★★
()
Ответ на: комментарий от xcreatepixmap

usleep (10000);

а что это даст в борьбе за процессор? И гдк имеено вы предлагаете разместить задержку?

cruz7 ★★
() автор топика
Ответ на: комментарий от tailgunner

Похоже, намеренно - в данном случае poll тупо не имеет смысла

а почему не имеет смысла, не поясните?

Но счастье точно не настанет - любой poll, в который ты передашь этот дескриптор, мгновенно выродится в busy wait.

но ведь есть масса сетевых приложений, использующих аналогичный подход: while(1) и в нем select, и процессор не грузят.

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

И гдк имеено вы предлагаете разместить задержку?

Внутри цикла опроса GPIO: проверил нажатость кнопки, уснул на 10 мс.

Begemoth ★★★★★
()
Ответ на: комментарий от cruz7

> но ведь есть масса сетевых приложений, использующих аналогичный подход: while(1) и в нем select, и процессор не грузят.

Потому что, как ты сам сказал:

в отличии, например, от сокета, gpio файловый дескриптор всегда готов

а сокет готов не всегда, поэтому приложение в основном спит.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.