筆者の坂井です.
まず consdrv はコンソールの管理データベースを持っています.
これは consdrv.c で以下のように定義されています.
static struct consreg {
kz_thread_id_t id; /* コンソールを利用するスレッド */
...
} consreg[CONSDRV_DEVICE_NUM];
これは拡張性のために,複数のコンソールを管理できるようになっています.
が,実際には CONSDRV_DEVICE_NUM の定義は「1」になっていて,
コンソールは1個だけの利用になっています.
p[0] に入れているのは,利用する管理データベースの番号です.
現状でコンソールはひとつだけなので,固定で'0'を入れることで
0番を指定しています.
p[2] に入れているのは,実際に利用するシリアルポートの番号で,
これはシリアル関連のデバイスドライバ(serial.c)の利用の際の,
シリアルポートの指定のためのものです.
つまり,send_use()で
p[0] = '0';
p[1] = CONSDRV_CMD_USE;
p[2] = '0' + index;
のようにしているのは,
・0番のコンソールを利用する (p[0]による指定)
・0番のコンソールは,0番のシリアルポートに接続する (p[2]による指定)
という意味になります.「コンソール番号」と「シリアルポート番号」の
2つの指定があるわけです.シリアルポートは実際に出力される物理的な
ポート番号,コンソールは仮想的な(抽象的な)出力デバイス,という感じです.
例えばコンソールの出力先は実際にはUSBシリアルに出力したりとか,
そういう可能性もあるので,このような抽象層を1枚入れているわけです.
あと,なぜ '0' + index のようにしていて,そもそも index をそのまま代入
しないのか? ですが,実際そのとおりで,indexを直接代入してしまっても
構わないかと思います.'0'を加えることで文字コードにしているのは,
デバッグのためです.以下のような理由があります.
1つ目の理由は,デバッグ出力などしたときに,そのまま文字として出力できる.
(この理由のために,CONSDRV_CMD_USE なども文字として定義しています)
2つ目の理由は,indexをそのまま入れてしまうと0x00が格納されてしまい,
値がきちんと設定されているのか,それとも初期化でゼロクリアしたときの値が
そのまま残ってしまっているのかが判別しにくい.
安定して動作した今となっては,indexをそのまま入れてもいいような気はしますね.
<
6517bfd2-7f05-4419...@googlegroups.com>の記事において
ota.t...@gmail.comさんは書きました。
>> --
>> このメールは Google グループのグループ「KOZOS友の会」の登録者に送られています。
>> このグループから退会し、メールの受信を停止するには、
kozos_tomonok...@googlegroups.com にメールを送信します。
>> その他のオプションについては、
https://groups.google.com/groups/opt_out にアクセスしてください。
>>