Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: uClinux: poll() для char-устройства.
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
RCray
Я хочу, чтобы работающий поток не блокировался на время ожидания данных от char-устройства (на Blackfin у меня в данном случае это sport0). Надеюсь я правильно выразился.

Для этого согласно описанию на драйвера устройств - http://docs.blackfin.uclinux.org/doku.php?id=select_and_poll - я использую функцию poll().

Код
    sport0fd = open("/dev/sport0", O_RDWR, 0);
    if (!sport0fd)
    {
        perror("Failed open sport0.\n");
        exit(-1);        
    }

    fds[0].fd = sport0fd;
    fds[0].events = POLLIN;

    pollresult = poll(&fds[0], 1, ACK_TIMEOUT_20MS);
    switch (pollresult)
    {
    case 0:
        printf("timeout.\n");
        errors.err_register |= ERR_TIMEOUT;
        break;
    case -1:
        perror("poll() error.\n");
        exit(-1);
    default:
        if ( fds[0].revents & POLLIN )
        {
            printf("read.\n");
            *size = read(fds[0].fd, buf, sizeof(buf));            
        }    
    }


На sport0 я никаких данных в данный момент не передаю. Т.е. взяться им неоткуда. Так вот оказывается, что я всё-равно попадаю в ветку if (revents & POLLIN). Но данные функцией read() вычитать не могу (оно и понятно данных ведь нет). И поток благополучно блокируется.

или POLLIN всего лишь означает, что "я могу считать данные из устройства, заданного таким-то дескриптором" - "POLLIN = Set when normal data can be read without blocking".

Пробовал установить свойство дескриптора sport0, как O_NONBLOCK:
Код

    if( fcntl(fds[0].fd, F_SETFL, O_NONBLOCK) != 0)
        perror("Fcntl -- could not set nonblocking\n");


не помогло.

В какую сторону копать? Спасибо.
RCray
Буду копать в сторону создания двух потоков и функций pthread_cond_signal() и pthread_cond_wait(), т.к. функция poll'инга в драйвере sport не реализована. А драйвер менять не хочется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.