ソフトウェアFIFO

H8でシリアル通信を行うプログラムを作成しています。しかし、シリアル通信がメインではないので、シリアル通信はメインルーチン以外のところで勝手にやってほしい、と思っています。
ハードウェアなら、こんな場合はFIFO(First In First Out)バッファを途中に設けて、都合のいいときにまとめてバッファに書き出し、あとは通信デバイスがたらたら読み出して処理(その逆も当然あり)というのが定石ですが、ソフトウェアでこれを実現するためには?

結論としては、割り込み+ソフトウェアFIFOバッファで対処するのがよいかと思います。幸い、H8のシリアル通信では受信バッファフル(RXI)や送信バッファエンプティ(TXI)が組み込まれているので、CPUからみればはるかに遅いシリアル通信も、処理が可能になったときだけ関連するルーチンを呼び出すということが可能です。

で、問題はソフトウェアFIFOなのですが、C言語を使うなら配列で実装することになるでしょう。配列というとStackを実現するのは簡単(なぜなら末尾を処理するだけで先頭は不変)ですが、FIFOとはQueueですから先頭の処理が必要になります。従って、多少やっかいです。

ここでリングバッファの登場です。リングバッファとは配列の先頭と末尾をソフトウェア的に結んだもので、末尾までくると先頭にジャンプするよう作ります。またリングバッファ上にFIFOの先頭、末尾を作成し、そのFIFOの先頭と末尾が追いかけっこするような形でつくります。

詳細はコード(ring_buffer.cring_buffer_h)をどうぞ。

ちなみにこのページを参考にしました。実際のシリアルルーチンが絡んでくる部分は、今度公開予定です。

※その後H8/3694向けの実装を公開しました。

May 31, 2004 23:38 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする