Жиреет скетч
- Войдите на сайт для отправки комментариев
Сб, 02/02/2019 - 23:50
Проект предназначен (в том числе) для обмена с mqtt - брокером, но не суть. Проблема в том что размер скетча подошёл к критическим 30кБ скомпилированного кода, а не реализована ещё наверно половина. Начал разбираться, что за чёрт. Оказалось, что при вызове библиотченых фенкции (в частности PubSubClient) скетч жиреет просто нереально. К примеру во многих местах приходится публиковать данные, что то типа
mqtt.publish( "info/armed", armed ? "1":"0" );
И каждый ска вызов одной и той же функции прибавляет к коду пату - тройку сотен байт. Что за бред, компилятор создаёт экземпляр фунции при каждом её вызове что ли?
Добро пожаловать из мира мигающих светодиодов в мир "Где мои байты, чувак". Анализ вызова отдельной функции тут ничего может и не дать. Свинья может быть зарыта в любом месте исходного кода.
кто ж на ардуине сетевые стеки реализует? - берите ЕСП8266 - у нее 256Кфлеша и порядка 80К оперативки
А ардуины подходят только для ногодрыгов
кто ж на ардуине сетевые стеки реализует? - берите ЕСП8266 - у нее 256Кфлеша и порядка 80К оперативки
А ардуины подходят только для ногодрыгов
При всем уважении.... Т е учиться нормально программировать при ограниченных ресурсах вы призывать людей не хотите?
кто ж на ардуине сетевые стеки реализует? - берите ЕСП8266 - у нее 256Кфлеша и порядка 80К оперативки
А ардуины подходят только для ногодрыгов
Ну, там, здоровый образ жизни, фитнес там ...
кто ж на ардуине сетевые стеки реализует? - берите ЕСП8266 - у нее 256Кфлеша и порядка 80К оперативки
А ардуины подходят только для ногодрыгов
Конечно не решение, очевидно же что если у ТС скетч жиреет от библиотеки, значит надо её выкинуть и переписать самому.
Может он там строки адские к каждому запросу приделывает. А думает, что либа виновата.
Никакие не адские, вызывается одни и те же функции с одними и теми же топиками и короткими пэйлоадами.
берите ЕСП8266
Нужен GSM
если у ТС скетч жиреет от библиотеки, значит надо её выкинуть и переписать самому.
Это крайний вариант
Это крайний вариант
Крайний с какого края?
С края лени. На кой чёрт тогда библиотеки
Ну, посмотрите, может там эта publish (или state) - inline, Если так - уберите inline (и вынесете в другой файл) - перестанет расти.
Что-то я не вижу в publish() ничего такого, что тянуло бы на 300 байт.
нет инлайнов
Что-то я не вижу в publish() ничего такого, что тянуло бы на 300 байт.
В том то и дело. по идее если мы её один раз заюзали, у компилятора есть её адрес и дальше он её по нему вызывает. Ну как бы так по логике должно быть.
Ну какбэ, в любом случае, - чтобы разобраться в причинах по фрагменту кода - это к ведуньям. Они по фотографии всю жизнь человека узнать могут, а обычные люди не в силах.
Выложить весь код? Кто в нём здесь будет ковыряться?
человек! Ты хоть пароль от брокера убери! ;)))
человек! Ты хоть пароль от брокера убери! ;)))
лоин/пароль неверный ессенно
И да. Я всегда до новичков докапываюсь, ту не стану. Нормально все написано, аккуратно. Немножно без скидки на контроллер, как для ПК, но аккуратно.
Всякие строковые темы нужно попробовать урезать, НО! - самое первое - выкинуть даллас-темприча! Сразу дышать станет легче. Она вообще никому и никогда не нужна, Onewire всегда достаточно. На три строки больше написать придется! ;) Выкинь и посмотри, что выйдет.
И да. Я всегда до новичков докапываюсь, ту не стану. Нормально все написано, аккуратно. Немножно без скидки на контроллер, как для ПК, но аккуратно.
Всякие строковые темы нужно попробовать урезать, НО! - самое первое - выкинуть даллас-темприча! Сразу дышать станет легче. Она вообще никому и никогда не нужна, Onewire всегда достаточно. На три строки больше написать придется! ;) Выкинь и посмотри, что выйдет.
Пробовал - экономия на спичках, меня это никак не спасёт. Он хавает совсем немного. Всё по отдельности пробовал выкидывать, слёзы экономии. PubSub ска жрёт как мерен
Естественно - большой код никто за вас отлаживать не будет, тем более если всё это завязано на какие-то доп. сервисы. Если хотите попытаться докопаться до причины - сокращаете его так, чтобы остались только подозреваемые фрагменты. Потом проводите следственный эксперимент, добавляя и убавляя кол-во вызовов publish. Если гипотеза про 300 байт подтверждаетеся - значит стоит ковырять либу, если не подтверждается - чешете голову дальше.
В целом - кто-то работает, наверное, с этими TinyGSM и пр. Сможет примерно прикинуть: пожрут ли они 20кб или нет. На глазок - тут килобайт 10 в юзерспейсе, если так можно выразится. Ну вот эти float, Serial, String... если от них избавится - освободят progmem/ram. Для интереса скомпилируйте что-нить простое с float и без - посмотрите, как будет изменяться объём прошивки.
если у ТС скетч жиреет от библиотеки, значит надо её выкинуть и переписать самому.
Это крайний вариант
Что там крайнего, рядом лежат готовые функции, примитив, пихаете в отправку своего gsm и все
http://arduino.ru/forum/programmirovanie/snova-mqtt-1#comment-404716
А это не поможет? https://habr.com/ru/post/311874/
https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html
[/quote] Что там крайнего, рядом лежат готовые функции, примитив, пихаете в отправку своего gsm и все http://arduino.ru/forum/programmirovanie/snova-mqtt-1#comment-404716[/quote]
Да действительно, совсем фигня... если только "лампочку мигать"
Что там крайнего, рядом лежат готовые функции, примитив, пихаете в отправку своего gsm и все http://arduino.ru/forum/programmirovanie/snova-mqtt-1#comment-404716
Да действительно, совсем фигня... если только "лампочку мигать"
Победили? А то аналогичная проблема, каждый новый топик отжирает от динамической памяти, которой всего 8К по 24 байта, блин а у меня их дофига(
24 байта это вообще ни о чем.
Проверьте, как вы строки формируете, может их можно во флеш убрать
Конечно не о чём, но когда свободной памяти осталось всего 20% и топиков ещё надо прописать «куеву тучу», то каждый байт на счету((
Подскажите, а как можно топики во флеш запихнуть?
Код покажите
если в кратце, то так
и таких конструкций еще надо сотню прописать
Классический идиотизм - весь дом на одном сторублевом контроллере
и таких конструкций еще надо сотню прописать
Попробуйте убрать из кода один из кейсов (один) и скажите насколько изменился расход памяти.
Классический идиотизм - весь дом на одном сторублевом контроллере
Попробуйте убрать из кода один из кейсов (один) и скажите насколько изменился расход памяти.
При одинаковом топике, расход не меняется, а вот если добавить новый топик то увеличивается на 26 байт
На двух. Ну тогда ладно, конечно. Всё правильно и по уму и не идиотизм совсем.
Всем спасибо, все свободны)))
с оптимизировал код, теперь до хрена свободной памяти стало
вот видите, форум помог!