我使用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這意味着另一個結構將時間字節數組與每個數據點的結構值結合起來。
有沒有推薦的方法來解決這個問題?我經常讀到,這已經做了很多次,但不知何故,迄今爲止我找不到好的例子。也許我只是看着錯誤的地方。
我跟蹤了這個線索,並且在每個f_write-> disk_write-> xmit_datablock中確實有一個!wait_ready(500),這將是一個500毫秒的延遲? 但是,從我發送的實驗中,例如,8192 * 32byte,512 * 512byte的緩衝區,我不會得到每512個字節寫500ms的延遲嗎?然而我整個過程的時間大約爲3300ms。 – Winter