ソフトウェアFIFO
H8でシリアル通信を行うプログラムを作成しています。しかし、シリアル通信がメインではないので、シリアル通信はメインルーチン以外のところで勝手にやってほしい、と思っています。
ハードウェアなら、こんな場合はFIFO(First In First Out)バッファを途中に設けて、都合のいいときにまとめてバッファに書き出し、あとは通信デバイスがたらたら読み出して処理(その逆も当然あり)というのが定石ですが、ソフトウェアでこれを実現するためには?
結論としては、割り込み+ソフトウェアFIFOバッファで対処するのがよいかと思います。幸い、H8のシリアル通信では受信バッファフル(RXI)や送信バッファエンプティ(TXI)が組み込まれているので、CPUからみればはるかに遅いシリアル通信も、処理が可能になったときだけ関連するルーチンを呼び出すということが可能です。
で、問題はソフトウェアFIFOなのですが、C言語を使うなら配列で実装することになるでしょう。配列というとStackを実現するのは簡単(なぜなら末尾を処理するだけで先頭は不変)ですが、FIFOとはQueueですから先頭の処理が必要になります。従って、多少やっかいです。
ここでリングバッファの登場です。リングバッファとは配列の先頭と末尾をソフトウェア的に結んだもので、末尾までくると先頭にジャンプするよう作ります。またリングバッファ上にFIFOの先頭、末尾を作成し、そのFIFOの先頭と末尾が追いかけっこするような形でつくります。
詳細はコード(ring_buffer.c、ring_buffer_h)をどうぞ。
ちなみにこのページを参考にしました。実際のシリアルルーチンが絡んでくる部分は、今度公開予定です。
※その後H8/3694向けの実装を公開しました。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。