Официальный сайт компании Arduino по адресу arduino.cc
Что то с памятью моей стало...
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 28/01/2016 - 17:57
Компилятор пишет:
Скетч использует 15 960 байт (51%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 1 675 байт (81%) динамической памяти, оставляя 373 байт для локальных переменных. Максимум: 2 048 байт.
Недостаточно памяти, программа может работать нестабильно.
И действительно работает нестабильно. А как понять почему? программа вроде небольшая. Вот текст
#include <nRF24L01.h> #include <printf.h> #include <RF24.h> #include <RF24_config.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_SSD1306.h> #define potPin A6 //Вывод резистора скорости #define uPin A5 //Вывод напряжения батареи #define fwdPin 5 //Вывод кнопки "Вперед" #define bwdPin 6 //Вывод кнопки "Назад" #define OLED_MOSI 3 //Выводы дисплея #define OLED_CLK 0 #define OLED_DC 1 #define OLED_CS 2 #define OLED_RESET 14 //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino //SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); RF24 radio(7, 8); const unsigned char PROGMEM logo[] = { //Код логотипа 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xfb, 0xe7, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0xfb, 0xe3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0xfb, 0xe3, 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xdf, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xdf, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3f, 0xdf, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xdf, 0xff, 0xfc, 0xfb, 0xe7, 0xdf, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xff, 0xdf, 0xe1, 0xfc, 0xfb, 0xe7, 0xdf, 0x7f, 0xfc, 0x30, 0x0, 0x3, 0xff, 0xdf, 0x80, 0xfc, 0xfb, 0xe7, 0xdf, 0x1f, 0xfc, 0x38, 0x0, 0x7, 0xff, 0xff, 0x0, 0xfe, 0xfb, 0xef, 0x9f, 0x1f, 0xfc, 0x38, 0x0, 0x7, 0xff, 0xff, 0x0, 0xff, 0xfb, 0xff, 0x1f, 0x1f, 0xfe, 0x3c, 0x0, 0xf, 0xff, 0xff, 0x0, 0xff, 0xfb, 0xfc, 0x1f, 0x1f, 0xfe, 0x3e, 0x0, 0x1f, 0xff, 0xff, 0x1, 0xff, 0xfb, 0xff, 0x9f, 0x1f, 0xfe, 0x3f, 0x0, 0x1f, 0xe7, 0xff, 0x1f, 0xfd, 0xfb, 0xff, 0xdf, 0x1f, 0xff, 0x3f, 0x0, 0x3f, 0xc7, 0xff, 0xff, 0xfc, 0xfb, 0xff, 0xdf, 0x1f, 0xff, 0x7f, 0x80, 0x3f, 0x87, 0xff, 0xff, 0xfc, 0xfb, 0xf7, 0xdf, 0x1f, 0xff, 0xff, 0x80, 0x3f, 0x87, 0xff, 0xe3, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xff, 0xff, 0x80, 0x7f, 0x7, 0xff, 0x80, 0xfc, 0xfb, 0xe3, 0xdf, 0x1f, 0xff, 0xff, 0xc0, 0x7f, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xdf, 0x1f, 0xff, 0xff, 0xc0, 0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xff, 0xff, 0xc0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfd, 0xef, 0xc0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfd, 0xef, 0xe0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfd, 0xef, 0xe0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xe0, 0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 0x3e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0x80, 0x3e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0x1f, 0x80, 0x1f, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x1f, 0x0, 0x1f, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x1f, 0x0, 0xf, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x1e, 0x0, 0x7, 0x87, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x3c, 0x0, 0x7, 0x87, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x3c, 0x0, 0x3, 0xc7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x38, 0x0, 0x1, 0xc7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x70, 0x0, 0x0, 0xe7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x60, 0x0, 0x0, 0x67, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc1, 0xfc, 0xfb, 0xe3, 0xff, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0xfc, 0xfb, 0xe3, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0xfb, 0xe3, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xfb, 0xe3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи bool fwd = false; //Переменная "Вперед" bool bwd = false; //Переменная "Назад" bool con = false; //Статус соединения int u_value = 0; //Значение напряжения int spd = 0; //Скорость float ubat = 0.00; //Напряжение батареи int spd_d = 0; //Скорость для отображения на дисплее void setup() { radio.begin(); radio.openWritingPipe(pipe); // Открываем канал передачи display.begin(); //Инициализация дисплея pinMode(fwdPin, INPUT); //Режимы пинов pinMode(bwdPin, INPUT); pinMode(uPin, INPUT); pinMode(potPin, INPUT); digitalWrite(bwdPin, LOW); digitalWrite(fwdPin, LOW); display.clearDisplay(); display.setTextColor(WHITE); display.drawBitmap(18, 0 , logo, 92, 64, WHITE); //Печать логотипа display.display(); delay(3500); } //end setup void loop() { //start loop display.clearDisplay(); //Очистка дисплея u_value = analogRead(uPin); //Замер напряжения батареи ubat = (u_value * 5.0) / 1024.0; //Рассчет напряжения spd = analogRead(potPin); //Обработка данных резистора скорости spd = map(spd, 0, 1023, 0, 255); //Маппинг 10 бит в 8 бит spd_d = map(spd, 0, 255, 0, 100); //Маппинг скорости для дисплея из 255 в 100 //Строка напряжения батареи display.setTextSize(1); display.setCursor(0, 0); display.println("Battery voltage "); display.setCursor(94, 0); display.print(ubat); display.print("V"); //Строка скорости display.setCursor(9, 12); display.println("Current speed "); display.setCursor(92, 12); display.print(spd_d); display.print("%"); //Строка соединения if (con == true) { display.setCursor(23, 55); display.print("Connection OK"); display.display(); }//endif else { display.setCursor(23, 55); display.print("Not connected!"); }//end else //если кнопка "Вперед" нажата ... if (digitalRead(fwdPin) == HIGH && !digitalRead(bwdPin) == HIGH) { fwd == true; radio.write(&fwd, 1); radio.write(&spd, 1); display.setTextSize(2); display.setCursor(15, 25); display.println("Move FWD"); }//endif //если кнопка "Назад" нажата ... if (digitalRead(bwdPin) == HIGH && !digitalRead(fwdPin) == HIGH) { bwd == true; radio.write(&bwd, 1); radio.write(&spd, 1); display.setTextSize(2); display.setCursor(10, 25); display.println("Move BACK"); }//endif //если обе кнопки нажаты ... if (digitalRead(fwdPin) == HIGH && digitalRead(bwdPin) == HIGH) { display.setTextSize(2); display.setCursor(5, 25); display.println("BTN ERROR!"); } //endif display.display(); } //end loop
наверное из-за строки 29:)
Недавно попадалась статья про распределение памяти. Детали не помню, но главное это то что снизу идут глобальные переменные, потом локальные, потом "куча", а от верхнего адреса вниз идет стек. т.к. использовано много оперативы - возможно наползание кучи на стек.... результат естессно непредсказуем.
http://robocraft.ru/blog/arduino/531.html
29 строка идет сразу в eeprom, а не в прошивку
итак уж задефайнил все, что мог, чтобы память не жрало
но вы же логотип выводите строка 121, попробуйте не выводить, что компилятор скажет?
29-код логотипа в память
121-вывод на экран. Убираем логотип, ничего не меняется
Megawollt, только не в еепром, а во флеш (память программ)
Оперативы не хватат. Или отказываться от части библиотек .. надо смотреть кто и зачем жрет столько оперативы под глобалы и динамическую память .. или смотреть в сторону "старших моделей": Atmega128A, Atmega2560 .. а заодно и сюда: http://arduino.ru/forum/proekty/nedovolnym-super-dunya-est-zhelayushchie...
.. или уходить на иные камни, тиа STM32.
Adafruit_SSD1306.h буфер размеров во весь экран в памяти дежржит. Вот и отъела.
Я бы переместил во flash еще и текстовые строки. Когда 2/3 доступной памяти занимает экранный буфер, приходится экономить на мелочах.
Впрочем, экранный буфер, скорее всего, Вам не нужен. Найдите библиотеку без него - жизнь стазу станет легче.
Спасибо ребят. Давно не выходил, так как моделировал блок управления двигателем под эту самую программу.
Так вот. Использовать stm32 я не могу, так как не знаком ни с какими языками программирования кроме ардуиновского процессинга и то немного.
А что это за буфер и как найти библиотеку без него?
Так вот. Использовать stm32 я не могу, так как не знаком ни с какими языками программирования кроме ардуиновского процессинга и то немного.
Где ж ты родимый такой язык то нашел?
НЕТ такого языка. Есть простой Си/Си++
Керниган и Ричи, Кнут тебе в помощь. Плюс немного мозгов......
Я не буду вступать в полемику по этому поводу. Джереми Блюм утверждал, что это процессинг на основе С++. Я думаю он прав
Я не буду вступать в полемику по этому поводу. Джереми Блюм утверждал, что это процессинг на основе С++. Я думаю он прав
А Дима Осипов так не думает. Твоему Джереми до Димки еще учится и учится...
https://ru.m.wikipedia.org/wiki/Processing
http://robocraft.ru/blog/arduino/336.html
http://wiring.org.co
Хорошо, С. Да простит меня Деннис Ритчи.
А что по теме? Как разобраться с памятью?
Еще в #9 ответили, что нужно делать, искать другую библиотеку. Меня не спрашивайте, графические дисплеи использую крайне редко.
Да это я понял. А вот есть ли они, эти библиотеки...
Никто не знает?