ArduinoでSDカードの書き込み速度を上げる方法


12

私は、毎秒約20000〜30000バイトの高速でSDカードにデータを記録するデータロガーシステムを作成しています。しかし、arduinoのSDライブラリは現在、毎秒約4500〜5000バイトでデータを書き込みますが、これは遅すぎます。

私はこのハックを読んで書き込み速度を改善しましたが、おそらくSPISettingsを調整することで、より直接的なアプローチが可能かどうか疑問に思っています


1
SdFatライブラリを試すこともできます-デフォルトのSDライブラリよりもはるかに効率的です。
マジェンコ

また、5000バイトはどの種類のSDカードにとっても低すぎるように見えますが、SDカードの品質が良いことを確認することもできます。
レン

回答:


11

OK。そこで、SDFatライブラリを試しました。このライブラリは、adruinoに付属しているデフォルトのSDライブラリよりも間違いなく優れています。しかし、それが低データレートの問題を解決した方法ではありません。

私はこの投稿からSDFatライブラリの著者の指示に従いました。

fat16libによると、データレートを上げるには、flush()を賢く使用する必要があります。各サイクルでデータをwrite()したいのですが、各サイクルで書き込まれているデータの量に応じて、100サイクルごとに一度だけflush()する必要があります。また、SD.open()のフラグを 'O_WRITE | 「FILE_WRITE」の代わりに「O_CREAT」。

これにより、速度が大幅に向上しました。しかし、もっと必要でした!

データをバイナリで保存すると(このブログをご覧ください)、パフォーマンスがさらに向上しました。

現在の速度は、クラス4 SDカードで約100〜120 KBps(キロバイト)です。

最後に、皆さんの助けに感謝します。


4

この必要な速度に到達できるかどうかは、多くの要因によって決まります。これらの一部のみ。


1.ソフトウェア

SdFatライブラリが速くArduinoのIDEの標準SD図書館を超えています。また、標準SDライブラリとの使いやすい互換性機能も備えています。やってみよう。

2.ハードウェア

高級SDカードを使用する必要があります。ご存知かもしれませんが、SDカードはパフォーマンスクラスに分類されています。インターネットのほとんどの人は、SanDisk SDカードを推奨しています。


数日後にこれを試して、結果をお知らせします。ありがとう。
アシッシュランジャン

4

ハンドシェイクがバッファを取得しないようにしてください!

SD.write(buf、size);を使用し ます。

みなさん、こんにちは、私は同じ問題を持つプロジェクトで働いています。私はあなたと同じ手順に従っていましたが、まったく同じ数字を取得しました。修正しました。問題は、を呼び出すときのハンドシェイクですSD.write()

代わりに:

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

行う:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

私のプロジェクトでは、最初のプロジェクトで4100バイト、2番目のプロジェクトで128のバッファ(buf [128])を使用して、プロジェクトで145408バイトを取得しました。十分です


1
AFAIK SDはとにかく内部で(512 kB)バッファーを使用するため、ハンドシェイクの意味がわかりません。しかし、File.writeで個々のバイトを書き込むのは非常に遅く、コンパイラはそれを最適化できないようです(結局、1バイトを内部バッファにコピーし、バッファがいっぱいでSPI送信が必要かどうかをチェックしているだけです)開始)。外部で独自のバッファとFile.write(buffer、size)を使用すると、アプリケーションのパフォーマンスが大幅に向上しました。
オリバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.