AVR上的FatFs是否有最大化写入速度的策略?

时间:2017-10-14 00:43:37

标签: c avr fatfs

晚上好,

我正在使用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并将值存储在struct变量中。 (每个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毫秒,而另一张需要~2100毫秒。

由于这需要太长时间,我想知道有什么策略可以使写入过程更有效或者一般如何做。 我读到你应该以某种方式调整卡片行业,但我不知道如何做到这一点。 其他人建议使用Fifo缓冲区来处理卡片比平常花费更长时间的情况,这意味着这意味着另一个结构将时间字节数组和每个数据点的结构值组合在一起。

是否有推荐的解决方法?我经常读到这已经做了很多次,但到目前为止,我还是找不到好的例子。也许我只是在看错了。

2 个答案:

答案 0 :(得分:0)

将数据记录到SD卡时遇到了类似的问题。首先检查低级磁盘I / O层(diskio.c / mmc.c)中的write(disk_write / xmit_datablock)操作。如果您使用FatFs提供的给定示例,则它们通常会有预编程的延迟,这是不必要的。如果您使用Hardware-SPI,请考虑切换到Software-SPI,并为使用的SPI模式编写自己的例程。

答案 1 :(得分:0)

如果您的唯一目标是将样本流式传输到SD卡,那么您可以考虑根本不使用文件系统。只需将样本直接写入SD。如果你需要附加数据,你可以在SDcard内存的开头保留一些标题结构,尾部的地址继续写入等等。当然这是以额外软件为代价的(稍后在例如计算机上从SD读取数据)在MCU方面,您可以通过串行接口获得最快的速度。

相关问题