Помогите проверить скорость сохранения на SD карту

Тема в разделе "Arduino & Shields", создана пользователем БДмитрий, 13 мар 2017.

  1. Добрый день.
    У меня есть Ардуино Уно, SD картридер (Troyka-модуль) и акселерометр (Troyka-модуль).
    Я проверял скорость сохранения ускорения от акселерометра на SD карту (Есть идея собрать простенький автономный регистратор). Получилось примерно 20 мс между сохранениями, а надо быстрее.
    Код скетча примерно такой:
    Код (C++):
    #include <SD.h>
    #include <Wire.h>
    #include "TroykaRTC.h"
    #include <SPI.h>
    #include <TroykaIMU.h>
    #include <EEPROM.h>

    Accelerometer accel;
    float myfloat;
    const int CS_PIN  =8;
    void setup()
    {
      accel.begin();
      accel.setRange(RANGE_8G);

      if (!SD.begin(CS_PIN))
      {
        return;
      }
    }

    void loop()
    {
      Wire.begin();
      long timeStamp = millis();
      myfloat = accel.readAZ() + 0.43; // Поправка
      long timeStamp_1 = millis();
     
      File dataFile = SD.open("log.csv", FILE_WRITE);
      if (dataFile)
      {
        dataFile.print(timeStamp);
        dataFile.print(";");
        dataFile.print(myfloat);
        dataFile.print(";");
        dataFile.print(timeStamp_1);
        dataFile.println(";");
        dataFile.close();
      }
    }
    На опрос самого акселерометра уходит около одной миллисекунды.
    Если у кого есть плата мощнее и соответствующие детальки, проверьте, пожалуйста, сколько времени уходит на сброс информации на карту.
    Если нет акселерометра, он в этой задаче не так важен, можно просто текст любой сохранять.
     
  2. rkit

    rkit Гуру

    Не надо постоянно закрывать, а потом опять открывать файл.
     
  3. Я думал про это.
    Тогда вся информация будет храниться в оперативке контроллера и она очень быстро переполнится.
    Или я не прав?
     
  4. rkit

    rkit Гуру

    Нет, с какого вдруг.
     
  5. В листинге 13.2 в книге "Изучаем Arduino" вроде об этом и говорится. Может, я не правильно понимаю?
     

    Вложения:

  6. rkit

    rkit Гуру

    Написано неправильно. Буфер ограниченного размера. Когда заполнится - запишется. Еще существует File.flush(), которая запишет и опустошит буфер, не закрывая файл.
     
    arkadyf нравится это.
  7. Faberge

    Faberge Administrator Администратор

    Вы правы, но так часто записывать данные во флеш память тоже нельзя - у нее ограниченный ресурс на количество циклов перезаписи и в таком режиме карточка очень скоро умрет. Лучше записывать данные сначала в ОЗУ и потом уже только на карту, по несколько десятков за раз. Если не хватает встроенной памяти контроллера, то можно добавить внешней микросхемой.
     
    Banzay и arkadyf нравится это.
  8. rkit

    rkit Гуру

    Вы просто описали буфер, который уже существует.
     
  9. Не получится ли так, что, пока заполняется буфер, данные будут поступать в него с частотой, скажем 1 кГц, а во время его сброса на SD карту опять будет перерыв 20 мс? Меня это тоже не устраивает.
     
  10. rkit

    rkit Гуру

    Конечно получится. Если вы хотите более-менее в реальном времени работать, то придется избавиться от файловой системы и работать с картой напрямую.
     
    arkadyf нравится это.
  11. Так от чего зависит скорость сохранения на карту? От карты или от мощности контроллера? Если взять быстрый контроллер, не ускорит ли это сохранение? Или надо взять карту более скоростную?
    С картами у меня вообще странно немного вышло. Карта SDHC на 16 GB класса 6 даёт 20 мс между сохранениями, а карта 32 GB класса 10 оказалась медлительнее - 100 мс между сохранениями. Карты подготавливал одинаково - форматирование в FAT32.
     
  12. Или вообще надо просто подобрать подходящую карту ...
     
  13. rkit

    rkit Гуру

    От карты. На класс можно не смотреть, он касается работы по шине SD или UHS, а все ардуино-ридеры работают по SPI.
     
  14. Faberge

    Faberge Administrator Администратор

    Скорость записи зависит не только от карточки, но еще и от самого микроконтроллера. У ATmega 328p в Arduino частота 16МГц, частота работы SPI интерфейса, по которому подключается SD карта - максимум 1/2 основной частоты, то есть 8МГц.
     
  15. Значит на более мощном контроллере всё может заработать значительно быстрее... Вот это и хотелось проверить. Всё таки, 20 мс для записи строчки в файл это многовато, по-моему.
     
  16. Теперь что по поводу смерти карточки. Как я понял, весь файл при каждом новом сохранении не перезаписывается с нуля. То есть, то что уже записано, так и будет лежать. Ведь файл формируется путём добавления новых строчек. После заполнения одного кластера начинается запись в следующий, а тот уже не трогается. Даже внутри кластера перезапись секторов не производится. Поэтому карточка должна прожить долго.
     
  17. rkit

    rkit Гуру

    Скорость интерфейса не является тормозом, если у вас разные карточки на одном и том же интерфейсе работают по-разному.
     
  18. Faberge

    Faberge Administrator Администратор

    Не совсем так. В основе флеш памяти лежит принцип постраничной записи, когда отдельные байты организуются в страницы и перезапись возможна только всей страницы сразу, но никак не отдельного байта внутри страницы. Этим флеш память и отличается в худшую сторону от, например, EEPROM, где можно записывать по одному байту за раз. Зато, конечно, флеш дешевле и компактнее. Так что даже когда вы добавляете один символ в файл на SD карточке, в памяти осуществляется перепрограммирование сразу целой страницы. Поэтому и износ происходит быстрее.
     
  19. rkit

    rkit Гуру

    Вы путаете. Снимаются биты со всей страницы сразу, а устанавливать их можно когда угодно. Поэтому дозаписывать на страницу можно хоть десять раз без проблем.
     
    arkadyf нравится это.
  20. Faberge

    Faberge Administrator Администратор

    Во флеш-памяти все ячейки страницы перепрограммируются одновременно. Тем более, кто вам даст гарантии, что вы будете всякий раз дозаписывать на чистую страницу? В современных твердотельных накопителях, к которым и относятся SD карточки, равномерный износ достигается за счет встроенного контроллера, который следит за ресурсом отдельных страниц и ячеек в них. Так называемый "wear leveling". И в какую именно область вы будете дозаписывать данные - зависит только от него и совершенно не факт, что области эти будут соседними, даже если вы записываете данные подряд. Вы хоть почитайте для начала теорию:

    https://en.wikipedia.org/wiki/Wear_leveling
    https://ru.wikipedia.org/wiki/Флеш-...80.D1.81_.D0.B7.D0.B0.D0.BF.D0.B8.D1.81.D0.B8