- IRCS-AUX(仮称)計画
第2部
- 〜IRCSを利用した通信の実現〜
- 〜物理層デバイスドライバの完成〜
- 1.はじめに
- さて、第1部にて、IRCS−AUX(略してIAU
X,未だに仮称(ゲ、愛称募集中(オ)物理層の実現の為の目処は付きましたが、
完成までは行きませんでした。確か、残っていた課題は
- 1)物理層低級処理部の完成
- 2)物理層と上位層とのインターフェース
- 3)物理層と上位層との間のデータ内容
- 4)リンク層の問題
です(忘れてる)。3) は実質的に 2) と変わりませんね。
- その後、1997年4月の段階で、物理層は完成しました(デバッグが完全に終わ
ったのは7月だったりしますが。)。この記事は、そのまとめとなります。がし
かし、もう半年も経って、何をやっていたか、忘れてしまいました。(^^; ログ
が残っていたので、それから文章を起こしています。(ソースを見ても、もはや
思い出せない)(^^;;;
- 2.物理層低級処理部の完成
- (変形)PPM,家製協フォーマット,を使う事は決まったので、その実装お
よび実現が問題となります。
- 2.1.従来方式のまま(1997 Feb.27)
- さて、従来方式ってどんなだっけ?
- えーと、シリアルチップ:8251 の割込を使い、76.8kbaud/9.6kcps、毎秒96
00回もの割込を発生させ、1バイトずつ、CPUが解析すると言うものです。
この方法だと、猛烈な勢いで割込が発生するため、非常に速いCPUで無ければ、
処理が追い付かないと言う問題があります。それをいかに軽い処理にし、遅いC
PUでも動作するようにするか、という問題です。
- まずは、オーソドックスに、普通の通信ソフトが行っている様に、割込回数を
半分にしてしまう方法を試してみました。
- PC-9801/9821 シリーズの 8251(互換)には、最低2バイトのバッファが有り
ますので、それをうまい事使えば、4800回の割込で、9600回データを得
られます。
- その結果、送信処理が追い付かないのは治りました(80486SX 33MHzにて)。
しかしながら、相変わらず受信処理はこぼしまくります。受信バッファを巨大化
したり、CRC生成/検査をシリアル割込外で行ったりしましたが、ダメです。
その様な状態では、下手な小細工をしても無駄でしょう。素直にアルゴリズムを
変更すべきです。なお、386SX クラスのマシンで実験したところ、通信速度を
51.2k baud にまで落とせば、エラー率が3%程度まで減少しました。しかしな
がら、これはIRCSハードウェアのマージンぎりぎりとなります。
- 2.2.第4の方式(1997 Mar.12)
- 既に3つも方式ためしていたっけ?ログにはそう書いてあるけれど。
- さて、新しいアルゴリズムを考案する事にしました。従来の方式では、常時モ
ニターしていたが為、割込回数が多すぎるのが問題でしたから、常時モニターす
る事をやめる事にしました。
- まず、単純にポーリング間隔をトレーラーの長さによる限界まで引き伸ばし、
単純に処理を軽くする事が考えられますが、これは気分的にいいものでは有りま
せん。見落とす可能性が上がる訳ですから。他に方法が無かった時に試しましょ
う。
- FEZ師匠と共に、98(きゅうはち/きゅうせんはっぴゃく
not きゅうじゅうはち)や8251の
資料を漁りました。AT/compatible には無く、98独自の機能として、同期
転送モードと言うのが有りますが(そもそも、この機能が有った事がIRCSの
始まり。最近はIrDAの為にこの機能をわざわざ追加したそうな)、そのモー
ドにて、同期キャラクタ検出機能と言うのが有ります。ある事は知っていました
が、どのような物かは全く気にしていませんでした。この検出機能をIAUXに
利用出来ないか、試してみる事にしました。
- 同期転送モードでは、送信側と受信側で、ビット単位の同期を取る必要が有り
ます(START/STOP bit が無いので)。したがって、通信開始時に、同期を取り
ます。具体的には、送信側では、SYNCキャラクタを送信し続け、受信側では
ハントモードに入り、SYNCキャラクタを待ち、同期を取ります。同期が取れ
たならば、同期転送モードにより、通信を開始します。
- このハントモードの試験プログラムを組み、パソコン2台をクロス接続し、色
々試したところ、ハントモードでは、SYNCキャラクタを検出するまで、同期
転送モードにかかわらず、受信割込が発生しない事が分かりました。しかも、一
度SYNCキャラクタを検出すると、今まで試していた、同期転送モードの様に、
常時割込が発生するようになる事も分かりました。
- この事を利用すれば、データを受信していない時の割込を無くし、負荷を大幅
に軽くする事が出来ます。この時、副作用として、リバースケーブルによる動作
試験が出来なくなりますが(IRCSとリバースケーブルでは論理が逆である事
が大きな問題となる)、IAUXを実現出来るかもしれないと言うメリットに比
べれば、大した事は有りません。リバースケーブルデバッグ機能は、ばっさり削
除し、FEZ師匠にデバッグ用のIRCSハードをもう1台借りる事にしました。
また、データが来た時だけ、割込が発生するようになる(ハズ)ので、一度割込
がかかった後は、1パケット受信し終わるまで、割込終了せずに、受信し続ける
事にし、CPUパワー全てを受信につぎ込み、受信成功率を大幅に上げる事をも
くろみました。実際、IRCSは指定された時に、全CPUパワーをつぎ込んで
受信に専念します。
- さて、この方式実現の為の改造の困難や,バグ,エンバグなどに悩まされ、ま
た、ダブルSYNCキャラクタハントモードへの変更など(軽量,確実化)、完
成までに1週間消費しましたが(後述のI/Fの骨組みの実装,布石もやってた
けど)、動作試験版IAUX0.40 が完成しました。その結果、十二分に実用に
耐えそうであり、9801VM/VX クラスでも実現出来そうな事が分かりました。
- 2.3.正式公開版作成(1997 Mar.20)
- 実現までには、まだ壁が有りますが(有ったと思う)、一番大きな壁は越えま
した。まだ、細かな事が有ったかと思いますが、忘れました。これにて物理層低
級処理部は完成しました。
- 3.上位層とのインターフェース(1997 Mar.20)
- さて、今作っているものは、物理層の制御ソフトですから、一般的には、メイ
ンで走るソフトではなく、常駐物かデバドラにするのが良いでしょう。MS-DOS/
DOS/V の標準的なインターフェースである、デバイスドライバにする事にし、上
位層からの制御方法は、ある程度メジャーな通信デバイスドライバである、MC
D互換とする事にしました。
- これはわざわざ記述するほど難しくは有りません(物理層低級処理の実現と比
べれば)。非常に面倒で、えらい手間がかかりましたが。詳細は、IAUXパッ
ケージ付属のAPIリファレンス(ひょっとしたらこの記事の付録として添付)
を参照して下さい。
- 4.上位層とのデータ
- KISS。決定。私が packeter だから。以上。投げやりだなぁ。
- KISSというのは、上位層との間でやり取りするパケット(データ列)の先
頭と最後尾に、フラグとなるデータを付加し、パケットの中に、フラグとなるデ
ータと同じデータが有れば、メタデータを起き別のデータに置き換える、と言う
ものです。
- IAUXがパケット方式によりデータを送受信するので、リンク層にて、パケ
ットの先頭が判別出来るように、KISS方式を採用しました。(先頭が判らな
ければ、リンク層の為のデータと、さらに上位層の為のデータの区別が付きにく
くなり、効率が悪くなる)
- 5.こまごまとしたこと
-
- 1-persistent CSMA処理。
- CRCによるエラー検出。
- カスタムコードによる検査。
- 8MHz系/5MHz系の自動判別。
- MCD互換デバイスドライバAPI搭載。
- MCD互換 I/O Control API搭載。
- MCD互換 Direct PASCAL call API搭載。
- デバイスドライバ対応デバッガが無い(;_;) エライクロウシタ
- MS-DOS の仕様により、デバドラで難しい事をやると MS-DOS が落ちる(;_;)
- IAUX動作開始/IRCS未接続への対応。
- IAUX動作終了/通常の通信モードへの移行,への対応。
- 割込処理への本格対応。
- ハントモードの扱いを間違え、はまる。
- デバドラ常駐時のオプションによる環境設定に対応。
- コマンドラインユーティリティーの内蔵。
- 「読」書き。
- IRCS/IAUX再初期化対応(活線接続,取外対応)。
- デバグデバグデバグ。
- エンバグエンバグエンバグ。
- バッファフル処理。
- com化。
- UMB対応。
- idle データ動的確保で省メモリ。
- VM(10MHz)→VX(8MHz) 動作試験。理論上の問題は無し。
- # 兎小屋にモニタが1台しかなく、片方しか受信出来なかったんだわ、これが。
- 通常の通信ソフトとの衝突に対応。
- XMS,EMS非対応。
- IRCSハード検出の確実化。
- RETRY 32回での、検出試験結果。
- 環境 前方3m,90゜下方1m,90゜上方1.5m,CLEAN
- 45゜左1.5m机,45゜右1m自分。
- 総試験回数 223 回
- 失敗回数 13 回
- 失敗率 5.8 %
- 失敗時待ち時間 約1秒
-
- RETRY 128回にて、検出試験350回エラーフリー達成。
- ただし、失敗待ち時間が4秒……。
- VM(10MHz)←→VX(8MHz) 動作試験。なんら問題無し。
- # モニタ1台なのは、気合でカバー。
- 暫定公開。
- FEZ Engineers' Network consIsts of eXperts
- ファイルボード:0030: IRCS 赤外線リモコンサポートソフトウェア
- 16:IAUX043.LZH 20K 0 97/04/01 FEN025
- MS98>AUX driver with IRCS ver0.43暫
- コマンドラインユーティリティにて int 24h 対応。
- 八十八夜,正式公開。
- 同BBS
- 18:IAUX044.LZH 28K 1 97/05/03 FEN025
- MS98>AUX driver with IRCS ver0.44
- MS-DOS のバグにより、SHARE が落ちる事への、消極的対応。(thanks to FEZ)
- MCD互換 Direct C call API搭載。
- MCD互換 Direct ASSEMBLY call API搭載。
- KTX付属KTXMCDにてIAUXを積極的に使える様に対応しようかと、
- 解析したところ、バグ発見。大幅に作りなおしてしまう。
- KTXMCD:MCD/IAUX自動判別。その他大量にいじる。
- API切り離し対応。
- 1997 Jun.06 Fri. ver0.50正式公開
- 22:IAUX050.LZH 44K 0 97/06/07 FEN025
- MS98>AUX driver with IRCS ver0.50
- FEZ師匠いわく「水無誕生日おめでとう」らしい。
- エンバグ発見。C call にもかかわらず、CY 返しをしていた。マヌー
- 24:IAUX051.LZH 44K 1 97/08/03 FEN025
- MS98>AUX driver with IRCS ver0.51
- AUX driver with IRCS PC-98x1 standard 8251 "IAUX" version 0.50
- 任務完了。
- と、まぁ、色々有りすぎて、何が有ったか細かい所までは覚えていません。
- 6.FIN
- 以上により、物理層は完成しました。
- あとはリンク層を完成させる事により、全く通常の通信回線として扱う事が出
来る様になります。しかしながら、技術的興味の有った部分は完成してしまった
ため、もう技術的興味は有りません(私は)。したがって、リンク層ドライバを
作る気は、ほとんど、全く、有りません。ま、パケット通信の快適化の為に、A
X.25ドライバ,KISS処理付き(TNCには元々KISSモードが付いて
いる)を作った場合、そのままIAUXに利用出来るでしょうけれど。ノーマル
のAX.25ってば、番号フレーム処理が甘いんだよね〜。非番号制フレームだ
と、届いたかどうか判らないしね〜。通信ゲームを作ったら(興味は有るが、作
る気は無い)、リンク層も書かなくちゃならないし。そもそも、モデムを作った
としたら、リンク層書かなくちゃねぇ。リンク層ドライバ書くの面倒だなぁ。F
ENIXどうなるんでしょ?最近、熱く燃えられる番組ほとんど無いし。ΖΖ最
終回か(2Dの飛龍に若干はまったらしい、VG ゾロ(?)は結構 はまったけど、
MGΖΖが出たとしたらはまりそうで恐ひ)。マクロス15周年Anniver
saryか、もうそんなに経つのか……。Thexder燃え〜。FireHa
wk燃え燃え〜。はみだし刑事情熱系いいっすね。何書いてんだか。
- 7.参考文献&すぺしゃるさんくす
- バイブル本こと「パケット通信ハンドブック」 秦 正人,山内 雪路
- CQ出版社 1987年5月10日初版,1990年2月20日第7版
- バイブル本の続編「パケット通信ネットワーク」
- 人の借りて読んだので、諸元は分かりません(._.)
- 秀和の解析マニュアルとか、トラ技SPとか、テクニカルデータブックとか……
- FEZ師匠、thomas仙人、うぼうぼ、えーと後は……(^^;
- 執筆:1996年10月某日〜1997年2月10日、
1997年2月27日〜7月15日〜10月12日、
1997 Nov.07 Fri.
- web 用に修正:1998年9月3日
Last modified on Thr,03 Sep,1998.
↑ FENIX ほめぱげ
← G-HAL ほめぱげ
→ ソフトヱアに関するウダウダ
→→ IAUX に関するウダウダ
↓ Mail to, メールはこちらへ
↓ Suggestion Box, 投書箱
↓ BBS, 掲示板 UserName:BBS、Password:BBS
(C) 1996 G-HAL