Arduino - создавать объекты вручную (например, библиотеку WiFi)

По умолчанию, если я включу библиотеку WiFi, объект WiFi будет зарегистрирован глобально. Как я могу отключить это поведение, не изменяя сам файл библиотеки? (удаление определения "extern...") Или есть способ удалить объекты сразу после включения? Я просто хочу создать объект вручную, когда это необходимо для экономии памяти.

, 👍0

Обсуждение

его не должно быть в результате сборки, если он не используется, @Juraj

вы можете проверить файл .map на предмет исключенного кода и кода, включенного в окончательную сборку., @Juraj


1 ответ


Лучший ответ:

0

Я не уверен, что это сэкономит достаточно памяти, чтобы окупить проблемы (это всего лишь несколько байтов, буферы создаются в любом случае), но скажем так. Затем вам нужно изменить библиотеку, чтобы она не создавала объект, так как он размещается статически и не может быть удален позже (и освобождает его память). Для защиты всех остальных проектов было бы, вероятно, лучше всего использовать специальный #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