Serial.println - как правильно???
- Войдите на сайт для отправки комментариев
Ср, 16/02/2022 - 17:28
Доброго времени суток!
Подскажите добрые люди, только желательно по существу. Как правильно сделать систему дебага в сериал, чтобы динамическая память не улетучивалась.
Если в тупую писать 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; }
Но, конкретно так не работает. А как сделать правильно не соображу.
Память будет отъедаться в любом случае. Чудес не бывает
PROGMEM занимает 95% ? что ж такого можно написать....
один из вариантов: хранить строки текста об ошибках в PROGMEM.
если строка статическая то можно так:
Так я как раз и хочу освободить память, которую заняла строка, выводимая в сериал.
PROGMEM занимает 95% ? что ж такого можно написать....
один из вариантов: хранить строки текста об ошибках в PROGMEM.
если строка статическая то можно так:
Я этого не писал
Я, если честно, не понимаю, почему
Она и освобождает. Но сам сериал тоже требует ресурсов
Она и освобождает. Но сам сериал тоже требует ресурсов
Кто же спорит, но почему с каждым выводом ему их нужно все больше и больше?...
макрос F()
макрос F()
Я же писал, флеш-памяти практически нет, негде хранить
Я, если честно, не понимаю, почему
А сами вот эти Ваши строки
"fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd28"
они, по-Вашему, памяти не занимают? Их каждый раз из кладовки достают? Они всё и отжирают, причём тут функция-то?
Я, если честно, не понимаю, почему
А сами вот эти Ваши строки
"fdadsdabjdsbvdjvbacxlvb ds fhds hfdjks ahfjkdl sahfdjk lsahfdjksl afhjd28"
они, по-Вашему, памяти не занимают? Их каждый раз из кладовки достают? Они всё и отжирают, причём тут функция-то?
я правильно понял, что они не входят в память, занимаемую прошивкой, а сразу попадают в ROM?
Они есть и в ROM и копируются в RAM на старте скетча.
Макрос F() отставит их только в ROM
Она и освобождает. Но сам сериал тоже требует ресурсов
Кто же спорит, но почему с каждым выводом ему их нужно все больше и больше?...
Видимо, так написана ваша программа
я правильно понял, что они не входят в память, занимаемую прошивкой, а сразу попадают в ROM?
ROM - это и есть прошивка.
я правильно понял, что они не входят в память, занимаемую прошивкой, а сразу попадают в ROM?
ROM - это и есть прошивка.
сорян, в RAM конечно я имел в виду.
А в RAM они откуда попадают? Верно, из ROM. Используй макрос F(), и они по крайней мере RAM засорять не будут
А в RAM они откуда попадают? Верно, из ROM. Используй макрос F(), и они по крайней мере RAM засорять не будут
Всем спасибо, я все понял
А в чем смысл таких заморочек? Не проще ли передать по ссылке? Ну я как бы сейчас про именно этот кусок, хотя может и progmem тоже относится к этому.
Или я не понял чего-то ?
А в чем смысл таких заморочек? Не проще ли передать по ссылке? Ну я как бы сейчас про именно этот кусок, хотя может и progmem тоже относится к этому.
Или я не понял чего-то ?
А как еще можно получить бешенный перерасход памяти? Вот такими заморочками ))
ЗЫ: при передаче массива в функцию в качестве параметра фактически в нее передается указатель на первый элемент массива, так что ничего там делать вообще не нужно. Тем более лепить копию массива ))
А где тут копия массива ? По-моему тут выделяется кусок памяти размером с массив, который никогда не освобождается.
А разве delete [] не должен освобождать память? Что-то я не понимаю, почему память не освобождается...
brokly, просто шар подсказывает, что там была попытка создать копию массива. Помните, как на выставке абстрактной живописи, ребёнок у мамы спрашивал:
- А это что тут?
- Это художник хотел изобразить закат.
- Не получилось?
А разве delete [] не должен освобождать память? Что-то я не понимаю, почему память не освобождается...
Должна освобождать по тому указателю, к которому применяется. Здесь же указатель уже засран в строке №3, потому delete здесь освободит ХЗ что и ХЗ как, но только не то, что запрашивалось в строке №2.
Если хочешь, чтобы delete освободил то, что запросил new - не сри в указатель, он не должен меняться.
А разве delete [] не должен освобождать память? Что-то я не понимаю, почему память не освобождается...
Должен то он должен...
Вот сами проследите внимательно, что именно этот самый "он" пытается освободить.
Понял! Спасибо!