Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

SPIFFS теряет файлы

Тема в разделе "ESP8266 Arduino IDE", создана пользователем rkit, 11 мар 2017.

  1. rkit

    rkit Новичок

    Сообщения:
    6
    Симпатии:
    0
    Простая система логов. Один файл постоянно открыт, в него периодически добавляются строки. Когда вырастает до некоторого размера, добавляется новый файл. Периодически старые файлы подчищаются.
    Проблема в том, что когда в файл записывается новая строчка, он может исчезнуть из листинга. А потом, при случайной операции записи - появляется опять. Даже после перезагрузки проходит несколько записей в другой файл, и этот появляется. И больше не исчезает.
    Кто-нибудь сталкивался с таким?
    На износ флеша грешить не хочется, потому что плата новая, да и проблема проявляется строго в одном месте.

    Код (C):
    1. Dir dir = SPIFFS.openDir("/stats/");
    2. while (dir.next()) {
    3.   response->printf("<p><a href='/fs%s'>%s</a></p>", dir.fileName().c_str(), dir.fileName().c_str());
    4. }
     
  2. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.168
    Симпатии:
    226
    @rkit как постоянно открыт?
    Открыл, записал, закрыл. Только так, имхо.
     
    Юрий Ботов нравится это.
  3. rkit

    rkit Новичок

    Сообщения:
    6
    Симпатии:
    0
    На наличие файла в списке это никак влиять не должно. Меня интересует корень проблемы, а не какая-нибудь магическая манипуляция, которая ее обойдет. Придумать костыль я могу без проблем.
     
  4. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.168
    Симпатии:
    226
    так не закрытый файл на запись и есть корень проблемы. Никаких "магических манипуляций" я не предлагал. Вы файловую систему рушите, что же вы хотите?
     
    Юрий Ботов нравится это.
  5. rkit

    rkit Новичок

    Сообщения:
    6
    Симпатии:
    0
    Что-то новенькое. Где это написано?
     
  6. rkit

    rkit Новичок

    Сообщения:
    6
    Симпатии:
    0
    То есть вы утверждаете, что они не поленились в readme написать о длине имени файла, о том, что фс не годится для реалтайма и для файловых систем больше 128 МБ, но забыли написать о том, что можно открыть ТОЛЬКО ОДИН ФАЙЛ?
    Не надо выставлять себя дураком.
     
  7. rkit

    rkit Новичок

    Сообщения:
    6
    Симпатии:
    0
    Прочитал и поржал. Если вам нечего утверждать, то не надо тратить мое время. Более того, в документации, которую вы якобы читали, прямым текстом советуют файлы НЕ ЗАКРЫВАТЬ:
    А я предлагал не выставлять себя дураком.

    И закрывать файл я пробовал, для воинствующих "недилетантов".


    Мне нужно ваше чтение исходников во сне и прочее. Мне нужен человек, который реально сталкивался с такой проблемой. Если вы не сталкивались, то не тратьте мое время.
     
  8. Юрий Ботов

    Юрий Ботов Moderator Команда форума

    Сообщения:
    1.052
    Симпатии:
    175
    Зачем долго спорить просто проверьте сами:
    FSInfo fs_info;
    SPIFFS.info(fs_info);
    где
    struct FSInfo {
    size_t totalBytes;
    size_t usedBytes;
    size_t blockSize;
    size_t pageSize;
    size_t maxOpenFiles;
    size_t maxPathLength;
    };
    и соответственно:
    maxOpenFiles — max number of files which may be open simultaneously

    И не забудьте что есть SPIFFS_errno в которой можно посмотреть код ошибки если она была...
     
  9. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.751
    Симпатии:
    1.284
    Значит должен держать описанное кол-во всегда открытых файлов. В чем беда там поставить 32 шт к примеру? Кривой и неоптимальный код? :)
    Примерная историю, почему на ESP используется самый худший вариант файловой системы из имеющихся вы не исследовали? :)
    Она совершенно не подходит к политике SDK и вообще для многих более менее современных MCU. Тут уже ничего не поделать - всё в ESP используется только такое кривое, из-за начальной лени "портировщиков". На то он и ESP :)
    Сравнение характеристик SPIFFS с простым кольцевым буфером, записываемым, к примеру, пачками по 32 байта с маркером, показывает, что SPIFFS работает медленнее и требует больше ресурсов по RAM и Flash. Особенно по объему хранения в Flash. У него показатель не более 2/3 полезной информации от объема и при таком заполнении (или после обработки объема к 2/3 объема) он становиться неработоспособным – время открытия файла превышает время полного считывания всей Flash:)
     
    Последнее редактирование: 11 мар 2017
  10. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.168
    Симпатии:
    226
    Ради эксперимента открыл 5 файлов на запись, записал в каждый по очереди миллис, закрыл все и прочитал содержимое директории и всех файлов в ней - ничего не пропало.
    А вот если файл на запись не закрывать, то прочитать его нельзя. И в листинге его может не быть.
     
  11. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.751
    Симпатии:
    1.284
    Т.е. нет совместного доступа к файлу?
    Если в задаче открыть 10 файлов с одним именем, то это проходит? :eek:
     
  12. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.168
    Симпатии:
    226
    @pvvx если открыт только на запись - нет. Надо открывать с опцией 'а', тогда есть. И не забывать закрывать если пишешь, а то при сбоях всё может потерять :)
     
    Последнее редактирование: 11 мар 2017
  13. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.168
    Симпатии:
    226
    @pvvx я не менял настройки ФС, максимальное число файлов у меня 5. Если читать, то ничего страшного - читай хоть 20 , только открой на чтение перед этим. Но одновременно, все равно только 5. Но можно не закрывать.
    А если на запись и не закрыть - бяка выходит.
     
  14. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.751
    Симпатии:
    1.284
    А почему? Открыли хоть 100 одноименных (в передел установок) и пишите в них. В файле будет каша - почередность вывода в эти файлы. Если какая задача закроет файл, то он должен сохраниться. Другие могут продолжать писать в этот файл. Закрытие - это всего объявление в каталоге события... для других открывающих этот файл оно ничего не значит и размер его определяют другие открывшие и пишущие в него. По другому написать сложно и не требуется.
     
  15. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.168
    Симпатии:
    226
    @pvvx я не анализировал , почему. Просто провел тест в Ардуино ИДЕ. Так у меня вышло.
    Если файл не закрыт на запись, то прочитать его нельзя, даже если попытаться открыть на чтение перед этим. И в листинге его может не быть.
    Я даже ошибки не смотрел.
     
  16. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.751
    Симпатии:
    1.284
    Это значит, что каталог не обновляется при открытии нового файла. Т.е. логическая ошибка.
    Итог - решение данной темы. Ошибка (очередная) в SPIFFS -> делать примочку, или править, или обходить эту ошибку.
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    4.736
    Симпатии:
    452
    вроде бы В SPIFFS нет каталога, там сектора содержат имя файла.
     
  18. Vladimir555

    Vladimir555 Читатель

    Сообщения:
    305
    Симпатии:
    5
    Наблюдал еще худшую ситуацию, сделал файл для сохранения текущих данных (закрывал по окончании записи), обновлял его раз в час.
    через ~ месяц система рухнула. Форматировал, повторил проект, через месяц опять рухнула.
    Теперь использую RTC MEM c батарейкой.
     
    Cadil нравится это.
  19. rkit

    rkit Новичок

    Сообщения:
    6
    Симпатии:
    0
    Да. Когда начал тестировать на объеме - 2 записи в секунду, оно стало портить фс. Придется писать логи в сеть.
     

Поделиться этой страницей