SdFat: Почему первая запись в файл занимает так много времени?

Я проверил эту проблему на 6 картах micro-SDHC 3 разных типов. 3 — Sandisk на 32 ГБ, 2 — Kingston на 16 ГБ и 1 — Samsung на 16 ГБ. Эти карты используются в регистраторах данных и обычно содержат сотни или тысячи текстовых файлов размером 5 МБ с именами в формате FILE1234.TXT.

Проблема в том, что при запуске логгера с такой картой (содержащей данные) первая запись занимает много времени - от 7 до 30 секунд. Открытие файла (наименьшее доступное имя файла) не займет слишком много времени. Последующие записи не занимают много времени. Только первая запись.

Теперь сюжет сгущается: эту задержку можно устранить, сначала открыв FILE0000.TXT и сразу же закрыв его. Кроме того, как только это будет сделано, эта задержка больше никогда не повлияет на этот диск. Это произошло с каждым из дисков.

Вот небольшой код, демонстрирующий проблему:

#include <SdFat.h>
SdFat sd;
SdFile file;

void setup(){
  Serial.begin(57600);
  sd.begin();
  int m = millis(); // просто рассчитать время

  // критическая строка, предотвращающая задержки
  file.open("FILE0000.TXT", O_WRITE | O_TRUNC | O_CREAT); file.close();

  // файл, в который мы действительно хотим записать
  file.open("FILE6005.TXT", O_WRITE | O_TRUNC | O_CREAT);
  Serial.println(millis()-m); // вывести, сколько времени потребовалось для открытия

  file.println(F("test"));  
  Serial.println(millis()-m); // вывести, сколько времени потребовалось для записи
  file.close();
}
void loop(){
}

Когда "критическая строка" в коде закомментирована, я получаю большую задержку при первой записи в файл. Когда он раскомментирован, задержки нет, и я никогда больше не получаю задержку на этом диске, даже если строка закомментирована. Я видел это на всех шести дисках.

Еще одна загадка: поначалу это не работало на одной из карт. Я проверил и обнаружил, что только на этой карте был скрытый каталог «.Trash-1000». Я удалил этот каталог и повторил попытку, и в этот раз это исправление сработало.

Кто-нибудь знает , что здесь происходит?

, 👍2

Обсуждение

Это действительно интересно, мне тоже хотелось бы знать, что именно происходит., @Chupo_cro

Похоже, что библиотека SD-FAT загружает структуру каталогов, таблицы размещения файлов, создавая «представление» использования/расположения SD-карт. Испытываете ли вы задержку при открытии FILE0000.TXT? Подкаталог .Trash-1000, вероятно, вызвал полное сканирование структуры каталога, поскольку SD-FAT искал FILExxxx.TXT. Помните, что вы используете устройство с ограниченным объемом памяти, и библиотека SD-FAT должна поддерживать минимальное использование памяти, поэтому блоки/сектора многократно считываются и сбрасываются, а не кэшируются, как это делается в (гораздо) более крупных системах памяти. Это значительно замедлит доступ., @lornix

Вероятно, вы получите огромное увеличение скорости, если разделите файлы на каталоги, например 3/6/FILE3672.TXT, @Majenko


2 ответа


Лучший ответ:

1

Большинство файловых систем демонстрируют низкую производительность при хранении большого количества файлов в одном каталоге. «Обычные» настольные компьютеры, возможно, настолько быстры, что вы не заметите влияния на производительность, но при доступе к файловой системе с относительно медленного микроконтроллера, который также имеет ограниченные средства кэширования структур данных файловой системы в ОЗУ, вы можете следует учитывать это и либо записать меньшее количество файлов, либо построить дерево каталогов, чтобы у вас было только ограниченное количество файлов в каждом каталоге.

,

Зачем менять структуру файла, если, как сказано в вопросе, задержку можно устранить всего одной строчкой кода?, @Chupo_cro


1

Я тоже это наблюдал, но с программированием на «голом железе», а не с Arduino. Я использую чип STM32F7 для записи на SD-карту класса 10, используя блочную запись стандарта SD-карты. Я использую пользовательскую файловую систему, а не FAT. Моя первая запись на SD-карту занимает примерно в 8-10 раз больше времени, чем все остальные записи. Это каждый раз, когда я отключаю питание и снова подаю питание на устройство. Этого не происходит, если я перезагружаю процессор, не отключая блок питания. Если я только перезагружаю процессор (что означает перенастройку и инициализацию SD-карты), этой задержки записи не происходит.

Единственное, что не происходит с SD-картой до первой записи, — это конфигурация конечного автомата пути данных (DPSM). Может ли быть причиной того, что DPSM находится в состоянии, которое не способствует записи при запуске?

,