鈴木様 こんばんは,小坂です。 At 16:40 03/05/27 +0900, 鈴木さん wrote: >どんな場合でも、「リングバッファ」は使った方がよいのでしょうか? >Web上に書かれていた、・・・・別な作業を行うことができる・・ >等のこと、少しだけ理解いたしましたが、 >もう少し、具体的なメリットと必ず使わなければいけない場面が >あると思いますが、その例を少しだけ解説いただけましたら >幸いに存じます。 先に澤口さんからresがついてしまいました。私も大変参考になりました。 私はこんな風に考えております。 H8などのシリアル通信機能にはバッファが少ないです。例えば受信時がよい例で,相手が次々とデータを転送してくる際に,その度にお相手をしてデータを受け取ってあげないと,データを取りこぼして通信が成立しません。そのくせ,CPUの処理速度に対して,1バイト送信は遅すぎます。CPUは待ちループで無駄な作業をしています。 通信以外の仕事が忙しくなければこのままでかまいません。 あるいは逆にCPUを遊ばせてもよいから,まとまったデータの最後のデータを受け取った瞬間に応答しなければならない場合(即応性が求められる場合)は,タイムアウトを設定してCPUは辛抱強く受信フラッグを見張っていた方がよいと思います。または,あるまとまったデータを受信するまで他にやることがない場合も同じだと思います。 通信以外の仕事が忙しくなると,cpuを無駄な待ちループで遊ばせておくわけにはいきません。そこで,受信データフルを要因とする割り込みを使えばCPUは別な仕事に専念できるはずです。 「リングバッファ」と「データ受信フル要因の割り込み関数(私のサンプルプログラムではSCI1_RXI_INT())」「リングバッファ読み出し関数(私のサンプルプログラムではint getcharSCI1_RB(void))」の3つの構成で,見かけ上のシリアル通信機能にある程度のバッファ機能を付加することが出来ます。ハードウェアのバッファを増強したように見せかけます。そして,シリアル通信受信のからくりを隠してしまいます。バッファへの書き込みポインタ,読み出しポインタの移動もすべて隠してしまいます。 (リングバッファ初期化関数,シリアル通信機能初期化関数は付随的なものです) そして,シリアル通信受信を行なうプログラムでは,リングバッファ読み出し関数int getcharSCI1_RB(void)のみを使うようにして,負の値が得られたら受信バッファは空で,0〜0xff(0〜255)の値が得られたらシリアル受信したデータが得られたことになっています。(これはANSIのgetchar(),fgetc()などと同じ使い方です。) **************************************************** 〒193 0997 八王子市椚田町1220-2 東京工業高等専門学校 情報工学科 小坂敏文 phone0426-68-5199 Fax68-5098