keil 51 to avr gcc

Feb 04, 2006 3 Replies

Witam Mam pewien problem. jakis czas temu napisalem program do 89s52 w keil C. Program zajmowal ok 6kB (bin). Teraz postanowilem to samo przepisac na AVR atmege8. Jeszcze nie skonczylem a program juz zajmuje 6.5kB. Kompilacja ustawiona jest na najlepsza optymalizacje (-Os). Czemu tak jest ? Podejrzewam ze avr gcc laduje male funkcje jako inline, co zwieksza rozmiar ale przyspiesza. Mi natomiast zalezy na jak mniejszej wielkosc. Macie jakies porady ? dzieki ynio


Cze¶æ: Mo¿e trzeba ATmega16 - ma 8k-s³ów pamiêci flash, a ATmega8 4K-s³ów. Chocia¿ zrobi³em na ATmega8 sterownik który ma parê funkcji: obs³uga klawiaturki, wy¶wietlacza LCD, pomiar temperatury, termostat, timer, nastawy, generowanie czêstotliwo¶ci, modulacja czêstotliwo¶ci. I to zajmuje ok. 2,5K-s³ów. Spróbuj zmieniæ komilator na IAR-a lub CodeVision. IAR chyba jest ograniczony czasowo, a ten drugi rozmiaroem kodu. pozdro: swinio

ynio przemówił ludzkim głosem:

Powodów większego rozmiaru może być kilka:

  1. każdy rozkaz w avr to minimum 2 bajty, w 51 minimum to jeden bajt.
  2. keil potrafi _automatycznie_ zrobić faktoryzację kodu, gcc nie.
  3. w keilu można wyłączyć promocję do int, gcc jej z kolei nadużywa
  4. gcc kiepsko radzi sobie z długimi liczbami (np 32-bitowymi)

Raczej nie, chyba że sam zadeklarujesz funkcję jako inline, albo static.

- jeśli nie używasz dużych liczb (np. 32-bitowych) to użyj opcji -mint8 (skrócenie inta do 8 bitów), dzięki temu oszczędzisz trochę bajtów na zbędnych promocjach do 16-bitowego inta.

- dodaj opcję --ffunction-sections, gcc preferuje wtedy rozkazy skoków krótkich

- przejrzyj program pod względem powtarzających się fragmentów.

- o takich rzeczach jak preferowanie zmiennych 8-bitowych bez znaku chyba nie ma co wspominać

- jeśli często musisz składać dłuższe liczby z kilku np. bajtowych to używaj raczej unii niż sumy logicznej/arytmetycznej.

- przy operacjach bitowych na długich liczbach krótszy kod daje odwołanie do konkretnego bajtu liczby przez wskaźnik.

- jeśli nie jest to niezbędne to unikaj używania printfów itp. funkcji, lepiej napisać własne krótkie funkcje do wyrzucania znaków, konwersji liczb na ascii.....

Przy okazji, na grupie poświęconej avr-gcc jakiś czas temu (listopad zeszłego roku) była mowa o możliwości optymalizacji kodu na etapie linkowania (usuwanie nieużywanych funkcji, używanie skoków krótkich zamiast długich itp.). Niestety w najnowszym winavr nic nie ma na ten temat, więc wychodzi na to, że należałoby samemu nałożyć łaty.

ynio napisał(a):

Sprobuj ustawic optymalizacje na -O2 - nie wiem jak w przypadku avr, ale dla arm-a O2 daje mniejszy kod niz -Os. Ewentualnie zmien procesor na ATmega168 - jest kompatybilny z ATmega8 pinowo, takze nie trzeba zmieniac plytki.

Pozdr AK

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required