Балансировка ограниченного объема памяти Arduino с уменьшением скорости, если выводить все по мере измерения?
Я работаю над простой системой сбора данных, основанной на Arduino Uno. В идеале каждый прогон должен собирать до 10 тысяч точек данных (все двойные). Очевидно, что Arduino не способен вместить все это сразу. Однако, как и следовало ожидать, распечатка данных по мере их получения значительно замедляет процесс (примерно в 7 раз). Я огляделся, чтобы выяснить, существует ли стандартный способ решения этой проблемы в мире Ардуино, но ничего не нашел. Я родом из той среды, где память никогда не была проблемой, поэтому я не так хорошо разбираюсь в этой стороне вещей.
Очевидно, я не ожидаю совершенства, но любая информация или источники были бы полезны.
@Ben, 👍0
Обсуждение3 ответа
Не используйте String
и другие динамические выделенные объекты в своем коде. Нет никаких причин для замедления последовательного вывода, только неэффективное управление памятью.
Что вы подразумеваете под своим вторым предложением? Почему именно нет никаких причин для того, чтобы последовательный вывод замедлял работу?, @chrisl
На самом деле я не использую строки, и все переменные, которые у меня есть, распределены в стеке. Я склонен не согласиться с вами в том, что печать не замедляет работу программ; это всегда был мой опыт., @Ben
Последовательное использование кольцевого входного и выходного буфера. Это означает, что вы можете вывести некоторое количество символов в этот буфер. Если вы отправляете 10k в два раза больше, вы переполняете этот буфер. Затем вы должны дождаться передачи символов с помощью UART. Возможно, это вы рассматриваете как замедление печати. Но скорость передачи для последовательной линии составляет скорость передачи данных / 10 байт в секунду (один символ состоит из 1 начального бита, 8 битов данных и одного стоп-бита) Эта скорость гарантируется hw UART и не изменяется со временем., @Peter Plesník
Передача Si по последовательному каналу замедляет работу кода, поскольку ему приходится ждать фактической отправки данных. Извините, ваш ответ не имеет для меня особого смысла в данном контексте, @chrisl
Все дело в выборе правильного инструмента для данной работы.
В данный момент вы пытаетесь уместить 50 клоунов в мини. Хотя есть способы сделать это (расширяя "мини" за счет дополнительного "пространства"), это не то, что вы обычно делаете.
Вместо этого вы бы наняли тренера.
Если у вас есть сценарий, в котором вам нужно хранить больше данных, чем может хранить Uno, тогда вы обычно используете другую плату с более мощным чипом.
Там их много, многие из них дешевле, чем Уно ...
Если вы отчаянно хотите использовать Uno, то:
- Уменьшите размер данных: рассмотрите возможность использования переменных меньшего размера, таких как 16-битные целые числа и арифметика с фиксированной запятой, вместо значений с плавающей запятой.
- Улучшите передачу данных: отправляйте двоичные данные вместо данных в формате ASCII и увеличьте скорость передачи данных до максимально возможной
- Подумайте о добавлении внешнего хранилища, такого как микросхема SPI SRAM или SD-карта.
Мое решение - использовать FRAM, это намного быстрее, чем печать, и имеет почти неограниченные циклы чтения и записи. Он также энергонезависим, поэтому при сбое питания данные не сохраняются. Они могут быть приобретены I2C или SPI по вашему усмотрению. В прошлом году я купил устройства 32K x 8 по цене менее 6,00 долларов у моего любимого китайского поставщика. Вы можете рассматривать его как один большой кольцевой буфер и печатать из него во время загрузки в него данных.
- Файловая система внешней флэш-памяти
- Влияет ли LabVIEW Linx на скорость связи с Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Как преобразовать ШИМ 0-5В в ШИМ 0-12В
- Выделение строковой памяти Arduino
- Spiffs против Eeprom на esp8266
- Регулятор скорости для потолочного вентилятора 220 В переменного тока 100 Вт
Вы пробовали более высокую скорость передачи данных? И передача двоичных данных вместо текста ASCII? Без кода больше нечего сказать, кроме как получить микроконтроллер с большим объемом памяти, @chrisl
Я увеличил скорость передачи данных, но я не знаком с идеей отправки двоичных данных вместо ASCII. Я посмотрю на это. Есть ли идея в том, что он отправляет биты, а не байты? И я боялся, что ты собираешься сказать эту последнюю часть., @Ben
похоже, вам нужно что-то более новое / лучшее, чем Uno. Мне нравится esp8266, даже без включенного Wi-Fi., @dandavis
Вы все еще отправляете байты. Но 1 байт может содержать число от 0 до 255. Если вы хотите отправить 255 в формате ASCII, вам уже нужно 3 байта для этого. Хотя я бы поддержал дандависа в этом, вам будет намного лучше с лучшим микроконтроллером, @chrisl