Technology
リングバッファ
(リングバッファ)
リングバッファとは、あらかじめ確保した一定容量の記憶領域を循環して使用し、容量が一杯になると最も古いデータから順番に上書きするデータ管理方式です。循環バッファ、サーキュラーバッファとも呼ばれます。
組込機器では、通信データの一時保存、計測値の履歴、異常発生前のデータ保持、ログ管理などに使用されます。限られたメモリ容量で、常に最新の一定期間分のデータを保持できる点が特長です。
ハカルプラスでは、データ発生周期、必要保持時間、通信速度、異常時の保存要件を確認し、リングバッファの容量と処理方法を検討します。
基本的な仕組み
リングバッファには、データを書き込む位置と、データを読み出す位置を管理する指標があります。一般に、書込み位置をライトポインタ、読出し位置をリードポインタと呼びます。
書込み位置が領域の最後へ達すると、先頭へ戻って書込みを続けます。円形につながっているように扱うため、リングバッファと呼ばれます。
主な用途
- シリアル通信の受信データ
- 送信待ちデータの一時保存
- センサ計測値の最新履歴
- 異常発生前後の波形保存
- 異常履歴や操作履歴
- 音声データや連続サンプリングデータ
通信受信での利用
シリアル通信では、データが受信されるタイミングと、プログラムがデータを処理するタイミングが一致しない場合があります。
受信割込みでデータをリングバッファへ格納し、メイン処理で順番に読み出すことで、受信処理と解析処理を分離できます。
送信処理での利用
送信したいデータをリングバッファへ追加し、通信機能が送信可能になった順に取り出します。
複数の処理から送信要求が発生しても、送信順序を保ちやすくなります。送信完了前に同じ領域を上書きしないよう管理します。
計測データの保持
温度、圧力、重量、電流などを一定周期でリングバッファへ保存すると、直近数秒または数分のデータを常に保持できます。
異常が発生した時点で上書きを停止する、または異常後も一定期間記録を続けることで、発生前後の変化を確認できます。
異常前データの保存
異常発生後の値だけでは、原因を特定できない場合があります。リングバッファへ通常時のデータを常時保存し、異常発生時に内容を不揮発性メモリへ移します。
例えば、異常前10秒と異常後5秒を保存することで、圧力、モーター電流、工程ステップの変化を追跡できます。
バッファ容量の決め方
必要容量は、1件あたりのデータ量、保存周期、保持時間から求めます。
1件20バイトのデータを10ミリ秒周期で10秒分保持する場合、必要件数は1,000件、容量は約20,000バイトです。管理情報や余裕も加えます。
バッファが空の状態
読出し位置と書込み位置が同じ場合、バッファが空なのか満杯なのかを区別できない設計があります。
保存件数を別に管理する、1領域を未使用にする、満杯フラグを持つなどの方法で区別します。
バッファ満杯時の動作
満杯時に古いデータを上書きするか、新しいデータを破棄するかを用途に応じて決めます。
- 最新データ重視:古いデータを上書きする
- 既存データ重視:新しいデータを破棄する
- 重要用途:満杯を異常として通知する
通信コマンドではデータ欠落を避けるため新規受信を異常とし、計測履歴では古い値を上書きする場合があります。
オーバーフロー
データの書込み速度が読出し速度を上回り続けると、未処理データを上書きするオーバーフローが発生します。
バッファ容量を増やすだけでなく、処理速度、通信速度、優先順位を見直します。オーバーフロー回数を記録すると、処理能力不足を把握できます。
アンダーフロー
バッファが空の状態で読出しを行うことをアンダーフローと呼びます。読出し前に保存件数や空フラグを確認します。
音声や連続出力では、アンダーフローによって出力が途切れるため、一定量のデータをためてから処理を開始します。
割込み処理との連携
割込み処理とメイン処理が同じリングバッファへアクセスする場合、ポインタ更新の途中で割込みが発生するとデータ不整合が起こる可能性があります。
更新処理を短くする、割込み禁止区間を設ける、原子的に更新できる型を使用するなどの対策を行います。
複数タスクでの利用
リアルタイムOS上で複数タスクが同じバッファを使用する場合は、ミューテックス、セマフォ、メッセージキューなどで排他制御を行います。
一つの書込み側と一つの読出し側だけであれば、ロックを減らした構成にできる場合もあります。
可変長データ
通信フレームや文字列など、長さが一定でないデータを保存する場合は、データ長を一緒に保存します。
領域末尾でデータが分割されることを考慮し、二回に分けて読書きするか、連続領域へコピーしてから処理します。
データの時刻管理
計測データを保存する場合は、各データへ時刻を付けるか、先頭時刻と一定周期から各時刻を計算します。
サンプリング周期が変動する場合や欠測がある場合は、個別に時刻や通し番号を持たせます。
不揮発性メモリとの組み合わせ
RAM上のリングバッファは高速に書き込めますが、停電すると内容が失われます。
異常発生時や一定時間ごとに不揮発性メモリ、SDカード、上位システムへ転送します。書込み負荷とデータ保持のバランスを取ります。
初期化と再起動
電源投入時には、リードポインタ、ライトポインタ、保存件数を正しく初期化します。不揮発性メモリ上でリングバッファを構成する場合は、前回の管理情報が正常か確認します。
管理情報が破損している場合に備え、領域を走査して最新位置を復元する方法もあります。
異常時の確認
通信データが欠ける場合は、オーバーフロー回数、受信頻度、処理時間を確認します。順序が乱れる場合は、ポインタ更新や排他制御を点検します。
異常前データが残らない場合は、上書き停止条件、保存件数、異常後記録時間を確認します。
ハカルプラスの対応
ハカルプラスでは、通信速度、サンプリング周期、必要保持時間を確認し、リングバッファの容量とデータ構造を設計します。
割込み処理、通信再送、異常前後保存、不揮発性メモリへの転送を組み合わせ、限られたメモリを有効に利用する組込ソフトを検討します。
よくある質問
Q. リングバッファは容量が一杯になるとどうなりますか?
A. 設計により、古いデータを上書きする、新しいデータを破棄する、異常を出すなどの動作を選びます。
Q. 通信データの取りこぼしを防げますか?
A. 受信割込みで一時保存し、後で処理することで取りこぼしを減らせます。
Q. 異常発生前のデータを残せますか?
A. 通常時から最新データを循環保存し、異常時に上書きを停止または固定保存します。
Q. 停電してもリングバッファの内容は残りますか?
A. RAM上のデータは失われるため、必要なデータは不揮発性メモリへ保存します。
Q. バッファ容量はどのように決めますか?
A. 1件あたりのデータ量、発生周期、保持時間、処理遅延から算出します。