Компиляция прошивки
- Войдите на сайт для отправки комментариев
Пнд, 28/03/2016 - 21:06
Добрый день!
Сразу скажу, что все работает - и железо и прошивка. Вопрос по компиляции, выдает сообщение:
Скетч использует 15 318 байт (49%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 1 663 байт (81%) динамической памяти, оставляя 385 байт для локальных переменных. Максимум: 2 048 байт.
Недостаточно памяти, программа может работать нестабильно.
Я в шоке, вот эта прошивка "жрет" почти 2 кб ОЗУ? Грузил прошивки из тырнета более ёмкие и с большим количеством библиотек - выдавало там 11%, 17%, ну, 22% было. Но не 81 % же... Скажите, в чем я не прав? Переменных я вроде не наплодил и до трех десятков байт не дотянет, массивов нет. Библиотека OLED 128х64? Так у меня TFT дисплей 320х240 с тачём как раз и сожрал 22% ОЗУ.
Хотелось бы понять. Прошивка еще не закончена, кнопки прикрутить, график изменения давления сделать ... Получается, что кирдык далекой галактике, прощай график.
Версия IDE 1.6.7, Pro Mini + FTDI 232, OLED 12х64 0,96", DS1307 RTC и BMP-185.
#include <Wire.h> #include <OLED_I2C.h> #include <BMP085.h> OLED myOLED(2, 3); //SDA - вывод 2, SCL - вывод 3 extern uint8_t SmallFont[]; extern uint8_t RusFont[]; extern uint8_t BigNumbers[]; BMP085 dps = BMP085(); long Temperature = 0, Pressure = 0; void setup() { Wire.begin(); myOLED.begin(); delay(500); dps.init(); byte s=ReadRTC(0x00); bitClear(s, 7); //установка бита разрешения счета времени WriteRTC(0x00, s); byte h=ReadRTC(0x02); bitClear(h, 6); //установили 24 часовой формат WriteRTC(0x02, h); WriteRTC(0x07, 0); //отключили выход генератора } void loop() { for (int i=0; i<=5; i++) { byte s_dec=ReadRTC(0x00); byte m_dec=ReadRTC(0x01); byte h_dec=ReadRTC(0x02); byte d_dec=ReadRTC(0x03); byte dat_dec=ReadRTC(0x04); byte mon=ReadRTC(0x05); byte yer_dec=ReadRTC(0x06); //**********Обрабатываем полученное время //**********Секунды byte s_ed=s_dec; s_dec=s_dec >> 4; s_dec=s_dec & 0x07; s_ed=s_ed & 0x0f; //выделяем младшие биты //**********Минуты byte m_ed=m_dec; m_dec=m_dec >> 4; m_dec=m_dec & 0x07; m_ed=m_ed & 0x0f; //**********Часы byte h_ed=h_dec; h_dec=h_dec >> 4; h_dec=h_dec & 0x03; h_ed=h_ed & 0x0f; //**********Дата byte dat_ed=dat_dec; dat_dec=dat_dec >> 4; dat_dec=dat_dec & 0x03; dat_ed=dat_ed & 0x0f; //**********Месяц byte mon_dec=0; byte mon_ed=mon; bitWrite(mon_dec, 0, bitRead(mon, 4)); mon_ed=mon_ed & 0x0f; mon=(mon_dec*10)+mon_ed; //оформляем месяц в виде единого числа //**********Год byte yer_ed=yer_dec; yer_dec=yer_dec >> 4; yer_dec=yer_dec & 0x0f; yer_ed=yer_ed & 0x0f; unsigned int yr=2000+(yer_dec*10)+yer_ed; //оформляем год в виде единого числа //**********Вывод данных на дисплей //**********Выводим время на дисплей myOLED.clrScr(); myOLED.setFont(BigNumbers); myOLED.printNumF(h_dec, 0, 1, 39); myOLED.printNumF(h_ed, 0, 17, 39); myOLED.print("-", 33, 39); myOLED.printNumF(m_dec, 0, 49, 39); myOLED.printNumF(m_ed, 0, 65, 39); myOLED.print("-", 81, 39); myOLED.printNumF(s_dec, 0, 97, 39); myOLED.printNumF(s_ed, 0, 113, 39); //**********Выводим день недели на дисплей myOLED.setFont(RusFont); switch (d_dec) { case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break; case 2: myOLED.print("DNJHYBR", CENTER, 0); break; case 3: myOLED.print("CHTLF", CENTER, 0); break; case 4: myOLED.print("XTNDTHU", CENTER, 0); break; case 5: myOLED.print("GZNYBWF", CENTER, 0); break; case 6: myOLED.print("CE<<JNF", CENTER, 0); break; case 7: myOLED.print("DJCRHTCTYBT", CENTER, 0); break; case 0: myOLED.print("YJKM", CENTER, 0); break; } //**********Выводим дату на дисплей myOLED.printNumF(dat_dec, 0, 3, 20); myOLED.printNumF(dat_ed, 0, 11, 20); //**********Выводим месяц на дисплей switch (mon) { case 1: myOLED.print("ZYDFHZ", CENTER, 20); break; case 2: myOLED.print("ATDHFKZ", CENTER, 20); break; case 3: myOLED.print("VFHNF", CENTER, 20); break; case 4: myOLED.print("FGHTKZ", CENTER, 20); break; case 5: myOLED.print("VFZ", CENTER, 20); break; case 6: myOLED.print("B>YZ", CENTER, 20); break; case 7: myOLED.print("B>KZ", CENTER, 20); break; case 8: myOLED.print("FDUECNF", CENTER, 20); break; case 9: myOLED.print("CTYNZ<HZ", CENTER, 20); break; case 10: myOLED.print("JRNZ<HZ", CENTER, 20); break; case 11: myOLED.print("YJZ<HZ", CENTER, 20); break; case 12: myOLED.print("LTRF<HZ", CENTER, 20); break; } //**********Выводим год на дисплей myOLED.printNumF(yr, 0, RIGHT, 20); myOLED.update(); delay(250); } // Модуль давления и температыры dps.getPressure(&Pressure); dps.getTemperature(&Temperature); myOLED.clrScr(); myOLED.setFont(BigNumbers); myOLED.printNumF((Pressure/133.3), 0, 20, 5); myOLED.setFont(RusFont); myOLED.print(" VV HN CN", 65, 16); myOLED.setFont(BigNumbers); myOLED.printNumF((Temperature*0.1), 0, 34, 34); myOLED.setFont(SmallFont); myOLED.print("~C", 70, 45); myOLED.update(); delay(2000); } //**********закрывающая скобка LOOP //**********Подпрограммы byte ReadRTC(byte adress) { Wire.beginTransmission(0x68); //работа с DS1307 Wire.write(adress); //адрес регистра часов Wire.endTransmission(); // Wire.requestFrom(0x68, 1); //читаем один байт return Wire.read(); //прочитали значение регистра } void WriteRTC(byte adress, byte data) { Wire.beginTransmission(0x68); //DS1307 запись регистра по адресу Wire.write(adress); //адрес регистра Wire.write(data); //записываемые данные Wire.endTransmission(); }
Библиотека OLED или тынц На второй ссылке надо поменять расширение gif на rar. С BMP-185 проблем, думаю, быть не должно.
Ну да - шрифты жрут много. Юзайте только те символы, которые нужны - можно сгенерить нужные шрифты или пошукать готовые. У вас аж три шрифта используется - посмотрите их размер в сумме - имхо тут собака и порылась, в части занимаемой памяти.
Тоже грешил на шрифты, но с другой стороны есть у меня стыренная прошивка с тем же функционалом, только там используется библиотека для работы с RTC - так там расход ОЗУ 59% (выложить смогу только вечером).
Мне казалось, что грузить шрифт в ОЗУ сильно не рационально, я таблицы всегда размещаю в памяти программ. Тогда вопрос - есть ли возможность прямо указать размещение шрифтов в памяти программ?
Мне казалось, что грузить шрифт в ОЗУ сильно не рационально, я таблицы всегда размещаю в памяти программ. Тогда вопрос - есть ли возможность прямо указать размещение шрифтов в памяти программ?
Это зависит от библиотеки: скажем, в u8glib такая возможность есть. Как в вашей - не знаю, надо доку по ней читать ;)
DIYMan Спасибо!
Да, действительно, шрифты размещаются в памяти программ. А так, в библиотеке организован буфер на килобайт. Его несколько можно убавить без ущерба для данной программы, в случае необходимости. При использовании и графики и шрифтов, возможно, уже не убавить.
...Библиотека OLED 128х64? Так у меня TFT дисплей 320х240 с тачём как раз и сожрал 22% ОЗУ.