おはよう、AVRのFatFは、書き込み速度を最大化する戦略はありますか?
私は14.7456MHzでAtmega32(2kB RAM)を使用して〜1.5MHzで動作するSPIを介してSDカードにデータを記録しています。名前、6として 5文字数:
FatFsモジュールは、私がログに記録するデータは、を含んで
を(私が観察することができた限り書き込み速度に影響を与えていないようです0または1)FF_FS_TINY 0に設定されています日付と時刻の2バイト、値の2単位(16ビット)
日付と時刻は、バイト配列で格納され、名前と値は構造変数からのものです。
目標は、8つの入力から1ミリ秒ごとにデータをサンプリングすることです。したがって、8kSPSです。 メインプログラムは、ミリ秒ごとに割り込みをトリガし、フラグを設定します。 メインループで、フラグが1の場合、ADCが読み込まれ、値が構造変数に格納されます。 (各ADCチャンネルには別々のチャンネルがあります)テスト目的のために、f_printfを使用して1秒間に10ミリ秒ごとに静的な値を持つ8つのサンプルを書き込もうとしました。 (または1つは、むしろf_writeを使用する必要がありますか?)
int i=0;
xprintf(PSTR("1 %d\n"), Timer*10);
for (;;) {
if(ISRFlag&&i<100){
xprintf(PSTR("2 %d\n"), Timer*10);
f_printf(&file1, "%s %d %d %d %d %d %d %d %d %d \n",Name, i, day, mon, year, hour, minute, second, value1, value2);
[... 7 more times f_printf]
ISRFlag=0;
i++;
}
if(i==100){
xprintf(PSTR("3 %d\n"), Timer*10);
xprintf(PSTR("f_sync1 rc=%d\n"), f_sync(&file1));
f_close(&file1);
xprintf(PSTR("Timer end%d\n"), Timer*10);
i++;
}
}
私は2枚のSDカードでこれをしようとしたものと、これは〜1500msを取り、他のものと、それは〜2100msを取りました。
これは時間がかかりすぎるため、書き込みプロセスをより効率的にする方法や一般的な方法を考えています。 私はあなたが何とかカードセクターを整列させるべきだと読んだが、これはどうやってやるのか分からない。 他の人は、カードが通常より長くかかる状況ではFifoバッファを使用することを推奨します。これは、時間のバイト配列と各データポイントの構造体値を組み合わせる別の構造体を意味します。
これに対処する方法はありますか?私はこれが以前何度も行われたことをよく読んでいますが、何とか今までのところ良い例は見つけられませんでした。たぶん私は間違った場所を見ているだけかもしれません。
私はこのトレイルに従いました、そして、実際には、それぞれ500ミリ秒の遅延であるf_write-> disk_write-> xmit_datablockに!wait_ready(500)がありますか? 私の実験では、例えば8192 * 32byte、つまり512 * 512byteのバッファを送信した場合、512バイトごとに500msの遅延が発生しますか?しかし、私は全体のプロセスのために約3300ミリ秒の時間があった。 – Winter