gpt4 book ai didi

c - AVR 上的 FatF,是否有最大化写入速度的策略?

转载 作者:行者123 更新时间:2023-11-30 16:40:18 30 4
gpt4 key购买 nike

晚上好,

我使用 Atmega32(2kB RAM),频率为 14.7456MHz,通过运行频率约为 1.5MHz 的 SPI 将数据记录到 SD 卡。

FatFs 设置为 FF_FS_TINY 0(据我观察,0 或 1 似乎不会影响写入速度)

我想要记录的数据包含:5 个字符作为名称,6 个字节作为日期和时间,2 个 uint(16 位)作为值

日期和时间存储在字节数组中,名称和值来自结构变量。

目标是每毫秒从 8 个输入中采样数据,即 8kSPS。主程序每毫秒触发一次中断并设置一个标志。在主循环中,如果标志为 1,则读取 ADC 并将值存储在结构变量中。 (每个 ADC channel 都有一个单独的 channel 。)

出于测试目的,我尝试使用 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 缓冲区,据我所知,这意味着另一个结构体可以组合时间的字节数组和每个数据点的结构体值。

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

最佳答案

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

关于c - AVR 上的 FatF,是否有最大化写入速度的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46739706/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com