我正在使用運行Yocto的嵌入式處理器。我有一個修改uio_pdrv_genirq.c UIO驅動程序。使用select()檢測UIO設備文件上的塊
我在寫一個庫來控制DMA。有一個函數寫入設備文件並啓動DMA。第二個功能是通過調用select()來等待DMA完成。當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;
}
}
我的代碼有什麼明顯的錯誤嗎?或者任何人都可以提出一個替代選擇?
經過進一步的調查發現,如果我之後包含'read()','select()'將按預期工作。我已經確認它是在這種情況下通過計時兩個函數而被阻塞的'select()'調用。難道是因爲當我只調用'select()'時,編譯器意識到我從來沒有實際執行'read()'並優化'select()'out? –