0

晚上好,

我正在使用 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 这将意味着另一个结构来组合时间的字节数组和来自每个数据点的结构值。

有没有推荐的方法来解决这个问题?我经常读到这已经做过很多次了,但不知何故,到目前为止我找不到好的例子。也许我只是在看错误的地方。

4

2 回答 2

0

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

于 2017-10-20T12:57:36.287 回答
0

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

于 2017-11-30T10:45:06.643 回答