Arduino: Почему цикл while () с логическим аргументом приводит к стремительному росту динамической памяти? - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь установить связь между двумя радиочастотными передатчиками на платах Arduino Uno.


При запуске цикла while () в верхней части приведенного ниже фрагмента кода использование динамической памяти увеличивается до 205% (4,2 КБ), если я использую оператор '=='.

Однако, при использовании единственного «=» в качестве оператора присваивания в цикле, эта проблема не возникает (очевидно, код не функционирует должным образом, когда это имеет место).

Вот где это становится интересным. Полное удаление цикла while () и его содержимого не уменьшает использование динамической памяти. Так что мне кажется, что использование оператора присваивания в цикле фактически уменьшает использование динамической памяти всего эскиза (до 15% / 325 байт).

Как ни странно, это не проблема утечки, потому что даже полное удаление содержимого цикла while () не решает никаких проблем.

Я довольно новичок в использовании C ++ и Arduino, но предположим, что это может быть связано с присваиванием глобальных переменных ...

Любая помощь в поиске и устранении неисправностей, почему использование динамической памяти так высоко, будет высоко ценится!


Я кодирую в Arduino IDE (v1.8.5), пишу в Arduino Uno (чип ATMega328).

while (loop_var == true){
if (radio.sendWithRetry(TONODEID, &connection_checker, sizeof(connection_checker))){
  if (tick == 0) {
    Serial.print(F("Node ")); Serial.print(TONODEID); Serial.print(F(" detected. \n"));
    tick = 1;
  }
  loop_var = false;
} 
else {
  while (tock == 0){
    Serial.print(F("Node ")); Serial.print(TONODEID); 
    Serial.print(F(" - No ACK received, retrying... \n"));
    tock++;
  }
  loop_var = true;
}

1 Ответ

0 голосов
/ 28 июня 2018

Дело не в том, что происходит внутри цикла, а в том, что происходит снаружи.

Компилятор C ++, поставляемый в комплекте с Arduino, довольно умен. Он выясняет, можно ли достичь инструкции или нет. Если на большую объявленную переменную ссылаются только в той части кода, которая никогда не будет достигнута, при вычислении динамической памяти она не вычисляет объем памяти, необходимый для этой переменной.

Простой тестовый пример будет следующим.

int test[100],test2[100];
void loop() {
  bool data=true;
#ifdef WHILE_COMPARE
  while(data == true ){
#else
  while(data = true){
#endif
    for(int i=0;i<100;i++){
      test[i]=0;
    }
    data=false;
  }
#ifdef USE_TEST2
    for(int i=0;i<100;i++){
      test2[i]=0;
    }
#endif
}

Теперь, в зависимости от того, какая из следующих комбинаций объявлена, динамическая память изменяется следующим образом.

WHILE_COMPARE определено, USE_TEST2 определено, DM стреляет в 402 байта

WHILE_COMPARE не определено, USE_TEST2 определено, DM составляет 209 байтов

WHILE_COMPARE определено, USE_TEST2 не определено, DM составляет 209 байтов

WHILE_COMPARE не определено, USE_TEST2 не определено, DM составляет 209 байтов

Надеюсь, это поможет.

...