Nios® V プロセッサー・ソフトウェア開発者ハンドブック

ID 743810
日付 7/08/2024
Public
ドキュメント目次

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 */ }