### E-2　確実にシリアル転送を行う手段

確実にシリアル転送を行う手段として、次のものが考えられます。

1. シリアル通信以外の割り込みをすべてマスクする
2. 送信待機時間＞受信待機時間＋他の割り込み処理時間とする

(1)の手段は、ビジュアルメモリの時計機能が、ベースタイマー割り込みを利用しているため、割り込み禁止中は時計のカウントができません。結果、時計が遅れることになります。

(2)の手段は、受信割り込みより優先順位の高い割り込みが、すべて発生した場合を想定し、その処理時間と受信割り込み処理時間を合計した時間を、送信待機時間とします。このためデータの転送は確実になりますが、送信にかかる時間が増します。

受信割り込みを最優先にすれば、確実に受信可能に思われがちですが、ベースタイマー割り込みハンドラ（時計処理ルーチン）がROM空間にあるため、フラッシュメモリ空間に用意した受信割り込みハンドラが呼び出されません。 ベースタイマー割り込みが発生するとCHANGE命令により、CPUがROM内プログラムフェッチしはじめます。ROM内BIOSのベースタイマー割り込み処理中に受信割り込みがかかると、CPUはROM空間の割り込みテーブル（相当のアドレス）を参照し、そこに記述されているアドレスへジャンプします。このときCPUはROMをフェッチしているので、用意した受信割り込みハンドラへジャンプしてきません。結果としてこの方法は利用できないということになります。

(1)を選ぶか(2)を選ぶかは、自由ですがそれぞれのメリットとデメリットを考慮してコーディングしてください。次にそれぞれの、メリットとデメリットを説明します。

####

E-2-1　割り込みをすべてマスクする

受信割り込み以外の割り込みをすべてマスクすると、ベースタイマー割り込みを利用している時計が遅れます。ただし(3)の方法に比べ、転送速度が早くロジックが簡単です。

数バイトの転送であれば、時計の遅れは誤差程度で済みます。頻繁にデータを転送したり、たくさんのデータを転送する場合は、(3)の手段を利用してください。

送信待機時間は、次のように計算します。

1. 受信処理に要する総ステップ数を数えます。
   割り込み処理ハンドラ内のステップに加え、割り込み直前直後のステップ数も含めてください。
2. そのステップが実行されている間のシステムクロックと分周比を調べます。
3. 総ステップ数とシステムクロック、分周比から送信待機時間を計算します。
4. 送信側の送信処理に(3)で計算した時間待機するようにNOPなどを埋めてください。

####

E-2-2　最長の送信待機時間を設定する

すべての割り込みをマスクする場合に比べ、転送速度がかなり遅くなり、送信待機時間の計算や割り込みの優先順位などに注意してコーディングする必要があります。ただし、時計が遅れることはありません。

送信待機時間の計算は、受信割り込みより優先順位の高い割り込みがすべて発生したことを想定します。その処理時間と受信処理時間を加え、送信待機時間とします。

ポート3割り込みはレベル割り込みのため、シリアル転送中にユーザーがボタンをおし続けていると、割り込みがかかり続けどんなに送信待機時間を設定しても取りこぼしが発生します。 シリアル転送中にボタンの押下状況をチェックする場合は、ポート3割り込みを禁止し、タイマー0などを用いてポート3ラッチを監視してください。

1. 受信割り込みの優先順位と同位の割り込みがないかを調べます。
   もし同位の割り込みがある場合は、その割り込みを受信割り込みより優先にするか、割り込み順位を下げてください。
2. 受信処理に要する総ステップ数を数えます。
   割り込み処理ハンドラ内のステップに加え、割り込み直前直後のステップ数も含めてください。
3. そのステップが実行されている間のシステムクロックと分周比を調べます。
4. 総ステップ数とシステムクロック、分周比から受信割り込み処理に必要な計算します。
5. 受信割り込みより優先順位が高く、ベースタイマー割り込み以外の割り込みをピックアップします。
6. ピックアップした割り込みについて、それぞれの割り込みハンドラの総ステップ数を数えます。
7. (2)〜(4)の要領でそれぞれの割り込みハンドラが必要とする時間を計算します。
8. ベースタイマ割り込みの処理時間を計算します。
   ベースタイマー割り込みハンドラは、BIOS内部で処理されますので、つぎのステップ数を見積もってください。ただし、次の値はGHEAD.ASMを変更していない場合の値です。修正している場合は、実際のステップ数を数えてください。
   最短の場合
   秒のカウント処理だけの場合
   5ステップ　　（GHEAD.ASM内CHANGE命令まで）
   ＋　48ステップ　　（BIOS内部）
   ＋　 3ステップ　　（GHEAD.ASM内ユーザープログラムへの復帰まで）
   合計　56ステップ
   最長の場合
   年の繰り上げ処理まで発生した場合
   5ステップ　　（GHEAD.ASM内CHANGE命令まで）
   ＋ 145ステップ　　（BIOS内部）
   ＋　 3ステップ　　（GHEAD.ASM内ユーザープログラムへの復帰まで）
   合計 153ステップ

   最長の場合は、年に1回発生するものなので、必ずしもこのステップ数を確保する必要はありません。 システムクロックと分周比は、アプリケーションで設定した値が引き継がれます。

9. システムクロックと分周比から、ベースタイマー割り込みハンドラの処理時間を計算します。
10. 受信割り込みハンドラと、計算したすべての割り込みハンドラに必要な時間を合計します。
11. 送信側の送信処理に(10)で計算した時間待機するようにNOPなどを埋めてください。

[←] | [INDEX]