コンソールは、シリアルポートや仮想的なコンソールを経由して、 文字の入出力を標準的に行うための機構であり、 システム全体として以下の構成となる。
コンソールドライバは、コンソールとしての機能を実現するドライバであり、 シリアル I/O ドライバは、実際のシリアルポートに対する入出力を行うためのドライバである。
アプリケーションは、 標準入出力ライブラリやコンソールライブラリを経由してコンソールドライバを使用することになり、 コンソールがシリアルポートに接続されているときは、 さらに、シリアル I/O ドライバが使用される。
アプリケーションが、通常のデバイスとして直接シリアルポートを使用するときは、 デバイス管理、RS232C ドライバを経由して、シリアル I/O ドライバが使用される。
コンソールは、一般のデバイスドライバとは異なった構造を持ち、 コンソール機能のための専用のシステムコール ( 拡張 SVC ) が用意されている。
システムは複数のコンソールを持つことができ、 それぞれのコンソールは動的に生成され、 コンソールポート番号により識別される。
コンソールは、以下の属性を持つ。
CONF
)
コンソールの種別を示す以下のいずれかであり、生成時に指定される。
CONF_SERIAL
シリアルポート
CONF_SELF
セルフコンソール
CONF_BUFIO
バッファ I/O
SNDTMO
)RCVTMO
)RCVBUFSZ
)SNDBUFSZ
)ECHO
)MINPUT
)CANONICAL
モード)。
NEWLINE
)FLOWC
)IXON | XON / XOFF 出力フロー制御 |
IXANY | IXON 時に任意文字の受信で出力を再開 |
IXOFF | XON / XOFF 入力フロー制御 |
コンソールポート番号は 1〜 の番号であり、通常、システム立ち上げ時に、 以下のコンソールが生成される。
CONF = CONF_SERIAL (シリアルポート #0) SNDTMO = -1 RCVTMO = -1 RCVBUFSZ = デフォールト SNDBUFSZ = デフォールト ECHO = 1 INPUT = EDIT NEWLINE = 1 FLOWC = IXON | IXOFF
CONF = CONF_SERIAL (シリアルポート #0) SNDTMO = -1 RCVTMO = -1 RCVBUFSZ = デフォールト SNDBUFSZ = デフォールト ECHO = 0 INPUT = CANONICAL NEWLINE = 0 FLOWC = 0
プロセスには、1 つのコンソールが割り当てられ、子プロセスに引き継がれる。 デフォールトでは、ポート番号 = 1 のデバッグ用コンソールが割り当てられるが、 このポート番号を変更して、別のコンソールを割り当てることができる。
標準入出力ライブラリでは、自プロセスに割り当てられたコンソールが対象となる。 ただし、非プロセスのタスクではポート番号 = 1 のデバッグ用コンソールが対象となる。
また、syslog()
による出力も、ポート番号 = 1 のデバッグ用コンソールが対象となる。
#define CONSOLE_PORT 1 /* デバッグ用コンソール */ #define RS_PORT 2 /* 標準 RS ポート */
cons_ioctl()
コマンド
#define GETCTL 0x100 /* 設定取り出し */ #define ECHO 1 /* エコーの有無 (0:無、1:有) */ #define INPUT 2 /* 入力モード (RAW, etc) */ #define NEWLINE 3 /* 出力改行変換 (0:変換しない,1: する) */ #define FLOWC 4 /* フロー制御 (0: 無, IXON, etc) */ #define SNDTMO 0x81 /* 送信タイムアウト(ミリ秒) -1: なし */ #define RCVTMO 0x82 /* 受信タイムアウト(ミリ秒) -1: なし */ #define RCVBUFSZ 0x83 /* 入力バッファサイズ: GET のみ */ #define SNDBUFSZ 0x84 /* 出力バッファサイズ: GET のみ */
#define RAW 1 /* 1 文字ずつの生入力 */ #define CANONICAL 3 /* 1 行入力 (CR を LF に変換) */ #define EDIT 5 /* 1 行編集入力 */
#define IXON 0x01 /* XON / XOFF 出力フロー制御 */ #define IXANY 0x02 /* IXON 時に任意文字の受信で出力を再開 */ #define IXOFF 0x04 /* XON / XOFF 入力フロー制御 */
cons_conf()
コマンド
#define CS_CREATE 0x11 /* コンソールの生成 */ #define CS_DELETE 0x12 /* コンソールの削除 */ #define CS_SETCONF 0x13 /* コンソール構成の設定 */ #define CS_GETCONF 0x14 /* コンソール構成の取り出し */ #define CS_GETPORT 0x21 /* 標準コンソールの取り出し */ #define CS_SETPORT 0x22 /* 標準コンソールの設定 */ #define CS_SRCHPORT 0x23 /* コンソールポートのサーチ */
#define CONF_SERIAL_0 (0) /* シリアルポート # 0 */ #define CONF_SERIAL(n) (n) /* シリアルポート # N */ #define CONF_SELF (-1) /* セルフコンソール */ #define CONF_BUFIO (-2) /* バッファ I/O */
コンソールを取り扱うための以下のサービスが拡張システムコールとして提供される。
|
W console_in(W port, B *buf, UW len)
port | コンソールポート番号 |
buf | 入力データバッファ |
len | 入力する最大データバイト長さ |
> 0 | 実際に入力したバイト数 |
= 0 | 1 バイトも入力できなかった |
= -1 | 入力が中断された (入力モードが EDIT モードのときのみ) |
port
で指定したコンソールから、最大 len
バイトのデータを入力して、
buf
に格納する。実際に入力したバイト数をリターン値として戻す。
指定したコンソールの入力モードにより以下の動作となる。
len
バイトのデータを入力した時点でリターンする。
len
== 1 のとき :
len
バイトのデータを入力した時点でリターンする。
buf
に格納される。
len > 1
のとき :
len
は 1 行の編集入力が可能だけ十分
大きくなくてはいけない。
buf
に格納される。
buf
には格納されない。
なし
|
ERR console_out(W port, B *buf, UW len)
port | コンソールポート番号 |
buf | 出力データバッファ |
len | 出力するデータバイト長さ |
> 0 | 実際に出力したバイト数 |
= 0 | 1 バイトも出力できなかった |
port
で指定したコンソールに、buf
内の len
バイトのデータを出力して、実際に出力したバイト数をリターン値として戻す。
指定したコンソールに設定されている出力タイムアウト以内にデータを出力できなかったときは、 その時点でリターンする。
出力改行変換ありのときは、LF は CR、LF に変換して出力される。
なし
|
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 は未使用)
なし
|
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 を戻す。
なし
|
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 を戻す。
なし
|
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 を戻す。
なし
コンソール、および低レベルシリアルに対する操作は、通常は、 システムコールを直接使用するのではなく、以下のライブラリを使用して行う。
|
int _PutString(char *buf)
buf | 出力する文字(バイト)列 |
= 0 | 実際に出力した文字(バイト)数 |
= -1 | 1 文字(バイト)も出力できなかった |
現在、自プロセスに割り当てられているコンソールへ buf
内の文字列を出力する。
文字列は 0 で終了していなくてはいけない。
このライブラリでは console_out()
を使用する。
printf()
などの標準入出力ライブラリでの出力は、
このライブラリを使用して行われる。
|
int _PutChar(int c)
c | 出力する文字(バイト) |
= 1 | 出力した |
= -1 | 出力できなかった |
現在、自プロセスに割り当てられているコンソールへ c で指定した 1 文字を出力する。 c の下位バイトのみ有効となる。
このライブラリでは console_out()
を使用する。
putchar()
などの標準入出力ライブラリでの出力は、このライブラリを使用して行われる。
|
int _GetString(char *buf)
buf | 入力した文字(バイト)列の格納領域 |
> 0 | 実際に入力したバイト数 |
= 0 | 1 バイトも入力できなかった |
= -1 | 入力が中断された (入力モードが EDIT モードのときのみ) |
現在、自プロセスに割り当てられているコンソールから 1 行入力して buf
に格納する。
buf
は十分な大きさを持っていなくてはいけない。
buf
の最後には 0 が格納され、
最後に入力された LF コード は格納されない。
実際の入力はコンソールに設定されている入力モードにしたがって行われるため、 RAW モードのときは、1 行ではなく 1 文字ずつの入力となる。
このライブラリでは console_in()
を使用する。
gets
() などの標準入出力ライブラリでの入力は、このライブラリを使用して行われる。
|
int _GetChar()
なし
> 0 | 入力した文字(バイト) |
= -1 | 入力できなかった |
現在、自プロセスに割り当てられているコンソールから 1 文字入力して、リターン値として戻す。
実際の入力はコンソールに設定されている入力モードにしたがって行われる。
このライブラリでは console_in()
を使用する。
getchar()
などの標準入出力ライブラリでの入力は、このライブラリを使用して行われる。
|
int cons_ioctl(int req, int arg)
req | コマンド |
arg | コマンドパラメータ |
任意 | 取り出した現在の設定値 |
= 0 | 設定を行った |
現在、自プロセスに割り当てられているコンソールに対して、
req
、arg
で指定した制御動作を行う。
このライブラリでは console_ctl()
を使用する。
|
int RS_putchar(int c)
int | 出力する文字(バイト) |
= 1 | 出力した |
= -1 | 出力できなかった |
標準 RS ポートへ c で指定した 1 文字を出力する。 c の下位バイトのみ有効となる。
このライブラリでは console_out()
を使用する。
|
int RS_getchar()
なし
> 0 | 入力した文字(バイト) |
= -1 | 入力できなかった |
標準 RS ポートから 1 文字を入力して、リターン値として戻す。
このライブラリでは console_in()
を使用する。
|
int RS_ioctl(int req, int arg)
req | コマンド |
arg | コマンドパラメータ |
任意 | 取り出した現在の設定値 |
= 0 | 設定を行った |
標準 RS ポートに対して、req
、arg
で指定した制御動作を行う。
このライブラリでは console_ctl()
を使用する。
|
W cons_put(W port, B *buf, UW len, W tmout)
console_put(port, buf, len, tmout)
を実行する。
|
W cons_get(W port, B *buf, UW len, W tmout)
console_get(port, buf, len, tmout)
を実行する。
|
W cons_conf(W req, UW *arg)
console_conf(req, arg)
を実行する。
画面上の仮想的なコンソールを実現するアプリケーションは、一般に以下のような処理を行う。
arg[1] = CONF_BUFIO cons_conf(CS_CREATE, arg)
cons_conf(CS_SETPORT, arg)
以後、生成した子プロセスには、このバッファ I/O コンソールが割り当てられる。
cons_get(arg[0],..)
で取り出したデータを画面に表示する。
cons_put(arg[0],..)
により設定して、
子プロセスへの入力とする。
cons_conf(CS_DELETE, arg)
生成した子プロセスのコンソールはそのままのため、生成した子プロセスも基本的に終了させること。