• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Скорость чтения SPIFF

ART_HA

Member
Здравствуйте.
В loop включена операция чтения данных из флеш-памяти, например:
Код:
level = readFile(SPIFFS, "/inputInt1.txt").toInt(); // читаем уровень опорного напряжения
В процессе отладки выяснилось, что время чтения весьма негативно влияет работу в цикле, т.е. заметно тормозит процесс, вплоть до его срыва.
Да, есть варианты облегчения негативности этого влияния, но хотелось бы рассмотреть и кардинально решающие проблему варианты.
Например путем применения внешней энергонезависимой памяти.
Батарейка с SRAM конечно не исключена, но лучше бы без неё. Тем более, что данных очень немного - сейчас это всего лишь четыре 16-разрядных числа.
В качестве альтернативы SRAM с батарейкой есть возможность использовать F-RAM с протоколами:
FM25L16 - SPI
FM24C16 - 2-Wire
MB85RC16 - I2C
Отсюда возник вопрос к тем, кто с такой задачей уже сталкивался - какой вариант предпочтительнее?
 

ART_HA

Member
Нечасто, если учитывать, что в цикле два АЦП и два ЦАП плюс обработка данных типа float.
 

aZholtikov

Active member
ИМХО. Хранение во FLASH лучше использовать только для «холодных» данных… Если в Вашей программе данные пишутся во FLASH так же часто, как читаются - FLASH осталось жить минут 5…
 

ART_HA

Member
ИМХО. Хранение во FLASH лучше использовать только для «холодных» данных… Если в Вашей программе данные пишутся во FLASH так же часто, как читаются - FLASH осталось жить минут 5…
Нет, пишется очень редко, да и то только в течение первого года эксплуатации. А вот читается постоянно.
Да, напрашивается кнопка - но она всего лишь один из нежелательных "костылей".
 

ART_HA

Member
Чем переменная во флеш не нравится?
Может я ошибаюсь, но по моим представлениям низкая скорость чтения связана в основном с физикой памяти, а не со способом обращения к ней.
Или это не так?
Вариантов на самом деле много, но как бы не хотелось превращаться в исследователя...
Отсюда и вопрос на форуме.
 

aZholtikov

Active member
Не понимаю… А читать только при запуске программы и загонять в переменную? Или читать по таймеру?
 

CodeNameHawk

Moderator
Команда форума
Может я ошибаюсь, но по моим представлениям низкая скорость чтения связана в основном с физикой памяти, а не со способом обращения к ней.
А вы сами подумайте, что быстрее считать значение переменной из ячеек памяти или сперва обратиться к файловой системе, прочитать где расположен файл и только потом прочитать из него т.е. из ячеек памяти.
А, и ещё у вас добавляется преобразование типа, а это дополнительная трата времени.
В вашем случае проще один раз прочитать из Flash в переменную в RAM и с нею работать.
 
Последнее редактирование:

ART_HA

Member
Не понимаю… А читать только при запуске программы и загонять в переменную? Или читать по таймеру?
Нужно иметь возможность менять параметры во время работы, а не только перед работой.
По таймеру - это тоже "костыль".
Кстати, удобнее не по таймеру, а по счетчику. Например разрешать обновление параметров раз в 100 циклов.
Будет наблюдаться задержка реакции системы на изменение параметра. Это вполне допустимо.
 

ART_HA

Member
А вы сами подумайте, что быстрее считать значение переменной из ячеек памяти или сперва обратиться к файловой системе, прочитать где расположен файл и только потом прочитать из него т.е. из ячеек памяти.
Полагаю, что выигрыш по времени будет, но он окажется несущественным по причине, которую я назвал выше.
Практика - критерий истины. Потому и хотелось бы услышать отзыв того, кто это уже делал.

Кнопка режима: настройка - работа.
 

CodeNameHawk

Moderator
Команда форума
Кнопка режима: настройка - работа.
Это заменяется логикой работы программы.
Потому и хотелось бы услышать отзыв того, кто это уже делал.
Тогда скажите, что выполнится быстрее, одна команда или две такие же.
Так каждый делал преобразование типа и многие читали с файловой системы.
Кто вам запрещает сделать? Просто, в конце основного цикла, выводите значение миллис в сериал.
Один раз читая с флеш, а другой раз из файла и вопрос отпадет сам собою.
 

ART_HA

Member
Это заменяется логикой работы программы.
А логику-то кто будет задавать? Правильно - кнопка!!!

Тогда скажите, что выполнится быстрее, одна команда или две такие же.
Сейчас у меня "умещается" чтение одного параметра вроде как без сильного вреда для работы.
Вполне возможно, что после перехода на чтение переменной вместо чтения файла, будет "умещаться" чтение двух параметров.
А мне нужно, чтобы "умещались" как минимум четыре!!!

Так каждый делал преобразование типа и многие читали с файловой системы.
Кто вам запрещает сделать? Просто, в конце основного цикла, выводите значение миллис в сериал.
Прошу прощения, не понял.
Вы предлагаете удлинить время цикла путем ввода в него временнОй задержки?
 

CodeNameHawk

Moderator
Команда форума
А логику-то кто будет задавать? Правильно - кнопка!!!
Похоже, что кнопка умнее программиста, обычно он задает логику работы программы, в том числе обработки нажатия кнопки.
Вы предлагаете удлинить время цикла путем ввода в него временнОй задержки?
Это где вы такое вычитали?
Я описал как самому проверить длительность выполнее разных программ, той что вы предложили и той что я предложил.
 

CodeNameHawk

Moderator
Команда форума
Вполне возможно, что после перехода на чтение переменной вместо чтения файла, будет "умещаться" чтение двух параметров.
А может и всех десяти, если не больше, только, судя по тому, что вы описали, что оно вам не нужно, достаточно прочитать один раз при запуске и если надо, прочитать когда есть необходимость, когда ее перезапишите, ведь она сама не может поменяться. (Переменная, значение которой хранится во флеше (или файле, если хотите)).
 
Последнее редактирование:

ART_HA

Member
А может и всех десяти, если не больше, только, судя по тому, что вы описали, что оно вам не нужно, достаточно прочитать один раз при запуске и если надо, прочитать когда есть необходимость, когда ее перезапишите, ведь она сама не может поменяться. (Переменная, значение которой хранится во флеше (или файле, если хотите)).
Нет, задача стоит в возможности изменять по WiFi параметры прямо во время работы главного цикла и никак иначе.
Перезапуск и кнопка исключены. Если бы они были в данном случае допустимы, этой темы бы не было.
 

CodeNameHawk

Moderator
Команда форума
Да вы наверно не поверите, что если их менять не в главном цикле, то практически ничего не поменяется.

Допустим вы получили новые данные с названием сети и паролем, так в этом месте и проще всего переключиться к другой сети, это наверняка будет редкое явление.
 

ART_HA

Member
И как мой алгоритм работы может вам в этом помешать?
В данном случае помешает любой алгоритм. Задача в нахождении алгоритма, который помешает в минимальной степени.
К сожалению, у меня нет оснований считать Ваш алгоритм отвечающим этому требованию.

Лучше подскажите, существует ли механизм вызова прерывания при изменении содержимого файла по WiFi?
Потому как только что реализовал опрос каждого параметра через каждые 200 циклов - искажения сигнала жуткие... :(
 
Сверху Снизу