晚上好,
我正在使用 14.7456MHz 的 Atmega32 (2kB RAM) 通过运行在 ~1.5MHz 的 SPI 将数据记录到 SD 卡。
FatFs 设置为 FF_FS_TINY 0 (据我观察,0 或 1 似乎不会影响写入速度)
我要记录的数据包含:5 个字符作为名称,6 个字节用于日期和时间,2 个 uint(16 位)用于值
日期和时间存储在字节数组中,名称和值来自结构变量。
目标是每毫秒从 8 个输入中采样数据,即 8kSPS。主程序每毫秒触发一次中断并设置一个标志。在主循环中,如果标志为 1,则读取 ADC,并将值存储在结构变量中。(每个 ADC 通道都有一个单独的通道。)
出于测试目的,我尝试使用 f_printf 每 10 毫秒编写 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 毫秒,另一张耗时约 2100 毫秒。
由于这花费的时间太长,我想知道有什么策略可以使写入过程更高效,或者一般如何做到这一点。我读到您应该以某种方式对齐卡扇区,但我不知道该怎么做。其他人建议在卡使用时间比平时更长的情况下使用 Fifo 缓冲区,afaik 这将意味着另一个结构来组合时间的字节数组和来自每个数据点的结构值。
有没有推荐的方法来解决这个问题?我经常读到这已经做过很多次了,但不知何故,到目前为止我找不到好的例子。也许我只是在看错误的地方。