2013-03-09 4 views
8

У меня есть Arduino Uno R3. Я делаю логические объекты для каждого из моих датчиков с помощью C++. Arduino имеет очень ограниченную встроенную память 32KB *, и, в среднем, мои скомпилированные объекты выходят около 6KB *.g ++ флаг компилятора для минимизации двоичного размера

Я уже использую наименьшие возможные типы данных, чтобы свести к минимуму объем памяти. Есть ли флаг компилятора, чтобы минимизировать размер двоичного файла, или мне нужно использовать более короткие имена переменных и функций, меньше функций и т. Д., Чтобы свести к минимуму мою базу кода?

Также будут оценены любые другие советы или советы по минимизации двоичного размера.

* Он не может быть измерен в КБ (поскольку у меня его нет, он передо мной), но 1 объект составляет приблизительно 1/5 от моего общего объема памяти, что вызывает мое беспокойство.

+1

НКУ -O3, -O2 O для оптимизации –

+0

@Grijesh Нет ... -O3 сделает двоичные файлы больше в целом. – us2012

+6

@Zak Опция gcc, оптимизирующая размер, - '-O'. Вы также можете «вырезать» символы для ваших двоичных файлов после ссылки. – us2012

ответ

21

Есть много методов, чтобы уменьшить размер бинарного кода в дополнение к чему us2012 и другие упомянутые в комментариях, суммируя их с некоторыми точками моей:

  • Использование -Os сделать GCC/G ++ оптимизировать размер.
  • Используйте -ffunction-sections -fdata-sections для разделения каждой функции или данных на отдельные секции внутри единицы перевода. Объедините его с опцией компоновщика -Wl,--gc-sections, чтобы избавиться от любых разделов без ссылок.
  • Запустить strip с помощью, по меньшей мере следующих параметров: -s -R .comment -R .gnu.version. Его можно комбинировать с --strip-unneeded, чтобы удалить все символы, которые не нужны для обработки перемещений.
7

Если ваш код не содержит C++ - обработка исключений, вы можете сэкономить много места (до 30k после всех шагов оптимизации, упомянутых Tuxdude). Поэтому вы должны предоставить следующий флаг: -fno-exceptions

Но даже если вы сделать не исключения использования, обработка исключений может быть включена! Проверьте следующие шаги:

  1. no usage of new, delete. Если вам действительно нужно, замените их на malloc/free wrappers. Например, поиск «tinynew.cpp»

  2. обеспечивает функцию для чистого виртуального вызова, например. extern "C" void __cxa_pure_virtual() { while(1); }

  3. переписать __gnu_cxx :: __ verbose_terminate_handler(). Он обрабатывает необработанные исключения и называет demangling, что довольно велико! (Например, d_print_comp.part.10 с 9.5k или d_type с 1.8K)

Приветствий Flo

+0

Спасибо за этот совет! – Zak

Смежные вопросы