Здравствуйте Друзья! Будьте так добры, подскажите пожалуйста. Железо Arduino Mega 2560 раньше, при загрузке скетча было всё хорошо, а теперь даже при проверке выдаёт сообщение: Скетч использует 130686 байт (51%) памяти устройства. Всего доступно 253952 байт. Глобальные переменные используют 6970 байт (85%) динамической памяти, оставляя 1222 байт для локальных переменных. Максимум: 8192 байт.
Недостаточно памяти, программа может работать нестабильно.
Популярные вопросы
Что актуальней на данный момент
Добрый день. Решил подумать заменой своего ендер 6 (реально не оправдал надежды, а допиливать не в моем случае) смотрю в сторону ендер 3 с1 плюс или Н.
Помогите подобрать пластик для печати
Всем привет, помогите подобрать материал для данной детали. Это переходник для станка по производству бумажных стаканчиков, то есть есть рулоны бумаги.
Источник: 3dtoday.ru
Arduino оптимизация использования оперативной памяти
Arduino недостаточно памяти программа может работать нестабильно
Как-то стало не понятно: по идее еще памяти полно, а предупреждение.
Оказалось все просто: если не пользоваться этим модификатором, то все текстовые переменные записываются в SRAM!
Т.е. запись:
const unsigned char txtSite[]=;
исправляем на:
const unsigned char PROGMEM txtSite[]=;
Если нужен многомерный массив, то пишем так:
const unsigned char PROGMEM txt_LangRu[] = < «Russian» >;
const unsigned char PROGMEM txt_LangTrans[] = < «Translit» >;
const unsigned char* const PROGMEM arLang[] = < txt_LangRu, txt_LangTrans >;
При таком подходе немного замедляется работа с этими переменными, т.к. приходится делать дополнительные телодвижения для получения адреса этих переменных, например, pgm_read_byte_near(), но если они используются для вывода на дисплей, то это не критично, для сравнительно медленного ЖКИ
И на последок, для перекодировки текста и форматирования переменных, для ЖКИ на контроллере HD44780 или KS0066 я использую программу LcdConv.exe
Источник: vovka.sv19.com
Arduino.ru
Ошибка при загрузке скетча // Недостаточно памяти, программа может работать нестабильно.
- Войдите на сайт для отправки комментариев
Пнд, 07/05/2018 — 18:55
Помогите пожалуйста решить проблему. При загрузке скетча пишет:
Скетч использует 10894 байт (75%) памяти устройства. Всего доступно 14336 байт.Глобальные переменные используют 1000 байт (97%) динамической памяти, оставляя 24 байт для локальных переменных. Максимум: 1024 байт.
Недостаточно памяти, программа может работать нестабильно.
Произошла ошибка при загрузке скетча.
Вот текст скетча (скетч написан не мной):
Arduino как освободить память. Не хватает памяти UNO NANO.
/* Модифицировано под дисплей 1602 klykov.net vk.com/ms262 instagram.com/klykovnet Блок электроники для крутого моддинга вашего ПК, возможности: — Вывод основных параметров железа на внешний LCD дисплей — Температура: CPU, GPU, материнская плата, самый горячий HDD — Уровень загрузки: CPU, GPU, RAM, видеопамять — Графики изменения вышеперечисленных параметров по времени Программа HardwareMonitorPlus https://github.com/AlexGyver/PCdisplay — Запустить OpenHardwareMonitor.exe — Options/Serial/Run — запуск соединения с Ардуиной — Options/Serial/Config — настройка параметров работы — PORT address — адрес порта, куда подключена Ардуина — TEMP source — источник показаний температуры (процессор, видеокарта, максимум проц+видео, датчик 1, датчик 2) Что идёт в порт: 0-CPU temp, 1-GPU temp, 2-mother temp, 3-max HDD temp, 4-CPU load, 5-GPU load, 6-RAM use, 7-GPU memory use, */ // ———————— НАСТРОЙКИ —————————- #define DRIVER_VERSION 1 // 0 — маркировка драйвера кончается на 4АТ, 1 — на 4Т // ———————— НАСТРОЙКИ —————————- // ———————— ПИНЫ ————————— #define BTN1 A3 // первая кнопка #define BTN2 A2 // вторая кнопка // ———————— ПИНЫ ————————— // ——————— БИБЛИОТЕКИ ——————— #include // библиотека расширенной работы со строками #include // библиотека для соединения #include // библтотека дислея #include // библиотека таймера // ——————— БИБЛИОТЕКИ ——————— // ——— АВТОВЫБОР ОПРЕДЕЛЕНИЯ ДИСПЛЕЯ————- // Если кончается на 4Т — это 0х27. Если на 4АТ — 0х3f #if (DRIVER_VERSION) LiquidCrystal_I2C lcd(0x27, 16, 2); #else LiquidCrystal_I2C lcd(0x27, 16, 2); #endif // ——— АВТОВЫБОР ОПРЕДЕЛЕНИЯ ДИСПЛЕЯ————- #define printByte(args) write(args); #define TEMPERATURE_PRECISION 9 // стартовый логотип byte logo0[8] = ; byte logo1[8] = ; byte logo2[8] = ; byte logo3[8] = ; byte logo4[8] = ; byte logo5[8] = ; // значок градуса. lcd.write(223); byte degree[8] = ; // правый край полосы загрузки byte right_empty[8] = ; // левый край полосы загрузки byte left_empty[8] = ; // центр полосы загрузки byte center_empty[8] = ; // блоки для построения графиков byte row8[8] = ; byte row7[8] = ; byte row6[8] = ; byte row5[8] = ; byte row4[8] = ; byte row3[8] = ; byte row2[8] = ; byte row1[8] = ; char inData[82]; // массив входных значений (СИМВОЛЫ) int PCdata[20]; // массив численных значений показаний с компьютера byte PLOTmem[6][16]; // массив для хранения данных для построения графика (16 значений для 6 параметров) byte blocks, halfs; byte index = 0; int display_mode = 6; String string_convert; unsigned long timeout, uptime_timer, plot_timer; boolean lightState, reDraw_flag = 1, updateDisplay_flag, updateTemp_flag, timeOut_flag = 1; int duty, LEDcolor; int k, b, R, G, B, Rf, Gf, Bf; byte mainTemp; byte lines[] = ; byte plotLines[] = ; // 0-CPU temp, 1-GPU temp, 2-CPU load, 3-GPU load, 4-RAM load, 5-GPU memory String perc; unsigned long sec, mins, hrs; byte temp1, temp2; boolean btn1_sig, btn2_sig, btn1_flag, btn2_flag; // Названия для легенды графиков const char plot_0[] = «CPU»; const char plot_1[] = «GPU»; const char plot_2[] = «RAM»; const char plot_3[] = «temp»; const char plot_4[] = «load»; const char plot_5[] = «mem»; // названия ниже должны совпадать с массивами сверху и идти по порядку! static const char *plotNames0[] = < plot_0, plot_1, plot_0, plot_1, plot_2, plot_1 >; static const char *plotNames1[] = < plot_3, plot_3, plot_4, plot_4, plot_4, plot_5 >; // 0-CPU temp, 1-GPU temp, 2-CPU load, 3-GPU load, 4-RAM load, 5-GPU memory void setup() < Serial.begin(9600); pinMode(BTN1, INPUT_PULLUP); pinMode(BTN2, INPUT_PULLUP); // инициализация дисплея lcd.init(); lcd.backlight(); lcd.clear(); // очистить дисплей show_logo(); // показать логотип delay(2000); lcd.clear(); // очистить дисплей show_logo2(); // показать логотип >// —————————— ОСНОВНОЙ ЦИКЛ ——————————- void loop() < parsing(); // парсим строки с компьютера updatePlot(); // обновляем массив данных графика dutyCalculate(); // посчитать скважность для вентиляторов buttonsTick(); // опрос кнопок и смена режимов updateDisplay(); // обновить показания на дисплее timeoutTick(); // проверка таймаута >// —————————— ОСНОВНОЙ ЦИКЛ ——————————- void buttonsTick() < btn1_sig = !digitalRead(BTN1); btn2_sig = !digitalRead(BTN2); if (btn1_sig !btn1_flag) < display_mode++; reDraw_flag = 1; if (display_mode >9) display_mode = 0; btn1_flag = 1; > if (!btn1_sig btn1_flag) < btn1_flag = 0; >if (btn2_sig !btn2_flag) < display_mode—; reDraw_flag = 1; if (display_mode < 0) display_mode = 9; btn2_flag = 1; >if (!btn2_sig btn2_flag) < btn2_flag = 0; >> void dutyCalculate() < if (PCdata[12] == 1) // если стоит галочка ManualFAN duty = PCdata[14]; // скважность равна установленной ползунком else < // если нет switch (PCdata[18]) < case 0: mainTemp = PCdata[0]; // взять опорную температуру как CPU break; case 1: mainTemp = PCdata[1]; // взять опорную температуру как GPU break; case 2: mainTemp = max(PCdata[0], PCdata[1]); // взять опорную температуру как максимум CPU и GPU break; case 3: mainTemp = temp1; break; case 4: mainTemp = temp2; break; >duty = map(mainTemp, PCdata[11], PCdata[10], PCdata[9], PCdata[8]); duty = constrain(duty, PCdata[9], PCdata[8]); > > void parsing() < while (Serial.available() >0) < char aChar = Serial.read(); if (aChar != ‘E’) < inData[index] = aChar; index++; inData[index] = ‘