この章の目次にもどる
前頁:第9章 スクリーン(ディスプレイ)にもどる
次頁:第11章 ブザー(beep)にすすむ

第10章 コンソール

10.1 コンソールの概要

コンソールは、シリアルポートや仮想的なコンソールを経由して、 文字の入出力を標準的に行うための機構であり、 システム全体として以下の構成となる。

コンソールの全体構成
図 15 : コンソールの全体構成

コンソールドライバは、コンソールとしての機能を実現するドライバであり、 シリアル I/O ドライバは、実際のシリアルポートに対する入出力を行うためのドライバである。

アプリケーションは、 標準入出力ライブラリやコンソールライブラリを経由してコンソールドライバを使用することになり、 コンソールがシリアルポートに接続されているときは、 さらに、シリアル I/O ドライバが使用される。

アプリケーションが、通常のデバイスとして直接シリアルポートを使用するときは、 デバイス管理、RS232C ドライバを経由して、シリアル I/O ドライバが使用される。

コンソールは、一般のデバイスドライバとは異なった構造を持ち、 コンソール機能のための専用のシステムコール ( 拡張 SVC ) が用意されている。

10.2 コンソール

システムは複数のコンソールを持つことができ、 それぞれのコンソールは動的に生成され、 コンソールポート番号により識別される。

コンソールは、以下の属性を持つ。

10.3 コンソールポート番号

コンソールポート番号は 1〜 の番号であり、通常、システム立ち上げ時に、 以下のコンソールが生成される。

プロセスには、1 つのコンソールが割り当てられ、子プロセスに引き継がれる。 デフォールトでは、ポート番号 = 1 のデバッグ用コンソールが割り当てられるが、 このポート番号を変更して、別のコンソールを割り当てることができる。

標準入出力ライブラリでは、自プロセスに割り当てられたコンソールが対象となる。 ただし、非プロセスのタスクではポート番号 = 1 のデバッグ用コンソールが対象となる。

また、syslog() による出力も、ポート番号 = 1 のデバッグ用コンソールが対象となる。

10.4 データ定義

10.5 コンソールのシステムコール

コンソールを取り扱うための以下のサービスが拡張システムコールとして提供される。

console_in
 
コンソール入力

【形式】

    W   console_in(W port, B *buf, UW len)

【パラメータ】

portコンソールポート番号
buf 入力データバッファ
len 入力する最大データバイト長さ

【リターン値】

> 0実際に入力したバイト数
= 0 1 バイトも入力できなかった
= -1入力が中断された (入力モードが EDIT モードのときのみ)

【解説】

port で指定したコンソールから、最大 len バイトのデータを入力して、 buf に格納する。実際に入力したバイト数をリターン値として戻す。

指定したコンソールの入力モードにより以下の動作となる。

RAW モード のとき :
CANONICAL モード、または、EDIT モードで len == 1 のとき :
EDIT モードで len > 1 のとき :

【エラーコード】

なし

console_out
 
コンソール出力

【形式】

    ERR console_out(W port, B *buf, UW len)

【パラメータ】

portコンソールポート番号
buf 出力データバッファ
len 出力するデータバイト長さ

【リターン値】

> 0実際に出力したバイト数
= 0 1 バイトも出力できなかった

【解説】

port で指定したコンソールに、buf 内の len バイトのデータを出力して、実際に出力したバイト数をリターン値として戻す。

指定したコンソールに設定されている出力タイムアウト以内にデータを出力できなかったときは、 その時点でリターンする。

出力改行変換ありのときは、LF は CR、LF に変換して出力される。

【エラーコード】

なし

console_ctl
 
コンソール制御

【形式】

    W   console_ctl(W port, W req, W arg)

【パラメータ】

portコンソールポート番号
req コマンド
arg コマンドパラメータ

【リターン値】

任意取り出した現在の設定値
= 0 設定を行った
= -1 エラー

【解説】

port で指定したコンソールに対して、req で指定した以下の動作を行う。

  ECHO | GETCTL     現在の ECHO モードを取り出す。(arg は未使用)
  ECHO          arg を ECHO モードに設定する。
  INPUT | GETCTL    現在の INPUT モードを取り出す。(arg は未使用)
  INPUT         arg を INPUT モードに設定する。
  NEWLINE | GETCTL  現在の NEWLINE モードを取り出す。(arg は未使用)
  NEWLINE       arg を NEWLINE モードに設定する。
  FLOWC | GETCTL    現在の FLOWC モードを取り出す。(arg は未使用)
  FLOWC         arg を FLOWC モードに設定する。
  SNDTMO | GETCTL   現在の SNDTMO を取り出す。(arg は未使用)
  SNDTMO        arg を SNDTMO に設定する。(arg < 0 は -1)
  RCVTMO | GETCTL   現在の RCVTMO を取り出す。(arg は未使用)
  RCVTMO        arg を RCVTMO に設定する。(arg < 0 は -1)
  RCVBUFSZ | GETCTL 現在の RCVBUFSZ を取り出す。(arg は未使用)
  SNDBUFSZ | GETCTL 現在の SNDBUFSZ を取り出す。(arg は未使用)

【エラーコード】

なし

console_get
 
コンソールの出力データの読み込み

【形式】

    W   console_get(W port, B *buf, UW len, W tmout)

【パラメータ】

portコンソールポート番号
buf 読み込みデータバッファ
len 読み込み最大データバイト長さ
tmoutタイムアウト(ミリ秒)

【リターン値】

> 0実際に読み込んだバイト数
= 0 1 バイトも読み込みできなかった

【解説】

port で指定したバッファ I/O 種別のコンソールから、 最大 len バイト読み込んで、 buf に格納し、実際に読み込んたバイト数をリターン値として戻す。

読み込んだデータは、console_out() によって出力されたデータとなる。

コンソールの出力バッファが空になったとき、以下の動作となる。

tmout = 0 : 待たずにリターンする。
tmout = -1 : 出力バッファにデータがくるまで永久に待つ。
tmout > 0 : 出力バッファがデータがくるまで最大 tmout ミリ秒だけ待つ。

コンソールの種別がバッファ I/O でないときは何もせずに 0 を戻す。

【エラーコード】

なし

console_put
 
コンソールの入力データの書き込み

【形式】

    ERR console_put(W port, B *buf, UW len, W tmout)

【パラメータ】

portコンソールポート番号
buf 書き込みデータバッファ
len 書き込みデータバイト長さ
tmoutタイムアウト(ミリ秒)

【リターン値】

> 0実際に書き込んだバイト数
= 0 1 バイトも書き込みできなかった

【解説】

port で指定したバッファ I/O 種別のコンソールに、buf 内の len バイトのデータを書き込んで、実際に書き込んだバイト数をリターン値として戻す。

書き込んだデータは、console_in() によって入力されるデータとなる。

コンソールの入力バッファが一杯になったとき、以下の動作となる。

tmout = 0 : 待たずにリターンする。
tmout = -1 : 入力バッファが空くまで永久に待つ。
tmout > 0 : 入力バッファが空くまで最大 tmout ミリ秒だけ待つ。

コンソールの種別がバッファ I/O でないときは何もせずに 0 を戻す。

【エラーコード】

なし

console_conf
 
コンソールのコンフィグレーション操作

【形式】

    ERR console_conf(W req, UW *arg)

【パラメータ】

reqコマンド
argコマンドパラメータ

【リターン値】

= 0正常終了
= -1 エラー

【解説】

コンソールの生成、変更などの req で指定した以下の動作を行う。

CS_CREATE コンソールの生成
arg[0] = ポート番号         OUT
arg[1] = 種別               IN
arg[2] = 入力バッファサイズ IN
arg[3] = 出力バッファサイズ IN
arg[1〜3] で指定したコンソールを新規に生成する。
生成されたポート番号が arg[0] に戻る。
コンソールの他の属性はデフォールトとなる。
CS_DELETE コンソールの削除
arg[0] = ポート番号     IN
arg[0] で指定したコンソールを削除する。
CS_SETCONF
コンソール構成の設定 (再生成)
arg[0] = ポート番号     IN
arg[1] = 種別           IN
arg[2] = 入力バッファサイズ IN
arg[3] = 出力バッファサイズ IN
arg[0] で指定したコンソールの構成を、 arg[1〜3]で指定した内容に変更する。
コンソールの他の属性はデフォールトとなる。
CS_GETCONF
コンソール構成の取り出し
arg[0] = ポート番号         IN
arg[1] = 種別               OUT
arg[2] = 入力バッファサイズ OUT
arg[3] = 出力バッファサイズ OUT
arg[0] で指定したコンソールの現在の構成を arg[1〜3] に戻す。
CS_GETPORT
標準コンソールの取り出し
arg[0] = ポート番号     OUT
現在、自プロセスに設定されているコンソールの ポート番号を arg[0] に戻す。
CS_SETPORT
標準コンソールの設定
arg[0] = ポート番号     IN
自プロセスのコンソールを arg[0] で指定したポート番号のコンソールに変更する。
変更したコンソールは子プロセスに引き継がれる。
CS_SRCHPORT
コンソールポートのサーチ
arg[0] = ポート番号           IN/OUT
arg[1] = コンフィグレーション IN
arg[1] で指定したコンフィグレーションに一致し、arg[0] で指定したポート番号より大きなポート番号を持つコンソールポートを見つける。
見つかった場合、関数値と arg[0] にポート番号( > 0)を戻し、見つからなかった場合は、関数値に 0 を戻す。

【エラーコード】

なし

10.6 コンソールのライブラリ

コンソール、および低レベルシリアルに対する操作は、通常は、 システムコールを直接使用するのではなく、以下のライブラリを使用して行う。

_PutString
 
コンソールへの文字列出力

【形式】

    int _PutString(char *buf)

【パラメータ】

buf出力する文字(バイト)列

【リターン値】

= 0実際に出力した文字(バイト)数
= -1 1 文字(バイト)も出力できなかった

【解説】

現在、自プロセスに割り当てられているコンソールへ buf 内の文字列を出力する。 文字列は 0 で終了していなくてはいけない。

このライブラリでは console_out() を使用する。

printf() などの標準入出力ライブラリでの出力は、 このライブラリを使用して行われる。

_PutChar
 
コンソールへの1文字出力

【形式】

    int _PutChar(int c)

【パラメータ】

c出力する文字(バイト)

【リターン値】

= 1出力した
= -1 出力できなかった

【解説】

現在、自プロセスに割り当てられているコンソールへ c で指定した 1 文字を出力する。 c の下位バイトのみ有効となる。

このライブラリでは console_out() を使用する。

putchar() などの標準入出力ライブラリでの出力は、このライブラリを使用して行われる。

_GetString
 
コンソールからの 1 行入力

【形式】

    int _GetString(char *buf)

【パラメータ】

buf入力した文字(バイト)列の格納領域

【リターン値】

> 0実際に入力したバイト数
= 0 1 バイトも入力できなかった
= -1入力が中断された (入力モードが EDIT モードのときのみ)

【解説】

現在、自プロセスに割り当てられているコンソールから 1 行入力して buf に格納する。 buf は十分な大きさを持っていなくてはいけない。

buf の最後には 0 が格納され、 最後に入力された LF コード は格納されない。

実際の入力はコンソールに設定されている入力モードにしたがって行われるため、 RAW モードのときは、1 行ではなく 1 文字ずつの入力となる。

このライブラリでは console_in() を使用する。

gets() などの標準入出力ライブラリでの入力は、このライブラリを使用して行われる。

_GetChar
 
コンソールからの 1 文字入力

【形式】

    int _GetChar()

【パラメータ】

なし

【リターン値】

> 0入力した文字(バイト)
= -1 入力できなかった

【解説】

現在、自プロセスに割り当てられているコンソールから 1 文字入力して、リターン値として戻す。

実際の入力はコンソールに設定されている入力モードにしたがって行われる。

このライブラリでは console_in() を使用する。

getchar() などの標準入出力ライブラリでの入力は、このライブラリを使用して行われる。

cons_ioctl
 
コンソールの制御

【形式】

    int cons_ioctl(int req, int arg)

【パラメータ】

reqコマンド
argコマンドパラメータ

【リターン値】

任意取り出した現在の設定値
= 0 設定を行った

【解説】

現在、自プロセスに割り当てられているコンソールに対して、 reqarg で指定した制御動作を行う。

このライブラリでは console_ctl() を使用する。

RS_putchar
 
標準 RS ポートへの 1 文字出力

【形式】

    int RS_putchar(int c)

【パラメータ】

int出力する文字(バイト)

【リターン値】

= 1 出力した
= -1 出力できなかった

【解説】

標準 RS ポートへ c で指定した 1 文字を出力する。 c の下位バイトのみ有効となる。

このライブラリでは console_out() を使用する。

RS_getchar
 
標準 RS ポートからの 1 文字入力

【形式】

    int RS_getchar()

【パラメータ】

なし

【リターン値】

> 0 入力した文字(バイト)
= -1 入力できなかった

【解説】

標準 RS ポートから 1 文字を入力して、リターン値として戻す。

このライブラリでは console_in() を使用する。

RS_ioctl
 
標準 RS ポートの制御

【形式】

    int RS_ioctl(int req, int arg)

【パラメータ】

reqコマンド
argコマンドパラメータ

【リターン値】

任意取り出した現在の設定値
= 0 設定を行った

【解説】

標準 RS ポートに対して、reqarg で指定した制御動作を行う。

このライブラリでは console_ctl() を使用する。

cons_put
 
コンソールの入力バッファへの書き込み

【形式】

    W   cons_put(W port, B *buf, UW len, W tmout)

【解説】

console_put(port, buf, len, tmout) を実行する。

cons_get
 
コンソールの出力バッファからの読み込み

【形式】

    W   cons_get(W port, B *buf, UW len, W tmout)

【解説】

console_get(port, buf, len, tmout) を実行する。

cons_conf
 
コンソールのコンフィギュレーション

【形式】

    W   cons_conf(W req, UW *arg)

【解説】

console_conf(req, arg) を実行する。

10.7 コンソールアプリケーションの処理

画面上の仮想的なコンソールを実現するアプリケーションは、一般に以下のような処理を行う。

  1. バッファ I/O コンソールを生成する。
    arg[1] = CONF_BUFIO
    cons_conf(CS_CREATE, arg)
    
  2. 自プロセスのコンソールを生成したバッファ I/O コンソールに切り換える。
    cons_conf(CS_SETPORT, arg)
    

    以後、生成した子プロセスには、このバッファ I/O コンソールが割り当てられる。

  3. バッファI/O コンソールのデータの処理を定常的に行う。
    子プロセスからの出力の処理:
    cons_get(arg[0],..) で取り出したデータを画面に表示する。
    子プロセスへの入力の処理
    キー入力などの入力データを cons_put(arg[0],..) により設定して、 子プロセスへの入力とする。

生成した子プロセスのコンソールはそのままのため、生成した子プロセスも基本的に終了させること。


この章の目次にもどる
前頁:第9章 スクリーン(ディスプレイ)にもどる
次頁:第11章 ブザー(beep)にすすむ