Память заканчивается. Варианты решения.
- Войдите на сайт для отправки комментариев
Здравствуйте! Делаю для себя проект и дошел до:
Скетч использует 24518 байт (79%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 1243 байт (60%) динамической памяти, оставляя 805 байт для локальных переменных. Максимум: 2048 байт.
Программа написана примерно на 50 процентов, ну и предполагаю что памяти флеш не хватит. да и оперативы тоже, ибо не все еще глобальные созданы....
Вариант перейти на мегу и подобные ей пока не рассматриваю. Одна из причин - ее нет, а наны есть.
По оптимизации кода уверен, что можно еще что-то сделать, но с моими познаниями что смог уже сделал. Ну может еще полтора килобайта смогу ужать. Как вариант убрать бутлоадер и еще полтора. Но так еще не делал, поэтому этот вариант на потом.
В коде нет ни String, ни Serial, флоат в одной единственной процедуре. Возможно(хотя это слово можно наверное убрать) неграмотно написан код. Память "забита" скорее всего LCD2004. Много строковых констант.... Еще вариант по сокращать строковые константы, но боюсь ими я много не освобожу...
везде, где возможно
lcd.setCursor(); lcd.print("Text");
lcd.setCursor(); lcd.print("Text");
lcd.setCursor(); lcd.print("Text");
Заменил на
void PrintText(const byte _col, const byte _row) {
lcd.setCursor(_col, _row); lcd.print("Text");
}
PrintText(0, 0); //ну и вызываю с разных мест
Исходник не выкладываю, хотя не секретный, не жалко, в 6 файлах под тысячу строк...
В общем вопрос такой: Решил программу разбить на два МК(нано). В одном только работа с экраном, а во втором основной алгоритм работы устройства. Соединить их думаю уже по Serial. Собс-но вопрос - имеет смысл моя идея. Никогда раньше не объединял ардуины для совместной работы. С чем мне придется столкнуться?
Без кода нам не ясно чем вы там память закакали ...
Соединить не проблема, только надо учесть что на стандартных платах аппаратный UART подключен к преобразователю USB-UART.
а где весь код программы?
Соединить не проблема, только надо учесть что на стандартных платах аппаратный UART подключен к преобразователю USB-UART.
Уже делали такое?
Чем это грозит, то что они подключены (аппаратный с USB)?
Грозит тем что их сложно заюзать для обмена. Придётся либо дорожки резать (тогда при заливке скетча через загрузчик - паять перемычки) или использовать SoftawareSerial со своими заморочками ...
В общем вопрос такой: Решил программу разбить на два МК(нано). В одном только работа с экраном, а во втором основной алгоритм работы устройства. Соединить их думаю уже по Serial. Собс-но вопрос - имеет смысл моя идея. Никогда раньше не объединял ардуины для совместной работы. С чем мне придется столкнуться?
ну это примерно как пытаться увезти бетонную плиту на двух "запорожцах" вместо одного грузовика.... :) эффективность этого решения примерно такая же :)
Разбив программу на 2 Нано - вы конечно вдвое увеличите память, но при этом получите массу нового для себя геморроя, связанного с обменом данными и координацией работы двух МК. И неизвестно, выиграете ли в сумме :)
Грозит тем что их сложно заюзать для обмена. Придётся либо дорожки резать (тогда при заливке скетча через загрузчик - паять перемычки) или использовать SoftawareSerial со своими заморочками ...
т.е даже если я на обоих ардуинах в их программах(скечах) не буду использовать пины D0 и D1. (кроме как для соединения между собой). По отдельности их прошью, и потом соединю проводами. В этом случае могут быть проблемы при передаче по UART между ними?
А какие проблемы? Связи не будет или будет нестабильна?
Я пока еще не начал разбивать программу на две, но уже вырисовываются проблемы. Но соб-но за этим я и обратился. Спасибо.
Согласен. Но с другой стороны интересно. Интересен сам вариант использования двух ардуин в единой задаче.
Может еще где пригодится такой опыт.
Нет, если затея бредовая, то конечно нет смысла заморачиваться...
В любом случае, если не по UART может еще как простенько связать две ардуины можно...?
Но с другой стороны интересно. Интересен сам вариант использования двух ардуин в единой задаче.
если интересно - то другое дело.
Но с чисто практической точки зрения в вашем случае в разы правильнее купить Мегу
Обычно первые строки программы активно отъедают память, так как с ними к программе линкуются разные библиотеки. Если в конце программы в использовании новых библиотек нет нужды, то может получиться так, что сотня строк кода даст прирост программы на сотни три байт. Пробовать надо. У Вас ещё 6 кбайт кода свободно. Туда много чего можно впихнуть. У меня крутиться программа, у которой только 2 байта свободного флэша осталось. Что бы влезть, пришлось дигиталрид и дигиталрайт переписать на ассемблер. Это сэкономило сколько то байт и программа влезла. Так что часто есть путь упихнуть всё в один чип. Иногда надо чем то пожертвовать. Или брать более ёмкий корпус. Благо выбор большой.
Странна. У мня ООП код в 1000 строк в Нану влазиит со свистом. Думаю, что б туда еще прикрутить
Странна. У мня ООП код в 1000 строк в Нану влазиит со свистом. Думаю, что б туда еще прикрутить
:)
У меня некоторые переменные объявлены и "наполовину закомментированы", на дальнейшее развитие событий...
А сейчас дай думаю расскоментирую и гляну как у меня дела... Но был удивлен. Памяти стало почему-то больше... свободной.
Так:
В ОЗУ понятно они добавились, но почему с флеша ушли?)
В ОЗУ понятно они добавились, но почему с флеша ушли?)
Как они могли оттуда уйти, если их там не было? ))
В ОЗУ понятно они добавились, но почему с флеша ушли?)
Как они могли оттуда уйти, если их там не было? ))
Не знаю.... Но размер флеша то изменился)
Странна. У мня ООП код в 1000 строк в Нану влазиит со свистом. Думаю, что б туда еще прикрутить
а вот если бы ты мог писать уложился в 500 строк )))
Бывает что просто перестановка строк местами приводит к изменению размера во флэше. Лиинкер по другому располагает модули. Или ещё что. Так что надо пробовать. Слова - уже кончается! это не правильно. Надо всё собрать, попробовать, покрутить и только тогда за знанием на форум идти. А так гадать на хрустальном шаре что там у тебя не вмещается не продуктивно.
Бывает что просто перестановка строк местами приводит к изменению размера во флэше. Лиинкер по другому располагает модули. Или ещё что. Так что надо пробовать.
Решил попробовать такой тест:
Действительно. Если начать по одной строчке расскоментировать, то результаты интересные
Меня удивило, что "умный" компилятор помнит какие константы он уже использовал (Test0 и Test1)
Но +22, -16, +14 - как он там это считает))
А я давно обратил внимание, что когда пишу код, то размер прыгает то в одну, то в другую сторону, но как-то думал, что это от "другого" зависит, а тут вон оно что...
А так гадать на хрустальном шаре что там у тебя не вмещается не продуктивно.
Да вопрос-то у меня в основном не в этом.... Если уж хочется на код посмотреть, то я могу его весь вывалить, но нужно?)
А так, по теме, уже посмотрел примеры использования связи двух ардуин по UART.... Буду смотреть пока в эту сторону. Ибо то, что я накодил, и что еще нужно, вряд ли я уложу в 30 кил...
print("Test0");
в итоге Test0 будет и в коде и займет место в ОЗУ и так со всеми константами
Это верно. Но константы все равны(размер) а откуда 22, 16, 14, 8 ?
Вот в ОЗУ четко по 6 байт прибавляется для новых констант, это логично... А уже "имеющихся там" - ноль байт - Это умно) Не ожидал такого поведения со строковыми константами.... Но понятно, что Test2 и TEST2 это разные, поэтому для последнего +6 байт...
Может я и умещу(уместю) еще все))) Нужно только еще раз пробежаться по строковым константам
0x00 добавляется как конец строки
Вот тест с макросом F()
В данном случае одинаковые константы не учитываются, флеша используется на 18 байт больше, но экономится ОЗУ на 66 байт
0x00 добавляется как конец строки
Это понятно. Про 6 байт в озу... пять символов и завершающий ноль...
А я про увеличение (но и в какой-то момент уменьшение) флеш памяти... Обратите внимание на +22, -16, +14
Исходя из этого, полагаю, что если в коде используются одинаковые строковые константы - то их лучше использовать без макроса F()
Просто надо одинаковые константы объявлять через const PROGMEM, а не пихать бездумно F() с одинаковым текстом ...
Вы тут байты экономите, где вы 50% обещанного кода собираетесь разпихать ???
Просто надо одинаковые константы объявлять через const PROGMEM, а не пихать бездумно F() с одинаковым текстом ...
Возможно. Я попробовал версию одинаковых констант без F().... В итоге результат немного не тот, но это и правильно. В любом случае где то мы выигрываем, значит где-то проиграем... и с прогмем тоже самое будет...
Вы тут байты экономите, где вы 50% обещанного кода собираетесь разпихать ???
:) Надеялся на чудо) Ну и про байты экономии - это в маленьких тестах.... На самом деле если пройтись по моей тысячи строк кода может и получится, как я уже в начале говорил, сэкономить килобайт....
Причем оперативы-то мне должно хватить...
Да нет, на самом деле я уже понимаю, что не умещу я программу, так и придется наверное делить ее на две ардуины...
Вы просто чего то намудрили ... Возьмите скетч Arduino transistor tester - в нем куча всего считается рисуется выводится и при этом он легко помещается в 32К...
https://create.arduino.cc/projecthub/plouc68000/ardutester-v1-13-the-arduino-uno-transistor-tester-dbafb4
Оно? Скачал, архив. Куча файлов. Открыл в ИДЕ... скомпилировал... Это какая-то шутка?
http://arduino.ru/forum/proekty/transistor-tester-arduino
Вы просто чего то намудрили ... Возьмите скетч Arduino transistor tester - в нем куча всего....
Я намудрил?))
http://arduino.ru/forum/proekty/transistor-tester-arduino
Вот где намудрили.... И это в хорошем смысле слова. Честно признаюсь, я там ничего не понял. Условной компиляцией никогда обширно не пользовался. Меня конечно очень сильно удивляет как так можно экономить ОЗУ, да и флеш тоже.... 5000 строк кода.... Понятное дело не от количества строк кода зависит размер, но тем не менее и глобальных переменных достаточно, и строковых констант....дефайнов... и все равно добиться таких результатов, нужно от и до знать свое дело. Но с моим уровнем, а сейчас вообще редко выпадает случай посидеть вечером дома покодить для души... Нет, это я не смогу понять)
Если кто сможет на пальцах объяснить в чем суть в transistor-tester-arduino чем там так добились экономии. Может все дело в условной компиляции??? Вот реально, выкинуть бы все то что не попадает в компиляцию из этих пяти тыс. строк и посмотреть реальный исходник что там компилится....
Но молодцы, конечно, кто умеет так писать... Снимаю шляпу
У меня конечно "мильён" вопросов по данному скечу(хотя это уже не набросок)), но понимаю, что никто мне на них отвечать не будет, но..... Вот для чего так делается
.....
Что бы запутать таких как я?
Так пишут программы под разные платы дисплеи условия ...
Раскомментировал нужные устройства, закомментировал ненужные и откомпилировал ...
Так пишут программы под разные платы дисплеи условия ...
Раскомментировал нужные устройства, закомментировал ненужные и откомпилировал ...
Ну это и понятно... В итоге если сейчас убрать из этого скеча, все, что не нужно, допустим, для моей наны... Хотелось бы посмотреть что останется))
Ладно, я считаю, что данный пример мне мало чем поможет.... очень уж запутанно. А вот что-то подобное, но не для всех видов плат, а для одной.... я бы посмотрел. И еще беда с английским :(
ТС, дорогой! Я понимаю, что ты стесняешься привести свой код.Мы и правда не самые тактичные люди на свете! ;)), но не мог бы ты написать назначение кода, ну как бы ТЗ, где ТЗ - Техническое Задание, а не Точка Зрения. Тут многие люди писали много разного кода, я полагаю, что тебе сразу ответят, войдёт ли это в Нанку (на начальном уровне мастерства программиста).
И еще беда с английским :(
Я очень добр в Шаббат и не стану сразу глумиться. Просто предупреждение - таких признаний на форумах по программированию и/или электронике следует избегать. Это те сферы знаний, в которых буквально всё происходит исключительно на аглицком. Часто случается, что после подобных признаний общение переходит в чистый глум и взаимное калометание, сорри. Мне и сейчас очень трудно себя сдерживать, но я стараюсь! ;))
Я не первый раз на форуме(ах) и знаю к чему могут привести такие высказывания. Но что есть, то есть. Я сказал честно. И когда читаю глум в других ветках, то иногда на стороне глумящихся, а иногда на стороне, над кем глумятся...
Хотите глумится - глумитесь. Просто нужно перед тем как глумится, оставаться человеком. Программирование - это мое хобби . Я неоднократно во всех своих вопросах это повторял и буду повторять. Не английский, ни языки программирования никогда и нигде не изучал основательно, но по мере возможности для себя дома... Но я всегда с уважением отношусь к советам, к примерам, ко всему что тоже с уважением... Еще раз, хотите глумится - глумитесь...
ТС, дорогой! Я понимаю, что ты стесняешься привести свой код.
Если хочешь, я, как и говорил выше могу выложить свой код... Может быть даже меня носом ткнут, где я чего делаю не правильно. Я не столько стесняюсь кода, сколько понимаю, что никому в нем разбираться не захочется и вываливать несколько файлов сюда пока не вижу смысла.... тем более что ты уже собрался глумится;) Спасибо.
AsNik, вообще-то вас не просили показать код - а просили рассказать, в чем суть Вашего творения. Что за программу вы пишете и что еще собрались в нее добавить. что так уверены, что она в Нану не войдет.
Если вы даже этого не готовы сказать - то честно говоря я считаю дальнейшее обсуждение бессмысленным.
Хм.. Даже не знаю как кратко рассказать что, для чего и что будет... Шесть(максимум) сенсоров, 8 каналов и куча информации на LCD
У меня изначально вопрос был немного в другом русле, теперь уже даже не знаю как все повернется....
Вот основной файл, где объявлены практически все глобальные переменные...
Наверное я много хочу от наны ( Или просто реально все не правильно делаю (
За код... конечно немного стыдно, но я не говорю, что я крутой программер на си.... Но на данный момент код еще ужасен тем, что я пытаюсь его оптимизировать, и некоторые моменты могут быть просто ужасными. Ну и комментарии - это отдельная песня)
И вообще уже есть желание забросить его) Ну т.е. откатится немного назад, перед началом оптимизации и попробовать распихать по двум ардуинам.
Ох. Партизан Боснюк! ;). Ни слова не сказал супостатам!
Дорогой! Нужно разоблачаться перед Партией! А то недолго и билет на стол положить!
ТС , возьми мегу, не сношай мозг. Опыт придет позже , будешь на нане собирать . В таком длинном коде кроме проблем с не влезанием еще стопицот ошибок будет , которые придется искать . а так хоть одной проблемой меньше . Вот когда на меге заработает будешь оптимизировать. Ты пишешь меги нет, а что это такая проблема ее купить ?
Я могу даже старенький ПК для этого выделить), все равно валяется... и написать программу на делфи.... Хотя и делфи-то уже забыл, лет пятнадцать не писал... А вот на мегу пока средств лишних нет. Да и задача не в том, что бы просто сделать данный девайс, а с... со спортивным интересом. Я думаю, что мою задачу можно и в нану уложить. И у меня два варианта решения. (Оба полезные) Оптимизация кода и разделение одного устройства на два. С первым, я так понял у меня есть проблема ( .... Ну а второй почему бы и нет?
По кусочку исходника если кто что скажет полезного и поучительного, рад почитать. Спасибо всем.
Да поставь же ты задачу, наконец!!! Сенсоры, каналы, экраны, my ass!!!
Дискутировать без кода или хотя бы задачи - бред. По стилю кусочка видна стратегическая ошибка, но она может иметь или не имеет последствий. Напиши простым языком, что именно ты строишь.
Ну и вишенкой - почти 100%, что в Нанку это влезает. ;)
И в довесок просто про всякую домашнюю автоматику: Нано для макета части идеи, в боевое применение потом все собрать в Мегу. Это уже просто совет.
Тут вступит в силу парадокс HDD... сколько бы не было все равно мало
Я не представляю возможным как мне поставить задачу :( Вопрос в теме про варианты решения был как бы общим. Т.е. варианты такие: убрать веские типы (float, string...) Serial.. Баласт между ПРОГМЕМ, F() и ОЗУ.... Разделение устройства на части.... Условная компиляция - но в данном, моем, случае я ее не рассматриваю...
Потому, как делаю под одну плату, но.... Есть вариант прикрутить все же эту условную, и я попробовал. Например выкинуть из кода либы и работу с сенсорами, которые физически не подключены, но возможность в коде предусмотрена. Например все датчики будут BME, тогда код других датчиков не компилировать, но тут нужно будет перепрошивать, если вдруг что поменяется... И не так уж и много освобождается места от выключения датчиков... я уже проверил это.
Вот! Вот что за ошибку Вы увидели? Ну я могу еще выложить код, который считаю что сжирает много памяти, это отрисовка дисплея.
Да ничего особенного. Контроль за температурой и влажностью. Сенсоры мерят, а каналы включают нагрузку, типа обогрев и вентиляция.... все как у всех и ничего необычного.... Но тут дело не в этом. Я даже не дошел до основных алгоритмов работы устройства, а память уже подходит к концу... Сейчас в устройстве только реализована отрисовка почти(но еще не всё:)) всего что нужно на LCD и чтение сенсоров...
И вот эта отрисовка и забивает память. Сразу говорю, что много избыточной информации ...хочу видеть. Можно половину повыкидывать из кода, но.... Это я точно сделаю и сам. Предыдущий девайс работает с прошлого года. Вот на основе него (а там много было не правильно реализовано) решил сделать с нуля и немного по другому.
Жаль что памяти не хватает не только в камнях, но и в моей балванке, которая на плечах.... Многие вещи, которые в прошлом году делал, уже за лето забыл как)
Добавил немного оптимизма;)
Спасибо. Верно. Вот тут я думаю как раз нужен опыт объединения МК (типа сети, может CAN) для решения ими одной (или несколько) целей...
А вот на мегу пока средств лишних нет.
Нет, ну если нет средств даже на расходники, тогда следует выбрать хобби подешевле.
Да и задача не в том, что бы просто сделать данный девайс, а с... со спортивным интересом.
Спортивный интерес и обращение на форум за советом, вроде как, вещи взаимоисключающие. Нет?
PS. Если есть старенький комп, который можно приспособить к задаче, может имеет смысл делить задачу не на две Ардуины, а на комп и Ардуину: ресурсоемкую часть оставить компу, а работу с периферией возложить на Ардуину?
Тут вступит в силу парадокс HDD... сколько бы не было все равно мало
Т.е. проблема имеет не аппаратный, а психологический характер.
Т.е. проблема имеет не аппаратный, а психологический характер.
Я не представляю возможным как мне поставить задачу...
Ds. Задача никогда не будет решена. Даже на кластере из 1000 суперкомпьютеров.
Нет, ну если нет средств даже на расходники, тогда следует выбрать хобби подешевле.
Их и не будет. Если раскидываться ими на право и на лево... У меня есть другие МК. Я знаю, что если куплю Мегу, то либо сделаю на ней, а другие будут валятся, либо и ее положу в угол, а сделаю по другому...
Поэтому покупка меги пока не рассматривается именно для этого устройства, но в целом.... может.
Сэр искренне полагает, что можно решить задачу, не имея никаких представлений о том, в чем эта задача заключается?
Вот не люблю эту печатную беседу....( Задачу не представляю возможности в кратце рассказать здесь, а у себя в голове эта задача четкая, но не маленькая ;)