Изначально массив датчиков задан в глобальном массиве:
const uint8_t addr[] [8] PROGMEM = {
{0x28, 0xFF, 0x98, 0xA2, 0x6B, 0x14, 0x3, 0x3E},
{0x28, 0xFF, 0x79, 0x78, 0x6B, 0x14, 0x3, 0x33},
{0x28, 0xFF, 0xB9, 0x3F, 0x71, 0x14, 0x4, 0xD4},
{0x28, 0xFF, 0x1, 0x2A, 0x70, 0x14, 0x4, 0xB7},
{0x28, 0xFF, 0xC4, 0x41, 0x70, 0x14, 0x4, 0x43},
…(и.т.д 18 датчиков)
};
void setup(void) {
// устанавливаем адреса датчиков температуры
for (int i = 0; i < DS_SENSOR_AMOUNT; i++) {
sensor[i].setAddress( pgm_read_byte(&(addr[i])) );
}
…
}
Скетч использует 26374 байт (85%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1383 байт (67%) динамической памяти, оставляя 665 байт для локальных переменных. Максимум: 2048 байт.
Прочитал правильную мысль, что не надо держать глобально всё подряд, а лучше внести внутрь функции, чтобы после выхода из неё память освободилась. Ну и перенёс этот массив addr внутрь setup, то есть вставил в самое начало, сразу перед циклом.
И увидел вот это:
Скетч использует 26568 байт (86%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1527 байт (74%) динамической памяти, оставляя 521 байт для локальных переменных. Максимум: 2048 байт.
Попробовал убрать PROGMEM и/или const - просто обычный массив объявить, тоже не помогает…
Что я не так делаю?
Массив addr должен удаляться после закрытия setup и память должна очиститься?
Или это особенности подсчёта занятой памяти по ходу компиляции?