keil 51 to avr gcc
Masz problem? Zapytaj na forum elektroda.pl
From: ynio <grave_at_nospam_poczta.onet.pl>
Subject: keil 51 to avr gcc
Date: Sat, 04 Feb 2006 19:32:11 +0100
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
From: "swinio" <swiniaczek_at_nospam_buziaczek.pl>
Subject: Re: keil 51 to avr gcc
Date: Sat, 4 Feb 2006 19:54:56 +0100
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
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
From: Zbych <abuse_at_nospam_onet.pl>
Subject: Re: keil 51 to avr gcc
Date: Sat, 04 Feb 2006 22:59:51 +0100
ynio przemówił ludzkim głosem:
Kompilacja ustawiona jest na najlepsza optymalizacje (-Os). Czemu tak
jest ?
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)
Podejrzewam ze avr gcc laduje male funkcje jako inline, co
zwieksza rozmiar ale przyspiesza.
Raczej nie, chyba że sam zadeklarujesz funkcję jako inline, albo static.
Mi natomiast zalezy na jak mniejszej
wielkosc. Macie jakies porady ?
- 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.
From: AK <arkkar_at_nospam_gazeta.pl>
Subject: Re: keil 51 to avr gcc
Date: Sun, 05 Feb 2006 15:23:58 +0100
ynio napisaĹ(a):
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
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