Размер структур и классов в программах на ESP8266
ฝัง
- เผยแพร่เมื่อ 29 ส.ค. 2024
- Из-за выравнивания полей структур и классов, занимаемый вашими типами данных размер оперативной памяти может значительно превосходить ваши ожидания.
Если скорость доступа к структурам (полям классов) не является критичной, то можно заставить компиллятор упаковать тип, добавив в описание типа конструкцию
__attribute__((__packed__))
Пример из видео (код для PlatformIO, в случае с Arduino IDE переименовать файл src\main.cpp в StructSize_Test.ino и перенести его из подкаталога src в каталог проекта): drive.google.c...
У меня лично каждый ролик как продолжение сериала захватывающего. Всегда рад. Спасибо!
Поставил палец вверх на первой секунде просмотра , за то что уже не ждал , и за то что надо чаще
Алекс, откопал:
#pragma pack(push,1)
struct {...};
#pragma pack(pop)
Выравнивает в 1 байт. Последняя строка возвращает все как было для последующего кода.
Вдруг будет время затронуть это в каком-то видео. Интересно было бы вас послушать.
Очень здорово, что мне этот канал попался. До этого я в основном из
Random Nerd Tutorials информацию черпал. Спасибо.
Алекс,молодец!!!Единственный русскоязычный контент по Platformio,на днях начну с помощью него подключать к esp8266 внешний ацп ads1115 и выводить значение на дисплей nextion,если бы не вы, то так и изучал бы Arduino IDE.Даёшь больше роликов!!!!
Спасибо за уроки. Не зря Вас подбадривали ;)
Спасибо, очень полезно! Даже для копипастера. Начал передавать данные с ардуины на esp8266 и ... улетает нормально, а приходит куча мусора. Добавил __attribute__((__packed__)) и все заработало как надо.
Использование __attribute__((__packed__)) с помещением элемента в вектор приводит к спонтанным перезагрузкам.
Лично я понятия не имел о таком атрибуте, спасибо. КМК для практических целей должно быть достаточно в структуре сначала объявить все uint32_t, затем все двухбайтовые, затем все однобайтовые поля. Вперемешку, конечно, хуже всего. Дополнительное время для packed, скорее всего, требуется из-за того, что читается все четырехбайтовое слово, и затем оно маскируется и сдвигается до получения нужных двух или одного байта.
Для себя - установить наконец PlatformIO
Пишу hello world'ы на плюсах. Очень интересно смотреть. Спасибо за контент.
стандартная упаковка #pragma pack(1) прекрасно работает
Спасибо за ролик. Канал все-таки про нюансы, поэтому для пользователей, кто хочет или вынужден становиться продвинутым. Для меня например очень полезно. А насчет монетизации, можно и на чашечку кофе иногда скинуться, только куда?
Очень интересно. Спасибо.
Алекс ты красава
За выводы спасибо
Размеры структур и всего остального можно посмотреть в Project inspection на platformio ide
А мне что-то Платформио не зашел, что-то геморно было добавлять библиотеки не стандартные, короче постоянно ошибки сыпались, можно было конечно разобраться, но я взял локальную VisualStudio c надстройкой MicroVisual, кстати рекомендую для локальной разработки. А вот в Arduino IDE нереально нормально работать конечно и тем более писать большой код
Я тоже долго сидел на Visual Micro + MS Visual Studio. Теперь окончательно перешёл на Platformio (в том числе благодаря роликам автора данного канала) после того, как повесил некоторые свои устройства на ESP8266. А именно, нужно было слегка модернизировать код в ESP8266. Но после заливки новой версии прошивки по OTA, WiFi в ESP отвалился и MQTT соответственно тоже. Дальнейшая загрузка по OTA стала невозможной. Это случилось из- за изменения кода (обновления) некоторых библиотек + мой кривой код ☺. Накануне переустанавливал винду и Arduino со всеми библиотеками. Так вот, пришлось вытаскивать свою железку из труднодоступного места и перешивать её шнурком.
Используя Platformio, нужные библиотеки настраиваются очень гибко (указание определённых версий и т.д.).
P.S. Alex, спасибо за интересные видео. Данный материал смотрел с большим удовольствием. Очень познавательно для любителей электроники и программирования.
Интересует микрообзор IDE для незнакомого с ней балбеса(возможности и т.п.) и краткие рекомендации по использованию.
По PlatformIO у меня есть ролик.
@@alexmorozov73 Спасибо.
Спасибо, очень полезная информация. Я вот ещё не разобрался, насколько я помню функция тоже имеет вес и в данном примере он не учтен. Не могу понять причину, думаю причина в sizeof
Код функций (методов) не располагается в оперативной памяти и в случае классов он один для всех экземпляров класса, поэтому не учитывается.
На самом деле, класс занимает больше памяти, чем сумма его свойств, т.к. в случае виртуальных функций есть еще VTBL, правда в последних версиях Arduino для ESP8266 VTBL может храниться во флеше.
Ну и что здесь нового? Обычное выравнивание. И дело тут не в скорости. Просто многие архитектуры не позволяют обращаться к данным по невыровненным адресам, и выкидывают исключение.
Как по мне так такие выводы в каждом мануале крупными буквами в начале, писать нужно