2017-10-14 2 views
0

おはよう、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バッファを使用することを推奨します。これは、時間のバイト配列と各データポイントの構造体値を組み合わせる別の構造体を意味します。

これに対処する方法はありますか?私はこれが以前何度も行われたことをよく読んでいますが、何とか今までのところ良い例は見つけられませんでした。たぶん私は間違った場所を見ているだけかもしれません。

答えて

0

SDカードにデータを記録する際に同様の問題が発生しました。まず、低レベルのディスクI/O層(diskio.c/mmc.c)の書き込み(disk_write/xmit_datablock)操作を確認します。あなたがFatFsによって提供された与えられた例を使用した場合、彼らはしばしばその中にあらかじめプログラムされた遅延を持っています。 Hardware-SPIを使用する場合は、Software-SPIに切り替えて、使用しているSPIモードの独自のルーチンを作成してください。

+0

私はこのトレイルに従いました、そして、実際には、それぞれ500ミリ秒の遅延であるf_write-> disk_write-> xmit_datablockに!wait_ready(500)がありますか? 私の実験では、例えば8192 * 32byte、つまり512 * 512byteのバッファを送信した場合、512バイトごとに500msの遅延が発生しますか?しかし、私は全体のプロセスのために約3300ミリ秒の時間があった。 – Winter

0

サンプルをSDカードにストリームすることが唯一の目的なら、ファイルシステムをまったく使用しないと考えることができます。 SDに直接サンプルを書き込むだけです。データを追加する必要がある場合は、SDcardメモリの先頭にいくつかのヘッダ構造を残しておき、テールのアドレスを書き続けてください。これは余分なソフトウェアを必要とします。 MCU側では、SDへのシリアルインターフェイスで最高の速度を得ることができます。

関連する問題