[H8奮闘記 割り込みを使う(その1)]

FlashROM を更新しなくても自作アプリを試せる環境は構築できたものの、MOTの転送に時間がかかる
ために、当初の目的の「気軽に使える」とは言い難い状況です。
転送が遅い原因は、
(1) 使用している PC 側の転送ソフトのキャラクタ単位の待ち時間設定単位が 10msec程度
(2) ポーリングによる受信のために待ち時間 0 で転送すると H8 側が取りこぼして正常に通信できない
の2点です。
(1) に関しては、通信アプリを自作してしまえば解決できますが、待ち時間が必要なことに代わりは
ありませんし、面倒なのでそんなモノは作りたくないです (^_^;
(2) に関しては、割り込みを使って受信検知後は直ちにメモリへ記録することである程度緩和できます。
PC 用の RS-232Cポートなんかはハード的に FIFO が入っているために、多少ルーズな処理でも受信でき
たりしますが、その FIFO をソフト的に実装してしまうことにより緩和します。
ただし、FIFOに使えるメモリは限られているので、1行単位で H8 に受信文字列の処理をさせて、PC は
その分に十分な待ちを挿入することにします。キャラクタ単位の待ち時間は 0, 行単位の待ち時間は数msec
とすることで、高速化を図ります。
いきなり BIOS を修正してデバッグすると FlashROM の寿命を縮めるので、まずは SRAM上で動作するアプリ
として割り込みを使った SCI通信ソフトを試作します。

BIOSの更新
bios v0.10 には若干の不都合があります。割り込みに関する不都合もあるため、割り込みを使うには v0.20
以降に更新する必要があります。

ダウンロード

更新内容:
・割り込み関数呼び出し時に ER0 を保存するように修正
  AKI-H8 付属のコンパイラが生成する関数のコードは、呼び出し後の ER0, ER1 の内容を保証していません。
・通信速度を 19200bps へ変更
  1キャラクタの通信時間が倍速になりました。でも、待ち時間の方が圧倒的に多いのでほとんど体感できま
  せん。
・SRAM 2stateアクセス設定
  SRAMのバス設定と共に、2state動作設定を行うようにしてあります。
  低速な SRAMを使ってる方は、sram.asm から 2state 設定の行を削除してアセンブルし直してご利用ください。

相変わらず、まだ BIOS としての機能(ファンクションコールなど)を持っていないです (^_^;

割り込みを使う
H8 の割り込みベクタテーブルは H'000000〜H'0000FF の範囲にありますが、ここは ROM のために SRAMアプリ
から更新できません。bios は、それを解決するために H8 内蔵 RAM 上に仮想的な割り込みベクタテーブルを
用意しています。
仕組みは簡単で、H'000000〜H'0000FF のベクタテーブルには bios の内部ルーチンへ飛ぶように記述されており
その内部ルーチンでは C 関数を呼ぶために必要な手続きを行って、仮想割り込みベクタテーブルに書かれている
アドレス(関数)を呼び出すだけです。RTE は内部ルーチンの方に書かれているので、仮想割り込みベクタテー
ブルに記述するアドレスの関数は、普通に RTS で抜けるサブルーチンになります。
今回、C から呼び出せる「割り込み許可」「割り込み禁止」の関数を作成したので、それを使って割り込みを禁止
した状態で、仮想割り込みベクタテーブルへ割り込み処理関数のアドレスを書き込み、割り込み禁止を解除(割り
込み許可)すれば、割り込み処理を実現できます。

割り込みを使った受信処理

早速作成してみました。

ダウンロード

ポーリングの時は、SSR レジスタに強制的に 0x84 を上書きして対処していましたが、割り込みではその割り込み
に関連するビットだけをおろします。もし、エラー割り込みと受信割り込みで強制的に 0x84 を上書きしたりする
とうまく受信できなくなります。
また、割り込み処理関数は割り込み禁止状態で呼ばれるため、あまり時間のかかる処理を記述しては行けません。
たとえば、LcdPutc() などは内部で WaitLcd() を呼んでいたりして、時間のかかる関数です。
必要な処理が、どうしても時間がかかる場合は、割り込み要因をおろした後(SSRレジスタのビットをおろすこと)に
割り込み処理関数内で割り込み許可。割り込み処理関数は、自身に割り込んだときも正常に動作するような再入処理
を実施することである程度実行に耐えられます。しかし、コンスタントに時間のかかる処理は、無限に再入し続けて
スタックがあふれて破綻してしまうため、そのようにならないように再設計する必要があります。

次回は、この割り込み版受信ルーチンを bios に組み込み、高速化を実現します。

[前へ][▲上へ][次へ]