Балансировка ограниченного объема памяти Arduino с уменьшением скорости, если выводить все по мере измерения?

Я работаю над простой системой сбора данных, основанной на Arduino Uno. В идеале каждый прогон должен собирать до 10 тысяч точек данных (все двойные). Очевидно, что Arduino не способен вместить все это сразу. Однако, как и следовало ожидать, распечатка данных по мере их получения значительно замедляет процесс (примерно в 7 раз). Я огляделся, чтобы выяснить, существует ли стандартный способ решения этой проблемы в мире Ардуино, но ничего не нашел. Я родом из той среды, где память никогда не была проблемой, поэтому я не так хорошо разбираюсь в этой стороне вещей.

Очевидно, я не ожидаю совершенства, но любая информация или источники были бы полезны.

, 👍0

Обсуждение

Вы пробовали более высокую скорость передачи данных? И передача двоичных данных вместо текста ASCII? Без кода больше нечего сказать, кроме как получить микроконтроллер с большим объемом памяти, @chrisl

Я увеличил скорость передачи данных, но я не знаком с идеей отправки двоичных данных вместо ASCII. Я посмотрю на это. Есть ли идея в том, что он отправляет биты, а не байты? И я боялся, что ты собираешься сказать эту последнюю часть., @Ben

похоже, вам нужно что-то более новое / лучшее, чем Uno. Мне нравится esp8266, даже без включенного Wi-Fi., @dandavis

Вы все еще отправляете байты. Но 1 байт может содержать число от 0 до 255. Если вы хотите отправить 255 в формате ASCII, вам уже нужно 3 байта для этого. Хотя я бы поддержал дандависа в этом, вам будет намного лучше с лучшим микроконтроллером, @chrisl


3 ответа


-1

Не используйте String и другие динамические выделенные объекты в своем коде. Нет никаких причин для замедления последовательного вывода, только неэффективное управление памятью.

,

Что вы подразумеваете под своим вторым предложением? Почему именно нет никаких причин для того, чтобы последовательный вывод замедлял работу?, @chrisl

На самом деле я не использую строки, и все переменные, которые у меня есть, распределены в стеке. Я склонен не согласиться с вами в том, что печать не замедляет работу программ; это всегда был мой опыт., @Ben

Последовательное использование кольцевого входного и выходного буфера. Это означает, что вы можете вывести некоторое количество символов в этот буфер. Если вы отправляете 10k в два раза больше, вы переполняете этот буфер. Затем вы должны дождаться передачи символов с помощью UART. Возможно, это вы рассматриваете как замедление печати. Но скорость передачи для последовательной линии составляет скорость передачи данных / 10 байт в секунду (один символ состоит из 1 начального бита, 8 битов данных и одного стоп-бита) Эта скорость гарантируется hw UART и не изменяется со временем., @Peter Plesník

Передача Si по последовательному каналу замедляет работу кода, поскольку ему приходится ждать фактической отправки данных. Извините, ваш ответ не имеет для меня особого смысла в данном контексте, @chrisl


3

Все дело в выборе правильного инструмента для данной работы.

В данный момент вы пытаетесь уместить 50 клоунов в мини. Хотя есть способы сделать это (расширяя "мини" за счет дополнительного "пространства"), это не то, что вы обычно делаете.

Вместо этого вы бы наняли тренера.

Если у вас есть сценарий, в котором вам нужно хранить больше данных, чем может хранить Uno, тогда вы обычно используете другую плату с более мощным чипом.

Там их много, многие из них дешевле, чем Уно ...

Если вы отчаянно хотите использовать Uno, то:

  • Уменьшите размер данных: рассмотрите возможность использования переменных меньшего размера, таких как 16-битные целые числа и арифметика с фиксированной запятой, вместо значений с плавающей запятой.
  • Улучшите передачу данных: отправляйте двоичные данные вместо данных в формате ASCII и увеличьте скорость передачи данных до максимально возможной
  • Подумайте о добавлении внешнего хранилища, такого как микросхема SPI SRAM или SD-карта.
,

0

Мое решение - использовать FRAM, это намного быстрее, чем печать, и имеет почти неограниченные циклы чтения и записи. Он также энергонезависим, поэтому при сбое питания данные не сохраняются. Они могут быть приобретены I2C или SPI по вашему усмотрению. В прошлом году я купил устройства 32K x 8 по цене менее 6,00 долларов у моего любимого китайского поставщика. Вы можете рассматривать его как один большой кольцевой буфер и печатать из него во время загрузки в него данных.

,