バックグラウンド
接続されたセンサーを備えた「Arduino互換」chipKit UNO32ボードで実行されるデータロギングアプリケーションが必要です。データは、「Arduino ワイヤレス SD シールド」にある SD カードに記録する必要があります。センサーは I2C 経由で接続されます。
私の問題は、Arduino SD ライブラリを使用すると書き込みが遅くなることです。print() 操作ごとに 25 ミリ秒で、センサーの 100 ~ 800 Hz のデータ レートと比較して笑える最大 40 Hz になります。
私の間違った解決策
幸いなことに、センサーには、32 個のセンサー値を保存できるオンチップ FIFO が両方とも装備されています。これは、FIFO がいっぱいになる時間はカードに書き込む時間よりもはるかに長いため、問題なく少なくとも 200Hz に到達できることを意味します。それでも、少なくとも 400Hz に到達したいので、次のように設定することにしました。
- データを FIFO に入れるようにセンサーに指示する
- FIFO がほぼ満杯になると、センサーが割り込みをトリガーします (センサーがこれを行い、動作し、割り込みをキャッチできます)。
- Arduino が割り込みを受信すると、(I2C 経由で) センサーのデータをポーリングし、データを SRAM のバッファーに格納します。
- SRAM バッファがいっぱいになったら、その内容を SD カードに書き込みます。
残念ながら、I2C を処理する Arduino Wire ライブラリは割り込みを使用し、割り込みハンドラ内から呼び出すことができないため、これは機能しないようです。試してみましたが、マイクロコントローラーがフリーズします。
私の質問
割り込みに依存しないArduino用のI2Cライブラリは他にもあるようです。そのルートを試してみるべきですか?
それとも、私の考え方 (ISR で大量のデータを取得する) が最初から悪いのでしょうか? 私が取るべき別のアプローチはありますか?