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

ID 743810
日付 10/31/2022
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

インテルのみ表示可能 — GUID: wfy1641456123988

Ixiasoft

ドキュメント目次

3.4.3.2.2. I/Oのブロッキングとノン・ブロッキング

キャラクター・モード・デバイスは、ブロッキング・モードまたは非ブロッキング・モードで動作するようにコンフィグレーションできます。モードは、デバイスのファイル・ディスクリプターで指定されます。

  • ブロッキング・モードでは、デバイスから読み取る関数呼び出しは、デバイスが新しいデータを受信するまで待機します。
  • ノン・ブロッキング・モードでは、新しいデータを読み出すためのファンクション・コールは、すぐに返され、新しいデータが受信されたかどうか通知します。

ファイルハンドルの読み取りに使用する関数によっては、新しいデータが到着したかどうかを示すエラー コードが返されます。

UART および JTAG UART コンポーネントはブロッキング・モードで初期化されます。しかし、各コンポーネントでは、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 設定は、 ioctl() UART ペリフェラル用の関数。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 */
}