Arduino - создавать объекты вручную (например, библиотеку WiFi)
По умолчанию, если я включу библиотеку WiFi, объект WiFi будет зарегистрирован глобально. Как я могу отключить это поведение, не изменяя сам файл библиотеки? (удаление определения "extern...") Или есть способ удалить объекты сразу после включения? Я просто хочу создать объект вручную, когда это необходимо для экономии памяти.
@elebb, 👍0
Обсуждение1 ответ
Лучший ответ:
Я не уверен, что это сэкономит достаточно памяти, чтобы окупить проблемы (это всего лишь несколько байтов, буферы создаются в любом случае), но скажем так.
Затем вам нужно изменить библиотеку, чтобы она не создавала объект, так как он размещается статически и не может быть удален позже (и освобождает его память). Для защиты всех остальных проектов было бы, вероятно, лучше всего использовать специальный #define
, чтобы отключить его только в проектах, критичных к памяти, поэтому Wire.h должен содержать что-то вроде
#ifndef EXCLUDE_WIRE
extern TwoWire Wire;
#endif
и ваша программа (critical.ino
) должна начинаться с
#define EXCLUDE_WIRE
#include <Wire.h>
а затем где-то в цикле
или использовании другой функции
TwoWire Wire;
как локальная переменная. Если вам нужно вызвать с ним другие функции, то вы должны отправить его адрес в качестве параметра.
В любом случае вы почти не сэкономите памяти, так как почти все переменные в TwoWire (а именно буферы) являются статическими
, поэтому переменные класса являются общими для всех экземпляров TwoWire и выделяются автоматически, если в вашей программе есть (возможно, используемый) любой экземпляр TwoWire.
Поэтому было бы лучше создать свою собственную библиотеку, чтобы использовать ту же функциональность, но убедиться, что все такие переменные являются переменными экземпляра и должным образом созданы и выпущены в нужное время. Это также позволит изменить размеры буфера, если это необходимо.
Поскольку это предусмотрено LGPL 2.0+, вам разрешено делать это по закону (при условии, что вы выполняете все условия лицензии).
Спасибо. Я уже думал, что должен пойти по этому пути. Даже если это сделает гораздо больше работы, я также могу убрать все, что мне не нужно. Мое пространство для скетча тоже на пределе ;), @elebb
Обратите внимание, что если вы не используете глобальную переменную Wire
, она будет удалена компоновщиком и не будет использовать память. Строго нет смысла изменять исходный код библиотеки для его удаления., @Edgar Bonet
@elebb: вы можете сэкономить немного памяти, удалив неиспользуемые функции из библиотечных методов, которые вы _do_ используете, и удалив неиспользуемые элементы данных. Однако вы ничего не сохраните, удалив неиспользуемые методы или глобальные переменные: компоновщик уже сделает это за вас. По сути, среда разработки Arduino уже применяет [эту технику оптимизации](https://www.vidarholen.net/contents/blog/?p=729)., @Edgar Bonet
Если я правильно понял, то предполагаемое использование состояло в том, чтобы НЕ иметь один глобальный объект Wire все время, а создавать его на случай, если вам нужно его использовать, и впоследствии уничтожить его для экономии ОЗУ, в то время как другая часть программы будет в другое время использовать ту же оперативную память для чего-то другого, а затем освободить ее. Точно так же, как один и тот же байт в ОЗУ используется как часть локальной целочисленной переменной в одной функции, а в другой раз как локальная переменная char совершенно несвязанной функции, в другой раз он может быть частью адреса возврата третьей функции, в то время как это всего лишь часть свободной оперативной памяти для стека., @gilhad
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
его не должно быть в результате сборки, если он не используется, @Juraj
вы можете проверить файл .map на предмет исключенного кода и кода, включенного в окончательную сборку., @Juraj