1文字の印字処理を行う。文字数をオーバーしたら一旦スリープする。 保留中にまたリクエストが来ても保留状態が保存されているので、 スリープが終わったらまた処理が始まる。
spl4でプロセッサ優先度を4にする。
スリープ中に、別のプロセスがlpoutputを実行している可能性は、ある。
多重オープンが出来ない仕組みで、マルチプロセスじゃない。
lpstartは非同期。 というかレジスタに書き込んでいるだけ。
lpoutput(c)
{
if (lp11.cc >= LPHWAT)
sleep(&lp11, LPPRI);
putc(c, &lp11);
spl4();
lpstart();
spl0();
}
lpstart() { register int c; while (LPADDR->lpsr&DONE && (c = getc(&lp11)) >= 0) LPADDR->lpbuf = c; }
lpstartとlpclose
P366
オブジェクト指向のオーバーライド
引数無視が多いな…
まとめ
- キャラクタデバイスドライバ用にcdevsw[]テーブルがある
- キャラクタデバイスドライバはバッファに1バイトずつデータを送り、そこからデバイスにデータを送信していく。