Я работаю над встроенным процессором, работающим с Yocto. У меня есть модифицированный драйвер UIO uio_pdrv_genirq.c.Использование select() для обнаружения блока в файле устройства UIO
Я пишу библиотеку для управления DMA. Существует одна функция, которая записывает в файл устройства и инициирует DMA. Вторая функция предназначена для ожидания завершения DMA путем вызова select(). Пока выполняется DMA, блоки файлов устройства. По завершении контроллер DMA выдает прерывание, которое освобождает блок в файле устройства.
У меня есть система работает, как ожидалось, используя чтения(), но я хочу, чтобы переключиться на выберите() так, что я могу включать тайм-аут. Однако, когда я использую select(), он, кажется, не распознает блок и всегда возвращается сразу (до завершения DMA). Я включил простую версию кода:
int gannet_dma_interrupt_wait(dma_device_t *dma_device,
dma_direction dma_transfer_direction) {
fd_set rfds;
struct timeval timeout;
int select_res;
/* Initialize the file descriptor set and add the device file */
FD_ZERO(&rfds);
FD_SET(dma_device->fd, &rfds);
/* Set the timeout period. */
timeout.tv_sec = 5;
timeout.tv_usec = 0;
/* The device file will block until the DMA transfer has completed. */
select_res = select(FD_SETSIZE, &rfds, NULL, NULL, &timeout);
/* Reset the channel */
gannet_dma_reset(dma_device, dma_transfer_direction);
if (select_res == -1) {
/* Select has encountered an error */
perror("ERROR <Interrupt Select Failed>\n");
exit(0);
}
else if (select_res == 1) {
/* The device file descriptor block released */
return 0;
}
else {
/* The device file descriptor block exceeded timeout */
return EINTR;
}
}
Есть ли что-то явно не так с моим кодом? Или может кто-нибудь предложить альтернативу для выбора?
После дальнейшего исследования выясняется, что 'select()' будет функционировать должным образом, если я включу 'read()' впоследствии. Я подтвердил, что это вызов 'select()', который блокирует по времени обе функции в этом случае. Может быть, когда я только вызываю 'select()' компилятор понимает, что я никогда не делаю 'read()' и не оптимизирует 'select()' out? –