by shigemk2

当面は技術的なことしか書かない

lpoutput() #firstv6

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バイトずつデータを送り、そこからデバイスにデータを送信していく。