Serial.println - как правильно???

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброго времени суток!

Подскажите добрые люди, только желательно по существу. Как правильно сделать систему дебага в сериал, чтобы динамическая память не улетучивалась. 

Если в тупую писать Serial.println("всякая .... "); то через какое-то количество итераций получаем  закономерно некомпилируемый проект. Сначала что-то типа

"Глобальные переменные используют 1816 байт (88%) динамической памяти, оставляя 232 байт для локальных переменных. Максимум: 2048 байт.

Недостаточно памяти, программа может работать нестабильно."
 
А затем уж
"Глобальные переменные используют 2482 байт (121%) динамической памяти, оставляя -434 байт для локальных переменных. Максимум: 2048 байт."
 
Использование PROGMEM не вариант, скетч занимает 95% памяти.
 
Хочу написать функцию, которую потом удобно применять по всему скетчу, примерно такую
void Print(char str[]) {
  char *c = new char[strlen(str)];
  c = str;
  Serial.println(c);
  delete [] c;
}

Но, конкретно так не работает. А как сделать правильно не соображу.

 

 
 

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Память будет отъедаться в любом случае. Чудес не бывает

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

PROGMEM занимает 95% ? что ж такого можно написать....

 

один из вариантов: хранить строки текста об ошибках в PROGMEM.
если строка статическая то можно так:
 

Serial.println(F("error");

 

gonzales
Offline
Зарегистрирован: 13.07.2015

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

gonzales
Offline
Зарегистрирован: 13.07.2015

andycat пишет:

PROGMEM занимает 95% ? что ж такого можно написать....

 

один из вариантов: хранить строки текста об ошибках в PROGMEM.
если строка статическая то можно так:
 

Serial.println(F("error");

 

Я этого не писал

gonzales
Offline
Зарегистрирован: 13.07.2015

Я, если честно, не понимаю, почему 

Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd01");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd02"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd03");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd04"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd05");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd06"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd07");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd08"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd09");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd10"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd11");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd12");  
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd21");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd22"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd23");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd24"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd25");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd26"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd27");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd28");
 
должно расходовать всю память контроллера. 
По идее должно быть так, есть функция, принимающая аргумент, она выделяет необходимый объем памяти, после отработки функции, память, выделенная под аргументы должна освобождаться.
И не важно, сколько раз я вызвал эту функцию. 
Почему этого не происходит с Serial.prinln - мне не понятно
v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Она и освобождает. Но сам сериал тоже требует ресурсов

gonzales
Offline
Зарегистрирован: 13.07.2015

v258 пишет:

Она и освобождает. Но сам сериал тоже требует ресурсов

Кто же спорит, но почему с каждым выводом ему их нужно все больше и больше?...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

макрос  F()

gonzales
Offline
Зарегистрирован: 13.07.2015

wdrakula пишет:

макрос  F()

Я же писал, флеш-памяти практически нет, негде хранить 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gonzales пишет:

Я, если честно, не понимаю, почему 

Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd01");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd02"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd03");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd04"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd05");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd06"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd07");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd08"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd09");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd10"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd11");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd12");  
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd21");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd22"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd23");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd24"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd25");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd26"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd27");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd28");
 
должно расходовать всю память контроллера. 
По идее должно быть так, есть функция, принимающая аргумент, она выделяет необходимый объем памяти, после отработки функции, память, выделенная под аргументы должна освобождаться.
И не важно, сколько раз я вызвал эту функцию. 
Почему этого не происходит с Serial.prinln - мне не понятно

А сами вот эти Ваши строки

"fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd28"

они, по-Вашему, памяти не занимают? Их каждый раз из кладовки достают? Они всё и отжирают, причём тут функция-то?

gonzales
Offline
Зарегистрирован: 13.07.2015

ЕвгенийП пишет:

gonzales пишет:

Я, если честно, не понимаю, почему 

Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd01");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd02"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd03");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd04"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd05");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd06"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd07");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd08"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd09");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd10"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd11");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd12");  
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd21");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd22"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd23");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd24"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd25");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd26"); 
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd27");
 Serial.println("fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd28");
 
должно расходовать всю память контроллера. 
По идее должно быть так, есть функция, принимающая аргумент, она выделяет необходимый объем памяти, после отработки функции, память, выделенная под аргументы должна освобождаться.
И не важно, сколько раз я вызвал эту функцию. 
Почему этого не происходит с Serial.prinln - мне не понятно

А сами вот эти Ваши строки

"fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd28"

они, по-Вашему, памяти не занимают? Их каждый раз из кладовки достают? Они всё и отжирают, причём тут функция-то?

я правильно понял, что они не входят в память, занимаемую прошивкой, а сразу попадают в ROM?

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Они есть и в ROM и копируются в RAM на старте скетча.

Макрос F() отставит их только в ROM

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

gonzales пишет:

v258 пишет:

Она и освобождает. Но сам сериал тоже требует ресурсов

Кто же спорит, но почему с каждым выводом ему их нужно все больше и больше?...

Видимо, так написана ваша программа 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

gonzales пишет:

я правильно понял, что они не входят в память, занимаемую прошивкой, а сразу попадают в ROM?

ROM - это и есть прошивка.

gonzales
Offline
Зарегистрирован: 13.07.2015

andriano пишет:

gonzales пишет:

я правильно понял, что они не входят в память, занимаемую прошивкой, а сразу попадают в ROM?

ROM - это и есть прошивка.

сорян, в RAM конечно я имел в виду.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

А в RAM они откуда попадают? Верно, из ROM. Используй макрос F(), и они по крайней мере RAM засорять не будут

gonzales
Offline
Зарегистрирован: 13.07.2015

v258 пишет:

А в RAM они откуда попадают? Верно, из ROM. Используй макрос F(), и они по крайней мере RAM засорять не будут

Всем спасибо, я все понял

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

gonzales пишет:

  void Print(char str[]) { 
  char *c = new char[strlen(str)];
  c = str;
  Serial.println(c);
  delete [] c;
}

А в чем смысл таких заморочек? Не проще ли передать по ссылке? Ну я как бы сейчас про именно этот кусок, хотя может и progmem тоже относится к этому.

 Или я не понял чего-то ?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

BOOM пишет:

gonzales пишет:

  void Print(char str[]) { 
  char *c = new char[strlen(str)];
  c = str;
  Serial.println(c);
  delete [] c;
}

А в чем смысл таких заморочек? Не проще ли передать по ссылке? Ну я как бы сейчас про именно этот кусок, хотя может и progmem тоже относится к этому.

 Или я не понял чего-то ?

А как еще можно получить бешенный перерасход памяти? Вот такими заморочками ))

ЗЫ: при передаче массива в функцию в качестве параметра фактически в нее передается указатель на первый элемент массива, так что ничего там делать вообще не нужно. Тем более лепить копию массива ))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

v258 пишет:
Тем более лепить копию массива ))
А потом ещё и не освобождать её, как ТС делает. Это он для надёжности, наверное, чтобы уж точно засрать память.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

v258 пишет:
Тем более лепить копию массива ))

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А разве delete [] не должен освобождать память? Что-то я не понимаю, почему память не освобождается...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

brokly, просто шар подсказывает, что там была попытка создать копию массива. Помните, как на выставке абстрактной живописи, ребёнок у мамы спрашивал:

- А это что тут?
- Это художник хотел изобразить закат.
- Не получилось?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:

А разве delete [] не должен освобождать память? Что-то я не понимаю, почему память не освобождается...

Должна освобождать по тому указателю, к которому применяется. Здесь же указатель уже засран в строке №3, потому delete здесь освободит ХЗ что и ХЗ как, но только не то, что запрашивалось в строке №2.

Если хочешь, чтобы delete освободил то, что запросил new - не сри в указатель, он не должен меняться.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BOOM пишет:

А разве delete [] не должен освобождать память? Что-то я не понимаю, почему память не освобождается...

Должен то он должен...

Вот сами проследите внимательно, что именно этот самый "он" пытается освободить.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Понял! Спасибо!