Как уменьшить размер бинарика?
- Войдите на сайт для отправки комментариев
Пнд, 11/03/2013 - 11:42
Я счастливый владелец Seeduino Film со всеми прибабасами. Но у меня проблема в том что 14 кило уже не хватает - как оптимизировать размер ? Может есть упаковщик типа UPX? Поменять IDE ? Отказать от библиотек: только транзакции в только хардкор?
В первую очередь нужно оптимизировать код.
Ну я понял что String дает +2 килобайта
Но без int float и char - вообще никак.
Процедуры делать отдельными - тоже не сильно уменьшает размер, а если процедура используется только в 2х местах то проше - копипаст - меньше обьем дает.
Процедуры делать отдельными - тоже не сильно уменьшает размер, а если процедура используется только в 2х местах то проше - копипаст - меньше обьем дает.
Вызов функции - это пара десятков байтов. Любая нетривиальная функция - это полсоотни байтов как минимум. Так что то, что вы называете копипастом будет иметь скорее обратный эффект.
Хотите действительно сократить объем скетча - переходите от вызовов библиотечных функций (универсальных и поэтому имеющих очень много лишнего) к прямой манипуляции регистрами микроконтроллера - на небольших скетчах можно добиться двух-трехкратного сокращения кода.
А вообще - вопрос ни о чем. Задача оптимизировать код. Сам код - не известен. Какие библиотеки используются - не ведомо (а ведь может к примеру использует шилд какой-то у которого библиотека много жрет и замена шилда на более интелектуальный поможет. Скажем переход од enc28j60 на wiznet). Может используются програмные PWM/SPI/Serial и нужен переход на их hardware вариант.
Может код пилить нужно, может от работы со строками отказыватся (они ой как любят память жрать, особенно если их раскидывать по всему коду), а может реально "предел". Всегда можно нафантазировать фичей больше чем потянет контроллер.
Может от ардуино библиотек прийдется отказыватся (за простоту нужно платить) и переходить на чистый AVR. А может желаний настолько много что только переход на ASM поможет (что-бы контролировать каждый байт).
Если бы существовала методика оптимизации любого произвольного кода, которую можно посоветовать "не глядя на конкретную задачу" - она уже была-бы встроенна в компилятор (и поверте там уже куча такого встроенно, все что можно оптимизировать по формальным признакам - уже есть :)
А еще можно почитать про опции компиляции avr-gcc (его ArduinoIDE использует в качестве компилятора), возможно через них компиляруя руками выйдет "отключить что-нибудь не нужное в вашем случае" и за счет этого уменьшить код.
В моем случае есть 3 библиотеки которые используют wire.h и arduino.h + много вывода в serial - как это оптимизировать?
Не глядя в код, тут ничего не сказать.
Как минимум, покажите код.
В моем случае есть 3 библиотеки которые используют wire.h и arduino.h + много вывода в serial - как это оптимизировать?
Никак.
Вам уже вроде объяснили что "общих рецептов" не бывает. А показывать код - вы не хотите. Значит либо сами что-то придумывайте, либо покупайте более жирный камень.
Покажете код - может кто-то что-то и подскажет. А может и нет. Но без кода - точно шансы нулевые.
Вот такой код.
Так сколько килобайт не хватает?
14кб , seediono film она как Arduino pro mini w/ AT 168
Так вы можете сказать сколько килобайт НЕ ХВАТАЕТ ? Не сколько килобайт в дуине всего , а какая разница между тем что получается при компиляции и 14-тью килобайтами.
Как минимум, полезно весь статический текст оставить в флэш-памяти,
т.е. вместо:
Serial
.print(
"HEADING:"
);
писать
Serial.print(F("
HEADING:
"))На первый взгляд тупым убиранием ненужных println, вместо которых добавляется "\n" dв соответвующую строку Serial.print можно съекономить байт 400. Дальше - нужно смоттреть на скомпилированную программу, настройки компилятора и реализацию библиотек.
Вы меня заинтересовали - выложите, плз, ссылки на все используемые библиотеки, вопрос стал делом спортивного интереса.
Отказатся от бутлодера- занять его место кодом - ещё 2 килобайта...
Поставить 328....
https://github.com/saintbyte/SeeedOLED - SeeedOLED.h
http://code.google.com/p/motionframe/source/browse/#svn%2Ftrunk%2F%20motionframe%2Flibraries - HP03M.h,MMA7660FC,W25Xnn
http://www.seeedstudio.com/wiki/File:Digital_Compass.zip HMC5883L
В общем путем небольших телодвижений у меня на настоящий момент размер скетча уменьшился до 13696 байт.
Вот текст:
Правда пришлось немного исправить библиотеки компаса (добавил функцию, которая за один раз читает и Raw и Scaled данные, подправил функцию setScale, убрав неиспользуемые ветки кода) и OLED (подправил функцию putChar так, чтобы она все писала сразу в Wire, не зовя промежуточную функцию writeData).
Это явно не предел, но мне дальше стало лень.
Например, можно повыкидывать нафиг все библиотеки и работать напрямую с девайсами, благо в данном случае все ограничивается записьмю-чтением одной-двух команд через Wire.
Выложи и я загитую =) Или сразу загитуй а =)
Не, гитовать это не надо. Это в данном случае такие удлвки полезны, а в общем они уменьшают читаемость и структурную целостность.
Вот эту функцию добавил в HMC5883L.cpp (ну и в хедер, конечно, добавил):
А вот тут грязными руками покопался в SeeedOLED.cpp (предварительно убрав модификатор PROGMEM у массиваBasicFont):