澤口@一升金です。 鈴木 政之さんの<200305270740.AA01339@xxxxxxxxxxxxxxxxx>から >どんな場合でも、「リングバッファ」は使った方がよいのでしょうか? もちろん、そんなことはありません。 リングバッファが使われるのは ・データが不定長で、しかも比較的長いデータが多い ・データフォーマットが一定でなく、解析処理が必要である ・データブロックが全部そろわなくても、ある程度先頭データから 先行して処理を進めることができる ・レスポンス遅れがあまり問題にならない といった場合です。 例えば、Sレコードフォーマットのファイルを受信してこれをバイナ リ化して RAM に順序に格納する、なんてのが典型的ですね。 リングバッファのバッファサイズは、「メインループの一回りする時 間」と「その間に受信することが予想される最大バイト数」で決まり ます。 例えば、ボーレートが 38.4kbps だとすれば、1秒間あたりに受信し なければいけないバイト数は最大で4kbyte くらい、メインループが (受信したデータ処理を含めて) 50ms で回るとすれば、バッファサ イズはこの 1/20 で、200バイトあればいいことになります。 しかも、Sレコードフォーマットの場合は、最後の CR+LF を待たなく ても 2byte ASCII->1byte BIN やチェックサムの計算はデータが来た 都度ちょこまかとやっていけますから、メインループにはほとんど負 荷をかけません。 逆に、電子計測器の中には1秒ごとに10進表示の ASCII で数値を 送るだけ、なんてのがありますが、こういうのは桁が全部来ないと処 理しようがありません。リングバッファにしてもほとんどメリットは ないわけですね。ASCIIで10桁、とフォーマットが決まっていれば、 素直に10バイトのリニアバッファを使えば良いのです。 レスポンス要求がシビアな場合もリングバッファは使えません。シー ケンサ通信などではデータを正常受信したら 10ms 以内に ACK を返せ とかいう仕様があるわけですが、リングバッファではこれが非常にやり にくい。 あと、極端に高速な通信では DMA 転送でメモリと SCI を結ぶことも あるのですが、これはリングバッファになりようがないですね。