You are on page 1of 3

KURS

AVR-GCC: kompilator C dla


mikrokontrolerw AVR, cz

Rozpoczynamy cykl artykuw, ktrych zadaniem jest przedstawienie podstaw


oraz praktycznych zasad programowania mikrokontrolerw AVR w jzyku C
z uyciem kompilatora avr-gcc. Oczywicie wybr kompilatora AVR-GCC moe
si jednym podoba, a innym nie. Postaramy si jednak uzasadni, e nie
jest to zy wybr.
Zanim przejdziemy do konkretw
na pocztek kilka sw uzasadniajcych taki wanie wybr narzdzi.
Po pierwsze: po co w ogle jzyk wysokiego poziomu skoro mikrokontrolery wietnie programuje si w
assemblerze, ktry daje pen kontrol nad kodem i zasobami procesora
i pozwala na uzyskanie maksymalnej
szybkoci i zwizoci? Ot cay
problem ley w skali. W przypadku
maych ukadw z niewielkimi zasobami, wykonujcych niezbyt zoone
zadania (proste pomiary, sterowania
czy transmisje) asembler rzeczywicie bdzie cakowicie wystarczajcy
(a czasem wrcz niezastpiony). Gdy
jednak program si nam rozrasta i
komplikuje (obrbka wikszych iloci
danych, bardziej zoone przeliczenia
i konwersje, zaawansowane algorytmy sterowania itp.), prdzej czy pniej dochodzimy do progu, powyej
ktrego nasze dzieo staje si coraz
mniej czytelne i coraz trudniejsze
do opanowania. Nagle stwierdzamy,
e dotychczasowe dowiadczenia w
asemblerze to za mao eby szybko
i skutecznie rozwiza szerszy zakres
problemw (taka zreszt bya w ogle geneza stworzenia jzykw wyszego poziomu). Tutaj przechodzimy
do drugiego pytania.
Po drugie: dlaczego wanie C a
nie np. BASIC czy Pascal? Ot C
by od pocztku projektowany jako
jzyk moliwie maksymalnie zbliony
do sprztu i generujcy kod niewiele odbiegajcy od samodzielnie pisanego w asemblerze. W poczeniu z
optymalizatorem kodu (skadnik kadego dobrego kompilatora) pozwala
to na uzyskanie zaskakujco zwartego, krtkiego i szybkiego programu
wynikowego. Oczywicie mamy rwnie moliwo dopisania w czystym
asemblerze fragmentw krytycznych
czasowo (jak np. obsuga przerwa)
jeli nie zadowala nas kod generowany automatycznie. W ten sposb

Elektronika Praktyczna 3/2005

moemy bez problemu poczy najwiksze zalety obu sposobw programowania. Nastpna sprawa to przenono. Znaczne fragmenty kodu (a
szczeglnie algorytmy, przeliczenia,
konwersje itp. - czyli elementy nie
korzystajce bezporednio ze specyficznych zasobw i interfejsw danego mikrokontrolera) moemy atwo
zastosowa w programie dla zupenie innej kostki (praktycznie kada
rodzina mikrokontrolerw posiada
opracowany kompilator C - z innymi jzykami nie jest tak dobrze). Tu
od razu przechodzimy do nastpnej
zalety C: rozpowszechnienia. C jest
od lat oglnie przyjtym standardem
programowania z czym wie si
ogromna ilo dostpnych materiaw: bibliotek, przykadowych kodw,
opisw, tutoriali, gotowych rozwiza
sprztowo - programowych. W wielu
przypadkach wystarczy dobrze poszuka w zasobach sieciowych eby
znale prawie gotowe rozwizania
wasnych zada programowych.
Po trzecie: dlaczego kompilator
avr-gcc (o ktrym kr opinie, e
jest niewdziczny i trudny w konfiguracji i obsudze) a nie jakie inne
rozpowszechnione narzdzie - jak np.
CodeVision czy ICC? Jednym z koronnych argumentw jest oczywicie
fakt, e avr-gcc jest bezpatny. Ale
to nie wszystko: jest to narzdzie
dostpne dla wielu platform (wic
bez problemu moemy przenosi si
z naszymi projektami pomidzy np.
Windows a Linuksem). Przy tym avr-gcc jest produktem open-source, z
czym wie si cay szereg udogodnie: mamy cay czas dostp do najnowszych uaktualnie, penej informacji o wykrytych bdach, a take
do ogromnych zasobw bardziej lub
mniej zaawansowanego kodu tworzonych i oferowanych do swobodnego wykorzystywania, moemy te
cay czas liczy na wsparcie i podpowiedzi na aktywnie dziaajcych

midzynarodowych forach, grupach


i listach. A w dodatku - jak zaraz
si przekonamy - przy uyciu dodatkowych narzdzi wspomagajcych
avr-gcc staje si bardzo porcznym i
wygodnym w uyciu instrumentem.
Mona te doda - ju poza kontekstem stosowania w AVR - e gcc ma
wersje (tzw. porty) dla wielu innych
mikroprocesorw (np. MSP 430 czy
ARM) wic raz opanowany znacznie
uatwi ewentualne przesiadki.
Jednak eby nie wygldao to jak
reklamowa laurka naley te powiedzie o mankamentach. Gwny z
nich to nie do koca rozpracowana
obsuga przez gcc niecigej przestrzeni adresowej AVR (dokadniej
omwimy to w trakcie prezentacji
przykadw). Zaleta jak jest cigy
rozwj gcc moe te sta si wad
w momencie wprowadzenia bardziej
radykalnych zmian wymagajcych
korekt we wczeniej dziaajcych
projektach. Czasem pojawiaj si
drobniejsze bdy widoczne tylko w
specyficznych sytuacjach (by moe
dlatego przeoczone w trakcie prac

Rys. 1. Przykadowy przebieg kompilacji kodu rdowego

81

KURS

Rys. 2. Struktura folderw kompilatora avr-gcc

nad kompilatorem). Czy te wady s


bardzo uciliwe - ocenimy sami po
pierwszych prbach programowania.

Nasze rodowisko uruchomieniowe

Nasz kursowy zestaw do programowania AVR skada si z nastpujcych pakietw narzdzi:


waciwego kompilatora avr-gcc,
ktry jest programem typu CLI
(command line interface) i bez
dodatkowego wsparcia musiaby
by obsugiwany z poziomu konsoli tekstowej;
graficznego rodowiska eliminujcego powysz niedogodno - w
tej roli wystpuje bezpatne AvrSide pozwalajce na szybkie i intuicyjne wykonanie podstawowych
operacji (wersja PL);
najnowszej, mocno ostatnio rozwinitej i unowoczenionej wersji
firmowego pakietu Atmela AvrStudio, ktry suy jako symulator i
debugger do testowania naszych
przykadowych projektw.
Cao jest zainstalowana na platformie Windows. Dopuszczalne s
wersje 98, ME, XP, 2000. AvrSide
nie da si uruchomi pod NT i 95
ze wzgldu na brak obsugi magistrali USB (koniecznej dla wbudowanego

82

w rodowisko programatora). Wymogi


sprztowe nie s krytyczne - jednak
rzecz jasna szybko i komfort pracy
bd mocno zalee od mocy komputera. Prototyp opisywanego zestawu
uywany przy opracowaniu kursu zosta uruchomiony na platformie Athlon XP 2600+512 MB+Windows XP
Pro PL, ktra zapewnia rzeczywicie
wygodn i bezproblemow prac.
Zauwamy, e nie ma na razie
mowy o adnym wsppracujcym
ukadzie sprztowym mikrokontrolera - wrcimy do tego tematu nieco
pniej.
Skd to wszystko wzi? Poniewa artykuy przygotowywane s ze
sporym wyprzedzeniem, a potrzebne
programy s wci rozwijane - najlepiej sign do rdowych witryn
projektw po najnowsze wersje. AvrSide znajdziemy na http://www.avrside.fr.pl albo na mirrorze http://www.
avrside.ep.com.pl. Instalujemy najpierw podstawow wersj D5 a nastpnie zastpujemy plik wykonawczy AvrSide.exe najnowszym dostpnym. Aktualne szczegy znajdziemy
w doczonych opisach i bezporednio na w/w stronach.
AvrStudio (w chwili pisania w
wersji 4.10) jest udostpnione do
bezpatnego pobrania z firmowej witryny Atmela http://www.atmel.com.
Troch wicej zastanowienia wymaga sam kompilator avr-gcc. Sztandarow dystrybucj avr-gcc dla Windows jest pakiet WinAvr Erica Weddingtona. Jednak nie naley utosamia avr-gcc z WinAvr jak to jest
czsto w uproszczeniu podawane. WinAvr jest ogromnym zestawem wszelkich narzdzi open-source przydatnych w programowaniu AVR. Oprcz
aktualnej wersji avr-gcc znajdziemy
tam notatnik programisty wspomagajcy tworzenie projektw, symulator
simulavr, debugger avr-gdb z graficznym interfejsem Insight, programator
avrdude, Avarice - interfejs komunikacji pomidzy avr-gdb a sprztowym
adapterem JTAG, szeroki wachlarz
maych pomocniczych programw
narzdziowych oglnego stosowania,
generator plikw makefile MFile oraz
ogromny zbir pomocy, manuali i
dokumentacji. WinAvr jest aktualizowane co kilka miesicy i dostpne
na http://winavr.sourceforge.net.
Wielk zalet WinAvr jest wszechstronno dostarczonego materiau,
ktry pozwala na dogbne zapoznanie si z metodyk programowania,
a take na indywidualny wybr naj-

bardziej pasujcego zestawu narzdzi. Jednak dla pocztkujcego ta


wszechstronno moe zmieni si w
powan wad: po prostu trudno si
w tym wszystkim poapa. Dodatkowym utrudnieniem jest konieczno
zapoznania si (przynajmniej w oglnym zarysie) z zasadami dziaania i
uywania managera procesw make,
stosowanego standardowo do uruchamiania kompilatora.
Ale w naszym rodowisku ten
nadmiar w niczym nie przeszkadza. Wykorzystamy po prostu tylko
sam kompilator (AvrSide nie uywa
make), gdy za zechcemy poczyta
dokumentacj albo wyprbowa inne
techniki opracowania projektw wszystko bdzie pod rk. AvrSide
byo zreszt pocztkowo dedykowane
do wsppracy z WinAvr i domylnie jest instalowane w jego folderze.
Dopiero pniej pojawia si wasna
dystrybucja avr-gcc (take na stronie http://www.avrside.fr.pl). Obecnie
mamy wic do wyboru dwie moliwoci:
instalacja kompletnego WinAvr a
nastpnie AvrSide domylnie w
folderze gwnym WinAvr;
uproszczona instalacja samego
AvrSide we wasnym niezalenym
folderze np. c:\AvrSide i uzupenienie kompilatorem (wanie tak
jest skonfigurowane rodowisko
uywane na potrzeby artykuu).
W obu przypadkach AvrStudio
instalujemy cakiem niezalenie zgodnie z zaleceniami Atmela.
Zanim zabierzemy si do pisania
pierwszych programw zapoznajmy
si oglnie z dziaaniem elementw
rodowiska programistycznego. Znakomicie uatwi to dalsz prac i analiz pierwszych przykadw. Mona
oczywicie na razie te zagadnienia
przejrze tylko pobienie - bdziemy
wielokrotnie do nich wraca.

Jak dziaa avr-gcc

Avr-gcc okrelamy oglnym mianem kompilatora - jednak w rzeczywistoci jest to cay szereg wsppracujcych ze sob narzdzi i bibliotek uywanych w odpowiedniej
kolejnoci i z potrzebnymi opcjami
(waciwy kompilator avr-gcc, zestaw narzdziowy avr-binutils oraz
biblioteki dla rodziny AVR avr-libc).
Celem jest przetworzenie kodu rdowego C zapisanego w jednym lub
wielu plikach projektu na wynikowe
pliki: kodu wykonawczego wpisywanego do pamici Flash wybranego

Elektronika Praktyczna 3/2005

KURS
modelu mikrokontrolera oraz (ewentualnie) danych wpisywanych do
wewntrznej pamici EEPROM. W
trakcie powstaje take szereg pomocniczych plikw zawierajcych rozmaite informacje potrzebne do debugowania oraz pozwalajce oceni efekty pracy kompilatora. Przykadowy
przebieg przetwarzania jest pokazany
na rys. 1.
Najpierw pliki rdowe poddawane
s dziaaniu preprocesora, ktry realizuje zmiany w kodzie nakazane wpisanymi przez nas dyrektywami:
docza dodatkowe pliki z dyrektyw
#include,
wstawia definicje oraz rozwija makroinstrukcje z dyrektyw #define,
uwzgldnia odpowiednie fragmenty
kodu z dyrektyw kompilacji warunkowej #if #else #endif.
Tak przygotowany kod poddawany
jest waciwej kompilacji czyli przekodowaniu zapisu C na cig instrukcji
asemblera (z przeprowadzeniem optymalizacji - automatycznego uproszczenia i skrcenia kodu), wynikiem tego
s porednie pliki *.s.
Pliki asemblerowe podlegaj nastpnie przetworzeniu na kod maszynowy (asemblacji). Powstae pliki
*.o s na razie tzw. relokowalne
(przemieszczalne) - adresy zmiennych
i funkcji nie s jeszcze konkretnie
ustalone (pozostaj nadal okrelone
jedynie nazwami symbolicznymi uytymi przez nas w programie).
Pliki relokowalne s czone (linkowane, konsolidowane) w nastpnej operacji - polega to wanie na ulokowaniu wszystkich porcji kodu w obszarze
pamici programu oraz wyliczeniu i
nadaniu symbolom okrelonych adresw. Jednoczenie zostaj doczone
wszelkie niezbdne funkcje biblioteczne
wykorzystywane przez nas (jawnie lub
porednio) w programie, a take specyficzny dla danego typu mikrokontrolera
plik kodu inicjalizujcego.
Wynikiem powyszych zabiegw
jest tzw. plik obiektowy (zazwyczaj
nadaje mu si rozszerzenie .elf), ktry zawiera wszelkie informacje o projekcie (kod wynikowy, informacje dla
debuggera, wykaz symboli, rozmiary
poszczeglnych sekcji kodu). Z informacji tych moemy korzysta wedug
potrzeb dekodujc potrzebne fragmenty za pomoc zbioru narzdzi binutils.
Rysunek pokazuje tylko podstawowe
zastosowanie - utworzenie plikw wykonywalnych wpisywanych przy pomocy programatora do pamici Flash
oraz EEPROM mikrokontrolera.

Elektronika Praktyczna 3/2005

Do tych - na razie bardzo skrtowych i oglnych informacji - bdziemy wielokrotnie wraca w trakcie
omawiania przykadowych projektw.
Na razie zobaczmy jeszcze jak s
rozmieszczone poszczeglne elementy
kompilatora i gdzie szuka wymienionych wczeniej narzdzi.
Rys. 2 przedstawia drzewko folderw kompilatora. Nie wszystkie
subfoldery s dla nas jednakowo
istotne ale do niektrych bdziemy
czsto zaglda.
Gwny folder zosta nazwany
na podstawie uytych wersji narzdzi (avr-gcc w wersji 3.4.2, binutils
w wersji 2.15 i biblioteki avr-libc w
wersji 1.0.4). W WinAvr powysza nazwa gwnego katalogu nie wystpuje
- rol t peni po prostu \WinAvr\,
jednak zasadnicza struktura drzewa
subfolderw pozostaje taka sama.
Dla uytkownika - programisty AVR
najbardziej istotne s podkatalogi:
\bin\ - zawierajcy zestaw bezporednio uywanych programw narzdziowych avr-gcc i avr-binutils,
\avr\include\ (oraz \avr\include\
avr\) - grupujcy pliki nagwkowe (headers) biblioteki avr-libc,
w szczeglnoci pliki opisujce
zasoby poszczeglnych kostek,
do ktrych czsto zagldamy dla
sprawdzenia np. nazw rejestrw
czy wektorw przerwa,
\avr\lib\ldscripts\ - zawiera skrypty
sterujce prac konsolidatora (linkera), w szczeglnoci opisujce
wielkoci poszczeglnych obszarw
pamici, jej podzia na sekcje, adresy pocztkowe i kocowe,
\lib\gcc\avr\3.4.2\include - znajdziemy tu oglne pliki nagwkowe
gcc, nie powizane bezporednio z kostkami AVR ale czsto
uywane (np. przy zastosowaniu
zmiennych logicznych bool),
\doc\avr-libc\avr-libc-user-manual\
- mieci aktualny opis funkcji
bibliotecznych avr-libc oraz wiele
istotnych szczegowych informacji dotyczcych rnych aspektw programowania (jest to pozycja obowizkowa - tu zagldamy
prawie codziennie).
Pozostae subfoldery zawieraj
wewntrzne podprogramy i biblioteki
gcc, wywoywane podczas kompilacji
w tle bez naszego bezporedniego
udziau.
Zwrmy uwag na do tajemnicze w pierwszej chwili oznaczenia: avr3 - avr4 - avr5. Wynikaj
one z przyjtego podziau szeregu

kostek AVR na rne typy architektury zwizane z wielkoci zasobw


danego mikrokontrolera. Kady typ
posiada oddzielny zestaw bibliotek.
Jednak nie musimy si tym kopota
- na podstawie podanej w wywoaniu nazwy kostki konsolidator samoczynnie wybiera odpowiedni zestaw
z waciwego subfolderu (wicej na
ten temat powiemy przy opisach
dziaania avr-ld).
Teraz pozostaje ju tylko pytanie
jak uy tych wszystkich narzdzi
dla uzyskania podanego efektu.
Najbardziej podstawowym sposobem
bdzie kolejne wpisywanie potrzebnych komend w linii polece tekstowej konsoli. Taka metoda - chocia
dobra do przeprowadzenia eksperymentw edukacyjnych - jest zbyt
uciliwa i powolna przy praktycznym programowaniu - potrzebna jest
nam automatyzacja caego procesu
kompilacji. Tradycyjnym i bardzo
rozpowszechnionym rozwizaniem
jest zastosowanie programu narzdziowego make. Mwic w wielkim
skrcie jest to uniwersalny zarzdca
procesw, ktry wykonuje po kolei zadania okrelone podanymi mu
przy wywoaniu zasadami (rules).
Zasady te zapisujemy w okrelony
sformalizowany sposb w tekstowych
plikach makefile przygotowanych dla
kadego projektu. Make jest bardzo
wszechstronnym i potnym narzdziem pozwalajcym na praktycznie
dowolne ksztatowanie jego dziaania.
Jednak ta zaleta potrafi sta si powan wad i przeszkod przy rozpoczynaniu nauki programowania musimy na wstpie opanowa dodatkowy spory zasb wiadomoci. Poza
tym make jest narzdziem typowo
tekstowym - nie stanowi to adnej
przeszkody dla mionikw Linuksa,
ale przyzwyczajeni do interfejsw
graficznych uytkownicy Windows
maj prawo mie inne zdanie (absolutnie nie mam zamiaru powraca
tu do odwiecznego sporu o wyszo jednego systemu nad drugim
- stwierdzam po prostu fakt). W naszym kursie realizowanym na platformie Windows wykorzystamy wic
inne narzdzie. Oczywicie w miar nabierania dowiadczenia opanowanie make bdzie rwnie bardzo
wskazane - ale to oddzielny temat i
w obecnym cyklu artykuw nie bdziemy si tym zajmowa.
Jerzy Szczesiul, EP
jerzy.szczesiul@ep.com.pl

83

You might also like