[H8-ML(3311)] Re:割込みによるシリアル通信について
From: Sawaguchi Yuji <issho21@xxxxxxxxxx>
Date: 2003年05月28日(水)01時46分49秒
澤口@一升金です。

鈴木 政之さんの<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 を結ぶことも
あるのですが、これはリングバッファになりようがないですね。
スレッド概略
[3288(R)](起点)
 └[3305(U)]
   └[表示中]
     ├[3318(1)]
     └[3320(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]