реклама на сайте
подробности

 
 
> uClinux: poll() для char-устройства.
RCray
сообщение Apr 18 2008, 12:01
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 14-09-05
Из: Suwon
Пользователь №: 8 548



Я хочу, чтобы работающий поток не блокировался на время ожидания данных от 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");


не помогло.

В какую сторону копать? Спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 11:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01338 секунд с 7
ELECTRONIX ©2004-2016