2017-10-14 88 views
0

晚上好,AVR上的FatFs,是否有策略來最大化寫入速度?

我使用14.7456MHz的Atmega32(2kB RAM),通過運行在〜1.5MHz的SPI將數據記錄到SD卡上。

FATFS設置爲0 FF_FS_TINY(0或1似乎不影響寫入速度,據我所觀察到)

我要記錄的數據中包含的: 5個字符的名稱,6字節爲日期和時間,值爲2 uint(16位)

日期和時間存儲在字節數組中,並且名稱和值來自結構變量。

目標是從8個輸入每個毫秒採樣數據,所以8kSPS。 主程序每毫秒觸發一次中斷並設置一個標誌。 在主循環中,如果標誌爲1,則讀取ADC並將值存儲在結構變量中。 (每個ADC通道有一個獨立的通道。)

爲了測試目的,我試着用f_printf每隔10ms寫一個靜態值爲8的樣本。 (或者應該一個寧願用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++; 
    } 
} 

我想這有兩個SD卡和一個這場耗時〜1500毫秒,並與另一個花了〜2100ms。

由於這需要太長的時間,我不知道有什麼策略可以使寫入過程更有效率,或者一般如何實現。 我讀過,你應該以某種方式對齊卡片部門,但我不知道這將如何完成。 其他人建議使用Fifo緩衝區來處理卡片花費比平時更長的時間,afaik這意味着另一個結構將時間字節數組與每個數據點的結構值結合起來。

有沒有推薦的方法來解決這個問題?我經常讀到,這已經做了很多次,但不知何故,迄今爲止我找不到好的例子。也許我只是看着錯誤的地方。

回答

0

我在將數據記錄到SD卡時遇到了類似的問題。首先在低級磁盤I/O層(diskio.c/mmc.c)中檢查您的write(disk_write/xmit_datablock)操作。如果您使用FatF提供的示例,它們通常會有一個預編程的延遲,而這並不是必需的。如果您使用Hardware-SPI,請考慮切換到Software-SPI併爲使用的SPI模式編寫您自己的例程。

+0

我跟蹤了這​​個線索,並且在每個f_write-> disk_write-> xmit_datablock中確實有一個!wait_ready(500),這將是一個500毫秒的延遲? 但是,從我發送的實驗中,例如,8192 * 32byte,512 * 512byte的緩衝區,我不會得到每512個字節寫500ms的延遲嗎?然而我整個過程的時間大約爲3300ms。 – Winter

0

如果您唯一的目標是將樣本傳輸到SD卡,那麼您可以考慮根本不使用文件系統。只需將樣品直接寫入標清。如果你需要追加數據,你可以在SDcard內存的開頭保留一些標題結構,尾部的地址可以繼續寫入等等。當然,這是以額外的軟件爲代價的(例如在計算機上從稍後的SD讀取數據)在MCU端,您可以通過串行接口獲得最高速度。