Serial.println использует слишком много памяти (не строки)

Я хочу как можно быстрее передать тысячи показаний аналоговых датчиков вибрации в массив, а затем проанализировать их. Вот мой набросок:

const int pSensor1 = A0;
const int aSize=10000;

int a[aSize];

void setup() 
{
  pinMode(pSensor1, INPUT);
  Serial.begin(9600);
}

void loop() 
{
  for (int i = 0; i < aSize; i++) a[i] = analogRead(pSensor1);

  int RMS = 0;
  for (int i = 0; i < aSize; i++) RMS += pow(a[i], 2);
  RMS = sqrt(RMS/aSize);

  Serial.println("Hello");
}

Это компилируется и работает нормально. Моя проблема возникает, когда я пытаюсь изменить последнюю строку на:

Serial.println(RMS);

Я получаю сообщение об ошибке:

Arduino: 1.8.12 (Windows 10), плата: "Arduino Nano, ATmega328P"

Sketch использует 3270 байт (10%) места для хранения программ. Максимум 30720 байт. Глобальные переменные используют 20188 байт (985%) динамического памяти, оставив -18140 байт для локальных переменных. Максимум 2048 байт. раздел данных превышает доступное место на плате Недостаточно Память; см. http://www.arduino.cc/en/Guide/Troubleshooting#size. советы по уменьшению своего следа. Ошибка компиляции для платы Arduino Нано.

Почему при последовательной печати одной переменной с плавающей запятой используется 985 % динамической памяти?

, 👍1


1 ответ


Лучший ответ:

2

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

Подумайте об этом. Используемый вами Arduino имеет 2000 байт памяти. Один int занимает 2 байта. Вы хотите 10 000 из них. Это 20 000 байт памяти. 20 000 байт никогда не поместятся в 2 000 байт. Вам нужно выбрать более разумное количество образцов.

,

Это имеет смысл, спасибо., @Benjamin Jordan

По поводу «_Вам нужно выбрать более разумное количество сэмплов_»: 10 000 — это вполне разумное количество семплов для Arduino Nano. Однако **сохранение** выборок перед вычислением среднеквадратичного значения **не** целесообразно., @Edgar Bonet

Хорошо, может быть, я должен был сказать это по-другому., @Delta_G