次のページ 前のページ 目次へ

9. 速度 (フローレート)

ここで言う "速度" は本当は「データフローレート(data flow rate)」と いう意味なのですが、大抵の人はこれを速度と誤用しています。速度の単位は ビット/秒(あるいはボー)です。速度は "stty" コマンドまたはシリアルポー トを使うプログラムで設定します。 stty をご覧ください。

9.1 十分に速い速度が設定できません

ハードウェアが対応している最大速度を知る必要があります。1998 年末の時 点では、ほとんどのハードウェアが 115.2k bps までの速度にしか対応してい ませんでした。 いくつかの 56k 内蔵モデムは 230.4k bps に対応しています。 最近の Linux カーネルは高速(115.2k 以上)対応していますが、以下の理由の いずれかあるいは両方のために、対応が難しい場合があります:

  1. アプリケーションプログラム(または stty)が高速対応していない
  2. setserial の設定がデフォルトの速度の 115,200 である(しかし、こ のデフォルト値を変えるのは簡単です)

ハードウェアに速度を設定する方法: 除数と baud_base 値

普通使われる除数とそれに対応する速度(最大速度は 115,200 とします)の リストを示すと 1 (115.2k), 2 (57.6k), 3 (38.4k), 6 (19.2k), 12 (9.6k), 24 (4.8k), 48 (2.4k), 96 (1.2k) などとなります。シリアルドライバは、 ハードウェアに「除数」(正の整数)のみを送ることによってハードウェアの速 度を設定します。この「除数」でハードウェアの最大速度が割り算され、遅い 速度となります(ただし除数が 1 の場合は言うまでもなく、ハードウェアに 最大速度で動作するよう命令します)。

普通は(通信プログラムや stty で)速度を 115.2k に指定すると、シリアルド ライバはポートのハードウェアに除数 1 を設定します。これは言うまでもな く最高速度の設定です。 お使いのハードウェアの最高速度が例えばたまたま 230.4k ならば、115.2k を指定した時の除数が 1 であるため、実際の速度は 230.4k になります。これにより設定した速度の倍の速度になります。実際、どんな速 度を指定しても実際の速度は倍になってしまいます。460.8k で動作できるハー ドウェアがあったとすると、実際の速度は設定値の 4 倍となるでしょう。

速度設定に関する問題の回避

こういった計算を正しくさせるには(しかし必ずしも問題が解決するとは限 りません)、"setserial" を使って baud_base 値を実際のポートの最大速度 (例えば 230.4k)に変更します。そうすると(アプリケーションや stty を使っ て)速度を 230.4k にした場合に除数として 1 が使われ、設定したのと同じ速 度が得られます。しかし問題があります: (1999 年半ばの時点では)stty や多 くの通信プログラムは最大速度の設定値が 115.2k であり、230.4k 等を設定 することができないのです。したがって、このような場合の一つの解決方法は、 setserial では何も変更せず、実際の速度は設定した速度の 2 倍である ことを自分で覚えておくことです。

あまりマシとは言えませんが、別の回避策もあります。この方法を使うには、 (setserial を使って) baud_base 値をハードウェアの最大速度にしてくださ い。これにより計算方法が正しくなり、115.2k を指定すれば実際に 115.2k の速度が得られるようになります。ここでもまだ、通信プログラムなどが最高 速度を設定させてくれない場合に、最高速度を設定する方法を見つける必要が あります。幸運なことに、setserial にはこれを行う方法があります: "divisor 1" として "spd_cust" パラメータを使うのです。すると、通信プロ グラムで速度を 38400 とした時にポート内の除数は 1 に設定され、最高速度 で動作します。例:
setserial /dev/ttyS2 spd_cust baud_base 230400 divisor 1
"divisor" を先に説明した(spd_cust と組み合わせる)特殊な用途以外の目的 で使ってはいけません。

通信プログラムで設定できない速い速度を 2 つ以上使いたい場合には、先の 説明ほど簡単には行きません。しかし同じ原則が当てはまります。baud_base 値は単にデフォルトのままにしておき、速度を設定する時には実際は除数しか 設定していないと考えるのです。したがって実際の速度は常に、シリアルドラ イバが設定した除数で最大速度を割った値となります。 ハードウェアに速度を設定する方法: 除数と baud_base 値 をご覧ください。

水晶発振器の周波数はボーレートではありません

baud_base 値の設定は普通、ハードウェア内の水晶発振器の周波数よりずっ と低い点に注意してください。というのも、水晶発振器の周波数はハードウェ ア内で 16 で割られ、実際の最高速度となることが多いからです。水晶発振器 の周波数の方が高くなければならない理由は、このように周波数が高速ならば、 各ビットが 1 か 0 であるかを決めるためのサンプルをたくさん取ることがで きるからです。

9.2 シリアルのスループットの向上

(E)IDE のハードディスクを使っているシステムであり、かつスループットが 悪くてシリアルポートがオーバーランする場合は hdparm を試して ください。これは (E)IDE のパラメータ(ディスクの IRQ が発行されている間 は他の IRQ をアンマスクする等)を変更可能にするユーティリティです。この ユーティリティを使うと応答が良くなってオーバーランを無くすのに役立つでしょ う。ただし、マニュアルページは必ずよく読んでください。というのも、 一部のドライブとコントローラの組合せではこのユーティリティがうまく動作 せず、ファイルシステムを壊してしまうかもしれないからです。

irqtune と呼ばれるユーティリティも試してください。これはデバ イス(例えばモデムが繋がっているシリアルポート)の IRQ の優先度を変更す るユーティリティです。これにより、お使いのシステムのシリアルポートのス ループットが向上するかもしれません。irqtune の FAQ は http://www.best.com/~cae/irqtune にあります。


次のページ 前のページ 目次へ