2013-03-09 11 views
8

Mam Arduino Uno R3. Tworzę logiczne obiekty dla każdego z moich czujników używając C++. Arduino ma bardzo ograniczoną pamięć wewnętrzną 32 KB *, a moje skompilowane obiekty średnio wynoszą około 6 KB *.g ++ flaga kompilatora, aby zminimalizować rozmiar binarny

Używam już najmniejszych możliwych typów danych, aby zminimalizować ślad pamięci. Czy jest flaga kompilatora, aby zminimalizować rozmiar pliku binarnego, czy też muszę używać krótszych nazw zmiennych i funkcji, mniej funkcji itp., Aby zminimalizować bazę kodu?

Zostaną również docenione wszelkie inne wskazówki lub porady dotyczące zminimalizowania rozmiaru binarnego.

* Nie można go zmierzyć w KB (ponieważ nie mam go przed sobą), ale 1 obiekt to około 1/5 całkowitej wielkości pamięci, co wzbudza moją obawę.

+1

gcc -O3, -O2 O dla optymalizacji –

+0

@Grijesh nr ... -O3 uczyni binarne powiększenie ogólnie. – us2012

+6

@Zak Opcja gcc optymalizująca rozmiar to '-Os'. Możesz również "rozebrać" symbole dla plików binarnych po połączeniu. – us2012

Odpowiedz

21

Istnieje wiele technik w celu zmniejszenia binarny format oprócz tego, co us2012 i inne wymienione w komentarzach, podsumowując je z niektórych punktach własnego:

  • Zastosowanie -Os aby gcc/g ++ optymalizacji rozmiar.
  • Użyj -ffunction-sections -fdata-sections, aby oddzielić każdą funkcję lub dane na odrębne sekcje w obrębie jednostki tłumaczeniowej. Połącz ją z linkiem opcji -Wl,--gc-sections, aby pozbyć się sekcji, do których nie ma żadnych odniesień.
  • Uruchom strip z co najmniej jedną z następujących opcji: -s -R .comment -R .gnu.version. Można go połączyć z --strip-unneeded, aby usunąć wszystkie symbole, które nie są niezbędne do przetwarzania relokacji.
7

Jeśli twój kod nie zawiera C++ - obsługa wyjątków pozwala zaoszczędzić dużo miejsca (do 30k po wszystkich optymalizacjach kroków wymienionych przez Tuxdude). Dlatego trzeba podać następujące flagi: -fno-exceptions

Ale nawet jeśli ty nie zastosowania wyjątków, obsługa wyjątków mogą być włączone! Sprawdź następujące kroki:

  1. no usage of new, delete. Jeśli naprawdę tego potrzebujesz, wymień je na opakowania typu malloc/free wrapper. Aby na przykład wyszukać "tinynew.cpp"

  2. podać funkcję dla czystego połączenia wirtualnego, np. extern "C" void __cxa_pure_virtual() { while(1); }

  3. Zastąpić __gnu_cxx :: __ verbose_terminate_handler(). Obsługuje nieobsługiwane wyjątki i demangluje nazwę, która jest dość duża! (Np d_print_comp.part.10 z 9.5k lub d_type z Wynajem 1,8 tys)

Cheers Flo

+0

Dziękuję za radę! – Zak

Powiązane problemy