Глобальному массиву не присваивается то место которое он занимал бы в памяти
У меня есть такой скетч:
const uint32_t len = 65536;
uint8_t arr[len];
void setup() {}
void loop() {}
Длина массива должна вписываться в динамическую память. Однако, когда я компилирую скетч, он говорит это в окне вывода:
Sketch uses 10528 bytes (0%) of program storage space. Maximum is 2031616 bytes.
Global variables use 13504 bytes (1%) of dynamic memory, leaving 1034224 bytes for local variables. Maximum is 1048576 bytes.
Если я изменю len
на 10, это не изменится. Компилятор настроен на "Отладку", поэтому он не должен быть оптимизирован. Это указывает на то, что память на самом деле не выделяется. В чем, по - видимому, здесь проблема?
Я компилирую для Teensy 4.0, но выход такой же по сути для Arduino Uno и других плат (с меньшим объемом памяти).
@LukasFun, 👍0
Обсуждение1 ответ
Лучший ответ:
Здесь нет никаких проблем. Только компилятор немного умнее, чем вы ожидали. Он видит, что вы нигде не используете arr
, поэтому он просто оптимизирует его.
Есть два способа предотвратить это, если вы действительно хотите:
- Я думаю, что вы можете использовать флаги, чтобы сказать компилятору, что это не должно быть оптимизировано. Я не эксперт в этом, другие могут знать больше об этом и добавить свой собственный ответ
- Вы можете просто начать использовать его.
Это хороший момент, однако я уже думал об этом. См. Обновленный вопрос., @LukasFun
Неважно, по-видимому, эта настройка все равно приводит к тому, что компилятор ее оптимизирует. Как только появляется строка, которая записывает данные в массив, отображается правильное использование памяти для глобальных переменных., @LukasFun
Единственное, что остается после этого, - это то, что malloc (), похоже, не работает таким образом., @LukasFun
@LukasFun Правильно - "malloc" делает именно то, что должен, выделяет память в момент ее вызова. Используется ли эта память или нет, не имеет значения., @Dave Newton
- Включает ли скомпилированный бинарный файл скетча неиспользуемые функции из библиотеки?
- Можно ли хранить данные в программном пространстве вместо динамической памяти?
- Условное присвоение массива
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Выделение строковой памяти Arduino
- Как очистить кучу памяти в esp32
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Последовательная печать из флэш-памяти (F() macro, PROGMEM, sprintf_P, SPTR)
Как вы его составляете? Если вы на самом деле не используете массив, он может быть просто оптимизирован., @Dave Newton
Я предполагаю, что это связано с тем, что в нем нет никаких данных., @Python Schlange