私はYoctoを実行する組み込みプロセッサで作業しています。私は変更されたuio_pdrv_genirq.c UIOドライバを持っています。select()を使用してUIOデバイスファイルのブロックを検出する
私はDMAを制御するライブラリを作成しています。デバイスファイルに書き込み、DMAを開始する関数が1つあります。第2の機能は、()を呼び出すことによって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()'を最適化することはできません。 –