インテルのみ表示可能 — GUID: wfy1641456123988
Ixiasoft
インテルのみ表示可能 — GUID: wfy1641456123988
Ixiasoft
4.4.3.2.2. ブロッキング I/O と非ブロッキング I/O
キャラクター・モード・デバイスは、ブロッキング・モードまたは非ブロッキング・モードで動作するようにコンフィグレーションできます。モードは、デバイスのファイル・ディスクリプターで指定することができます。
- ブロッキング・モードでは、デバイスから読み取る関数呼び出しは、デバイスが新しいデータを受信するまで待機します。
- 非ブロッキング・モードでは、新しいデータを読み出すための関数コールは、すぐに返され、新しいデータが受信されたかどうか通知します。
ファイルハンドルの読み取りに使用する関数によっては、新しいデータが到着したかどうかを示すエラーコードが返されます。
UART および JTAG UART コンポーネントはブロッキング・モードで初期化されます。ただし、以下に示すような open システムコールで、 fnctl() 関数または ioctl() 関数を使用して、各コンポーネントを非ブロッキング・モードに設定することができます。この open システムコールは、開いているデバイスが非ブロッキング・モードで機能することを指定しています。
fd = open ("/dev/<your uart name>", O_NONBLOCK | O_RDWR);
下の例に示す fnctl() システムコールは、既に開いているデバイスが非ブロッキング・モードで機能することを指定します。
UART および JTAG UART ペリフェラルの動作は、ioctl() 関数呼び出しを使用して変更することも可能です。ioctl() 関数は次のパラメーターをサポートしています。
- UART ペリフェラルの場合:
- TIOCMGET (UART のボーレートを報告)
- TIOCMSET (UARTのボーレートを設定)
- JTAG UART ペリフェラルの場合:
- TIOCSTIMEOUT (ワークステーションへの接続のタイムアウト値)
- TIOCGCONNECTED (ホストが接続されているかどうかを調べる)
altera_avalon_uart_driver.enable_ioctl BSP 設定は、UART ペリフェラルに向けて ioctl() 関数を無効にします。ioctl() 機能は、JTAG UART ペリフェラルに対して自動的に有効になります。
Ioctl() 関数は、altera_avalon_uart_driver.enable_small_driver および hal.enable_reduced_driver BSP 設定と互換性がありません。これらの設定のいずれかが有効になっている場合、ioctl() は実装されません。
fnctl() システム・コール
/* You can specify <file_descriptor> to be * STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO * if you are using STDIO */ fnctl(<file_descriptor>, F_SETFL, O_NONBLOCK
非ブロッキング・デバイスのコードの一部分
input_chars[128]; return_chars = scanf("%128s", &input_chars); if(return_chars == 0) { if(errno != EWOULDBLOCK) { /* check other errnos */ } } else { /* process received characters */ }