63_71.pdf

(236 KB) Pobierz
Środowisko projektowe dla AVR-GCC
P R O G R A M Y
rodowisko projektowe
dla AVR-GCC
W artykule znajdziecie wskazówki, w jaki sposób
samodzielnie tworzyæ pomocnicze narzêdzia programowe
dla elektronika - amatora. Wprawdzie niemal do
wszystkiego znajdziemy dzisiaj darmowe oprogramowanie
w Internecie, ale nie zawsze spe³nia ono nasze
oczekiwania. W³asny wypiek pozwala na du¿o lepsz¹
realizacjê potrzebnych funkcji. Dostarcza przy tym wiele
satysfakcji. Takie zajêcie tylko pozornie nie jest
zwi¹zane z czyst¹ elektronik¹. Komputer wraz
z odpowiednimi programami jest ju¿ bowiem sta³ym
elementem wyposa¿enia warsztatu elektronika - jak
dawniej multimetr czy oscyloskop.
mo¿liwociach, ale pracuje wy³¹cznie
w trybie tekstowym. Zmniejsza to
w du¿ym stopniu wygodê jego u¿yt-
kowania w porównaniu do standardo-
wych, obecnie graficznych IDE ( Integ-
rated Development Environment -
zintegrowane rodowisko programis-
tyczne).
Niedawno by³ opisywany w EP
sposób u¿ywania AVR-GCC w takim
rodowisku - firmowym AVR Studio
Atmela, które niestety nie do koñca
eliminuje pewne niedogodnoci.
Szczególnie uci¹¿liwy jest brak samo-
czynnej lokalizacji b³êdów w przygo-
towywanym kodzie ród³owym, ko-
niecznoæ edycji plików makefile ,
a tak¿e czyszczenia foldera przed
ka¿d¹ kompilacj¹ ( clean ). Z kolei
AVR Studio oferuje wspania³e mo¿li-
woci debugowania (z ustawianymi
breakpointami i podgl¹dem zmien-
nych). Nasze oprogramowanie bêdzie
uzupe³niaj¹ce dla AVR Studio, po-
mocne zw³aszcza przy pierwszym -
obfituj¹cym w b³êdy sk³adniowe -
etapie przygotowania kodu ród³owe-
go dla mikrokontrolera.
Przedstawione opisy dotycz¹ rodo-
wiska Windows oraz popularnego pa-
kietu programistycznego Delphi.
Oczywicie, jest to tylko jedna z wielu
dostêpnych obecnie platform, wiêc
trudno mówiæ o jej wszechstronnej
uniwersalnoci. Ale z tym problemem
spotykamy siê dzisiaj prawie w ka¿dej
dziedzinie.
O wyborze Delphi zdecydo-
wa³o (obok szeregu niew¹tpli-
wych zalet) g³ównie udostêp-
nienie przez firmê Borland
bezp³atnej wersji pakietu. Jest
to Delphi 6PE ( Personal Edi-
tion ), z którego mo¿emy ko-
rzystaæ bez ¿adnych op³at po
przeprowadzeniu rejestracji na stronie
Borlanda. Wersja ta jest w pe³ni funkcjo-
nalna, nie ma ograniczeñ czasowych ani
¿adnych blokad uniemo¿liwiaj¹cych nor-
maln¹ pracê (jak np. spotykane w ró¿-
nych ewaluacyjnych edycjach ogranicze-
nia d³ugoci kodu czy te¿ zapisywania
projektów na dysk itp.).
Oczywicie wyposa¿enie pakietu jest
du¿o skromniejsze ni¿ wydañ komer-
cyjnych, na przyk³ad:
- nie ma komponentów obs³ugi baz
danych,
- brak kodów ród³owych biblioteki
komponentów,
- wy³¹czone s¹ niektóre u³atwienia
edytora.
Zarazem obowi¹zuje bardzo istotne
ograniczenie licencyjne: pakiet mo¿e
byæ u¿ywany tylko do celów nieko-
mercyjnych (tzn. nie mo¿e s³u¿yæ do
jakiejkolwiek dzia³alnoci zarobkowej).
W naszym zastosowaniu ¿adne z po-
wy¿szych ograniczeñ nie bêdzie jednak
stanowiæ powa¿niejszej przeszkody,
poniewa¿:
- pomocnicze programy warsztatowe
na ogó³ zadowalaj¹ siê gotowymi
komponentami i nie ma potrzeby
Delphi w wersji Personal Edition jest
bezp³atn¹ wersj¹ pe³nego pakietu komercyjne-
go. Mo¿emy z niego korzystaæ bez ¿adnych
op³at, wymagana jest jedynie rejestracja na
internetowej stronie firmy Borland.
Czym powinno siê
charakteryzowaæ
nasze rodowisko?
1. Edycja programu powin-
na byæ wspierana przez
wszelkie mo¿liwe udogodnie-
nia, typowe dla wspó³czes-
nych windowsowych edytorów: zazna-
czanie, wycinanie, kopiowanie, cofanie
operacji, wyszukiwanie i zamiana s³ów,
obs³uga schowka systemowego itd.
Równie wa¿ne jest wspomaganie typo-
wnikania w ich kody (co jest zazwy-
czaj konieczne w przypadku modyfi-
kacji lub dopisywania komponentów
potomnych),
- raczej nie bêdziemy u¿ywaæ baz da-
nych (a jeli ju¿, to w zakresie nie
wymagaj¹cym stosowania wizual-
nych komponentów wspomagaj¹-
cych),
- powstaj¹ce programy s¹ z za³o¿enia
przeznaczone dla potrzeb w³asnych
lub do niekomercyjnego rozpo-
wszechniania na zasadzie freeware .
Przyk³adowy projekt
Jako przyk³adowy projekt spróbujmy
opracowaæ okienkowe rodowisko do
obs³ugi bezp³atnego kompilatora C dla
rodziny AVR. AVR-GCC jest znakomi-
tym narzêdziem o wszechstronnych
Rys. 1. Okno obs³ugi sprzêtowego
programatora
Elektronika Praktyczna 1/2003
63
rodowisko projektowe
dla AVR-GCC
32565397.012.png 32565397.013.png
P R O G R A M Y
Instalacja i licencjonowanie D6PE
Instalacja i rejestracja przebiega nastêpuj¹co:
- Na stronie Borlanda ( www.borland.com ) w sekcji download wybieramy
Delphi 6 Personal. Obecnie ze strony mo¿na otrzymaæ tylko numer se-
ryjny i klucz - sam plik instalacyjny trzeba zdobyæ z innych róde³ (np.
z CD za³¹czanych do pism komputerowych). Wejcie do sekcji down-
load wymaga podania w³asnych danych ³¹cznie z kontem e-mail. Przy-
dzielon¹ nazwê u¿ytkownika oraz has³o zapamiêtujemy do dalszego
wykorzystania.
- Wkrótce otrzymamy e-mail z numerem seryjnym ( Serial Number ) oraz
kluczem upowa¿niaj¹cym ( Authorization Key ) i zapisujemy je.
- Uruchamiamy plik instalacyjny BorlandDelphiPersonalEdition.exe . Jest to
samorozpakowuj¹ce siê archiwum przygotowuj¹ce pakiet instalacyjny
programu.
- W utworzonym folderze BorlandDelphiPersonalInstaller uruchamiamy
w³aciwy instalator install.exe . Teraz konieczne bêdzie wprowadzenie
otrzymanych kodów rejestracyjnych. Wybieramy te¿ docelowy folder
oraz typ instalacji - na ogó³ wystarczy pozostawiæ ustawienia domylne
( Program Files\Borland\Delphi6 , instalacja typowa).
- Po zakoñczeniu instalacji konieczny jest restart systemu dla wprowa-
dzenia wszystkich nowych ustawieñ.
- Dla uruchomienia Delphi musimy jeszcze zarejestrowaæ zainstalowany
pakiet - odpowiednie okno otwiera siê samoczynnie przy pierwszym
starcie. Mo¿na to wykonaæ on line albo wchodz¹c na stronê http://re-
gister.borland.com i wype³niaj¹c formularz dotychczasowymi danymi re-
jestracyjnymi (okienko Delphi podaje nam dodatkowo kod rejestracyjny)
- otrzymamy wtedy e-mailem dodatkowy kod aktywacyjny - jego wpro-
wadzenie ostatecznie koñczy instalacjê.
- Teraz uruchamiamy rodowisko Delphi i wstêpnie sprawdzamy, czy
wszystko dzia³a prawid³owo, np. próbnie kompiluj¹c najprostszy pro-
jekt z pustym oknem.
- Pozostaje nam jeszcze instalacja ³aty z poprawkami - pobieramy ze stro-
ny Borlanda ( http://www.borland.com/ ) lub BSC ( http://www.bsc.com.pl )
ostatni¹ wersjê (numer 2 - D6_upd2_std.exe ) i uruchamiamy - koniecz-
nie przy wy³¹czonym Delphi. Ponownie musimy wprowadziæ dane re-
jestracyjne. Dodatkowo kopiujemy do folderu Help poprawki z pliku
d62per.zip .
Teraz rodowisko jest gotowe do u¿ywania. Nie zamierzam tutaj oczy-
wicie prezentowaæ tutoriala Delphi dla pocz¹tkuj¹cych - iloæ informacji
na ten temat jest ogromna i ka¿dy mo¿e w sieci lub w ksiêgarni wybraæ
co najbardziej odpowiedniego dla w³asnych potrzeb.
http://synedit.sourceforge.net , w ze-
stawie z demonstracyjnymi przyk³ada-
mi wykorzystania. ci¹gniêty plik ZIP
rozpakowujemy do folderu przeznaczo-
nego na komponenty (np. \Delp-
hi6\Komponenty\SynEdit1_1 ). Aktual-
nie dostêpna wersja 1.1 posiada ju¿
pakiet przewidziany specjalnie dla
D6PE i nie musimy wprowadzaæ ¿ad-
nych poprawek (poprzednio koniecz-
nych ze wzglêdu na brak w PE kom-
ponentów bazodanowych).
W Delphi zamykamy wszystkie pro-
jekty i otwieramy ( File>Open ) plik pa-
kietu SynEdit_D6_PE.dpk . W opcjach
musimy podaæ cie¿kê wyszukiwania,
wskazuj¹c¹ na folder SynEdit1_1\Sour-
ce , a nastêpnie kompilujemy plik ród-
³owy i instalujemy komponenty.
TSynEdit dysponuje wszystkimi po-
trzebnymi mo¿liwociami, jego istotn¹
wad¹ jest jednak brak opisów i pomo-
cy - dla zapoznania siê z w³aciwo-
ciami i metodami trzeba siêgaæ do ko-
du ród³owego.
Nastêpn¹ wa¿n¹ spraw¹ jest prze-
strzeganie warunków licencji MPL/
GPL, ale w przypadku naszego ot-
wartego programu nie grozi ich na-
ruszenie.
TSynEdit wspó³pracuje z seri¹ kom-
ponentów kolorowania sk³adni ( syntax
highlighters ), opracowanych dla popu-
larnych jêzyków programowania ( rys.
2 ). Poniewa¿ C dla mikrokontrolera ma
w³asn¹ specyfikê, nie wybieramy ¿ad-
nego dedykowanego highlightera, ale
uniwersalny TSynGeneralSyn , który
pozwala na wprowadzanie dowolnej
listy s³ów kluczowych. Dotyczy to tak-
¿e asemblera. Du¿o bardziej eleganc-
kim rozwi¹zaniem by³oby oczywicie
dopisanie highlighterów specjalnie dla
C i asm AVR, ale na razie pozostawia-
my to na przysz³oæ.
wo programistyczne, jak kolorowanie
elementów jêzyka (np. s³ów kluczo-
wych) czy ustawianie zak³adek ( book-
marków ) dla ³atwej lokalizacji wybra-
nych, istotnych w danej chwili frag-
mentów.
2. £atwe zarz¹dzanie plikami. Musi-
my mieæ mo¿liwoæ tworzenia projek-
tów (czyli zespo³ów plików potrzeb-
nych do utworzenia kodu wykonywal-
nego) i ich ³atwej modyfikacji oraz za-
pisywania i odtwarzania. To samo do-
tyczy tak¿e poszczególnych plików
projektu.
3. Uruchamianie dla plików zawar-
tych w projekcie w³aciwego silnika
wykonawczego, czyli AVR-GCC.
4. £atwe wprowadzanie potrzebnych
opcji i parametrów (które w trybie tek-
stowym rêcznie wpisujemy do pliku
makefile) .
5. Przechwycenie i dogodne wy-
wietlenie oraz interpretacja wyników
dzia³ania kompilatora, z mo¿liwoci¹
automatycznego zlokalizowania stwier-
dzonych b³êdów w tekcie kodu ród-
³owego.
6. Mo¿liwoæ obs³ugi sprzêtowego
programatora, który za³aduje uzyskany
plik wykonywalny do pamiêci Flash
uruchamianego mikrokontrolera ( rys. 1 ).
Powy¿sze wystarczy do przeprowa-
dzenia pierwszych testów i oceny sku-
tecznoci i ³atwoci obs³ugi naszego
IDE. Potem przyjdzie czas na dalsze
udoskonalanie, ale na razie zrealizuj-
my za³o¿enia podstawowe.
Pakiet AVR-GCC i struktura
katalogów
Na stronie http://www.avrfreaks. net
jest dostêpny gotowy instalator AVR-
GCC dla platformy Windows. Po zain-
stalowaniu kompilatora dobrze jest
sprawdziæ jego dzia³anie w trybie tek-
stowym, pos³uguj¹c siê za³¹czonymi
przyk³adami. Nastêpnie w g³ównym
folderze kompilatora c:/avrgcc tworzy-
my podkatalogi [ ide ] oraz [ proj ] prze-
znaczone na plik wykonywalny nasze-
go projektu Delphi oraz na foldery po-
szczególnych projektów AVR.
Po otwarciu w Delphi nowej aplika-
cji ustawiamy w opcjach folder pliku
wynikowego exe na c:/avrgcc/ide . Po-
niewa¿ dla uproszczenia bêdziemy siê
pos³ugiwaæ w programie cile okrelo-
n¹ struktur¹ katalogów, testowe uru-
chomienia bêd¹ wymaga³y startu w³a-
Edytor tekstowy
Jako edytor zostanie wykorzystany
znakomity, bezp³atny komponent TSy-
nEdit . Jest on dostêpny pod adresem
64
Elektronika Praktyczna 1/2003
32565397.014.png
P R O G R A M Y
Rys. 2. Sk³adnia wywietlanego tekstu jest auto-
matycznie kolorowana, co znakomicie upra-
szcza analizê programów
Na potrzeby edycji tworzy-
my tylko jeden obiekt klasy
TSynEdit . Prze³¹czanie po-
miêdzy plikami polega na
ich otwieraniu w tym samym
obiekcie. Alternatywnym roz-
wi¹zaniem by³oby utworzenie
oddzielnego obiektu SynEdit
dla ka¿dego pliku - jest to
jednak zbêdne (i b³êdne) sza-
fowanie zasobami systemu.
Jedynym argumentem za
mog³aby byæ wiêksza szyb-
koæ prze³¹czania. Jednak
przy parametrach wspó³czes-
nych dysków twardych opó-
nienia s¹ praktycznie nieza-
uwa¿alne (mo¿na dodatkowo
wprowadziæ buforowanie pli-
ków w pamiêci, ale po pier-
wszych próbach stwierdzi³em, ¿e to te¿
nie jest konieczne).
Najwa¿niejsze bie¿¹ce informacje
o dzia³aniu programu poka¿emy w tra-
dycyjny sposób - na belce statusu. Do-
k³adamy wiêc do naszego interfejsu
komponent TStatusBar .
Potrzebne te¿ bêdzie sterowanie fun-
kcjami programu. Do wyboru mamy
tradycyjne menu, skróty klawiszowe,
paski narzêdziowe z przyciskami. Po-
niewa¿ przy tworzeniu kodu dla mik-
rokontrolera pos³ugujemy siê g³ównie
klawiatur¹, stara³em siê maksymalnie
wyeliminowaæ u¿ycie myszy. Jest to
wybór subiektywny, jednak¿e zgrupo-
wanie wszystkich komend w kompo-
nencie TActionList pozwala na bardzo
proste rozszerzenie zestawu kontrolek
steruj¹cych, zgodnie z w³asnymi upo-
dobaniami.
Struktura i przechowywanie
informacji o projektach
C-AVR
Na projekt w C sk³adaj¹ siê:
- poszczególne pliki kodu ród³owego
( *.c , *.s ),
nie z tego docelowego folderu. Po za-
pisaniu nowego projektu Delphi,
wszystko jest gotowe do rozpoczêcia
w³aciwego programowania.
Zaczynamy od pomys³u na
interfejs ekranowy
To jest wybór w znacznej mierze su-
biektywny. Dwie podstawowe mo¿li-
woci to SDI albo MDI ( single lub mul-
ti document interface ). MDI w ramach
g³ównego okna - ramki pozwala na ot-
warcie wielu potomnych okienek oraz
upraszcza zarz¹dzanie nimi (ustawia
obok, w kaskadzie, udostêpnia wykaz
itd.). Wiêkszoæ profesjonalnych IDE
opiera siê w³anie na modelu MDI,
przydatnym zw³aszcza podczas debugo-
wania. W naszym - pozbawionym debu-
gera - programie nie zachodzi koniecz-
noæ otwierania du¿ej liczby pomocni-
czych okienek. Dlatego mo¿emy pozo-
stawiæ jak najwiêcej miejsca dla obsza-
ru edycji kodu. W takim przypadku ca³-
kowicie wystarczy model SDI. Istotne
informacje przedstawiane zazwyczaj
w dodatkowych oknach spróbujemy
udostêpniaæ w inny sposób.
Do nawigacji w obrêbie projektu C
wybra³em gotowy komponent TTab-
Control . Ka¿da zak³adka ( Tabs ) odpo-
wiada jednemu plikowi projektu. Dy-
namiczne dodawanie i usuwanie zak³a-
dek odpowiada dodawaniu i usuwaniu
plików z projektu. W ten sposób na
ekranie mamy zawsze ca³¹ zawartoæ
projektu i mo¿emy szybko prze³¹czaæ
siê pomiêdzy plikami (w taki sam spo-
sób jest zorganizowany edytor w Del-
phi). Nie ma specjalnych ograniczeñ
liczby zak³adek, ale liczba plików
w przeciêtnym projekcie dla mikrokon-
trolera nie jest nigdy zbyt du¿a. Ze
wzglêdu na znaczne uproszczenie pro-
gramu, przyj¹³em ograniczon¹ do 32
liczbê plików - w praktyce nigdy nie
powinno to byæ za ma³o.
Rys. 3. Przebieg kompilacji w AVR-GCC
66
Elektronika Praktyczna 1/2003
32565397.015.png 32565397.001.png 32565397.002.png 32565397.003.png 32565397.004.png 32565397.005.png 32565397.006.png 32565397.007.png
P R O G R A M Y
cz¹tek uwzglêdnimy tylko najbardziej
potrzebne - póniej bêdzie mo¿na listê
dowolnie rozszerzaæ.
Okno konfiguracji oraz wszystkie ty-
py jej dotycz¹ce zebrane s¹ w module
u_options . U¿ycie w dialogu kompo-
nentu TPageControl zapewnia niezbêd-
n¹ elastycznoæ w póniejszym doda-
waniu opcji.
oraz ustawionych opcji - formatuje li-
nie komend wykorzystywane póniej
bezporednio do uruchamiania narzê-
dzi pakietu AVR-GCC (linie komend s¹
lokowane w zmiennych globalnych
GccCommand GccParams , aby by³y
widziane przez potomne w¹tki proce-
su g³ównego). Po przygotowaniu ko-
mend powo³ywany jest dodatkowy w¹-
tek CompThread , w którym uruchamia-
my wybrane narzêdzie AVR-GCC, cze-
kamy na zakoñczenie jego pracy
i przechwytujemy komunikat wyjcio-
wy, lokuj¹c go w zmiennej globalnej
Gccoutput .
W¹tek koñcz¹c swój ¿ywot, wyko-
nuje zdarzenie OnTerminate , któremu
przypisalimy metodê EndCompilation
okna g³ównego. W metodzie tej jest
najpierw analizowany, za pomoc¹ fun-
kcji ParseErrors , komunikat otrzymany
z AVR-GCC i wykrywane s¹ b³êdy i os-
trze¿enia. Funkcja ta jest cokolwiek za-
wik³ana, gdy¿ musi zidentyfikowaæ
b³êdy w ró¿nie sformatowanych odpo-
wiedziach poszczególnych narzêdzi.
Prawdopodobnie w trakcie u¿ywania
wyjd¹ na jaw jakie jej braki i bêdzie
podlegaæ modyfikacjom. Nastêpnie En-
dCompilation , na podstawie rezultatu
ParseErrors oraz danych dotycz¹cych
bie¿¹cej operacji, decyduje co robiæ
dalej:
- przerwaæ bezwarunkowo kolejkê ope-
racji z informacj¹ o wyst¹pieniu b³ê-
du fatalnego AVR-GCC ( fatal error -
b³¹d, który powoduje ca³kowicie nie-
prawid³ow¹ realizacjê operacji),
- dopisaæ do wykazu b³êdów ostrze¿e-
nia AVR-GCC ( warning - informuje
o nieprawid³owociach, które na ogó³
nie wp³ywaj¹ na poprawnoæ wyko-
nania, ale mog¹ jednak staæ siê przy-
czyn¹ nieprzewidzianych k³opotów)
i warunkowo przerwaæ albo kontynu-
owaæ kolejkê,
- bez ¿adnych zastrze¿eñ kontynuowaæ
kolejkê a¿ do realizacji ostatniej po-
zycji listy operacji.
Kontynuacja kolejki polega na
zwiêkszeniu indeksu listy operacji
i ponownym wywo³aniu StartGcc . Nie
jest to jednak realizowane bezpored-
nio w  EndCompilation , ale poprzez
wys³anie do w³asnego okna komunika-
tu funkcj¹ PostMessage . Komunikat ten
trafia na listê komunikatów okna, jest
pobrany i zrealizowany (poprzez meto-
wmContinueCompilation ) z pewnym
opónieniem pozwalaj¹cym na prawid-
³owe zwolnienie obiektu koñcz¹cego
siê w¹tku przed utworzeniem i urucho-
mieniem nastêpnego.
Zauwa¿my, ¿e kompilacjê/asemblacjê
przeprowadzamy w oddzielnej operacji
osobno dla ka¿dego pliku. Wprawdzie
AVR-GCC mo¿e przyj¹æ do jednoczes-
Rys. 4. Okno konfiguracji projektu
Jak to ma dzia³aæ?
Przebieg pracy kompilatora AVR-
GCC mo¿emy przeledziæ, analizuj¹c
komunikaty programu make wywo³y-
wanego bezporednio z konsoli albo
z poziomu AVR Studio wersja 3.5
(wersja 4 nie wspó³pracuje - przynaj-
mniej na razie - z zewnêtrznym kom-
pilatorem C). Zauwa¿ymy nastêpuj¹ce
etapy:
- kompilacja i asemblacja plików ród-
³owych *.c do plików relokowalnych
*.o ,
- asemblacja plików ród³owych *.s do
plików relokowalnych *.o ,
- linkowanie plików relokowalnych do
formatu wyjciowego *.elf z utworze-
niem pliku informacyjnego *.map ,
- tworzenie na podstawie *.elf plików
wynikowych *.obj oraz plików wy-
nikowych kodu: *.hex (kod) i  *.eep
(zawartoæ wewnêtrznej EEPROM),
- konwersja formatu *.elf do *.cof
*.sym u¿ywanych przez debuger
AVR Studio.
To samo chcemy zrealizowaæ za
pomoc¹ naszego programu i jednocze-
nie mieæ mo¿liwoæ ustawiania z po-
ziomu rodowiska graficznego potrzeb-
nych parametrów oraz przechwytywa-
nia i odpowiedniej obs³ugi komunika-
tów o b³êdach. Algorytm postêpowania
jest przedstawiony na rys. 3 .
Kompilacjê rozpoczynaj¹ zdarzenia
OnExecute akcji zwi¹zanych z polece-
niami make (dla plików zmienionych)
lub build (dla wszystkich plików).
Ka¿dorazowo - w zale¿noci od zesta-
wu plików ród³owych oraz wybra-
nych opcji kompilacji ( rys. 4 ) - jest
tworzona lista operacji, które nale¿y
kolejno wykonaæ dla uzyskania po-
trzebnych efektów. Wszystkie niezbêd-
ne do tego zmienne i metody zawarte
s¹ w obiekcie TCompOperationList .
Ustawiamy te¿ flagê Gccbusy , która
informuje wszelkie inne procedury, ¿e
trwa kompilacja. Lista operacji zostaje
dodatkowo przekazana do metody Pre-
pareCompileList okna wizualizacji po-
stêpu kompilacji (modu³ u_multi-
comp ).
Nastêpnie wywo³ywana jest metoda
StartGcc . StartGcc najpierw wywo³uje
metodê UpdateGccParams , która -
w zale¿noci od opisu operacji (zawar-
tego w aktualnej pozycji listy operacji)
- pliki nag³ówkowe ( *.h ),
- zestaw wybranych opcji kompilatora
i linkera (np. informacja o typie mik-
rokontrolera, poziomie optymalizacji,
formatach wynikowych, zakresie ra-
portowania ostrze¿eñ itd.),
- informacje pomocnicze (np. ustawie-
nia edytora, zak³adki w tekcie).
Przyj¹³em nastêpuj¹ce rozwi¹zanie:
- W folderze [ avrgcc\proj ] s¹ umiesz-
czone podkatalogi projektów - od-
dzielny folder na ka¿dy projekt.
- W folderze projektu umieszczamy
wszystkie jego pliki oraz plik konfi-
guracyjny. cfg zawieraj¹cy informacje
o projekcie. Na podstawie tego pliku
oprogramowanie bêdzie umia³o za³a-
dowaæ projekt w takiej postaci, w ja-
kiej zosta³ zapisany.
- W folderze [ avrgcc\proj ] umiecimy
te¿ generowany automatycznie plik
lastwork.cfg , zapisuj¹cy dane projek-
tu w chwili zamykania programu.
Pos³u¿y on do odtworzenia robocze-
go projektu przy ponownym urucho-
mieniu.
Plik. cfg jest jednym du¿ym rekor-
dem zawieraj¹cym wszystkie potrzeb-
ne informacje. Poniewa¿ trzeba siê li-
czyæ z mo¿liwoci¹ póniejszego roz-
szerzenia zestawu opcji - przewidzimy
spory zapas pól rezerwowych. Nie jest
to ani jedyne, ani najbardziej elegan-
ckie rozwi¹zanie, niemniej w naszym
przypadku bêdzie w zupe³noci wy-
starczaj¹ce. Odwzorowaniem tego re-
kordu jest w programie zmienna Pro-
jectInfo .
Do zapisywania i otwierania projek-
tów pos³u¿¹ standardowe dialogi TO-
penFile TSaveFile . Mog³yby one zo-
staæ u¿yte równie¿ dla potrzeb po-
szczególnych plików projektu, jednak
ze wzglêdu na wystêpuj¹c¹ wtedy ko-
niecznoæ ci¹g³ego przestawiania kon-
figuracji dialogów zastosowa³em dla
plików oddzielny zestaw tych samych
komponentów.
Oczywicie musimy siê te¿ wyposa-
¿yæ w narzêdzie do wyboru wszelkich
potrzebnych opcji - pos³u¿¹ do tego
celu oddzielne okna dialogowe z zesta-
wami odpowiednich kontrolek. Na po-
68
Elektronika Praktyczna 1/2003
32565397.008.png 32565397.009.png
P R O G R A M Y
nej obróbki listê plików, ale rozdzie-
lenie na cz¹stkowe procesy pozwala
na wiêksz¹ elastycznoæ - zw³aszcza
w zakresie analizy b³êdów i wizualiza-
cji postêpu kompilacji, nie wp³ywaj¹c
zarazem w zauwa¿alny sposób na szyb-
koæ.
Dodatkowo rodowisko jest wyposa-
¿one w mo¿liwoæ uruchomienia poje-
dynczej operacji kompilowa-
nia wybranego pliku ród³o-
wego. Jest to bardzo pomoc-
ne przy lokalizacji b³êdów
sk³adniowych - zw³aszcza
w pierwszym etapie pisania
nowego programu C. Do syg-
nalizacji przebiegu kompilacji
s³u¿y dodatkowe okienko za-
warte w module u_process .
leObject (jest to funkcja synchronicz-
na, która zatrzymuje w¹tek na czas
swego dzia³ania - to wyjania zna-
czenie pierwszego akapitu). Nastêp-
nie przepisuje komunikat wyjciowy
kompilatora z wyjcia rurki do
zmiennej globalnej GccOutput za po-
moc¹ funkcji PeekNamedPipe oraz
ReadFile .
niach opcji zatrzymywania kolejki
operacji). Do wywietlenia w razie
potrzeby tych list s³u¿y oddzielne
okno z modu³u u_errwindow . Wybra-
³em rozwi¹zanie z oknem niezale¿-
nym - mo¿emy je przesuwaæ w do-
wolne miejsce, równie¿ poza g³ówne
okno programu. Poza funkcj¹ infor-
macyjn¹ okno to umo¿liwia wskaza-
nie lokalizacji b³êdu w ko-
dzie ród³owym. S³u¿¹ do
tego powi¹zane ze sob¹ me-
tody ShowErrorLine okna
listy b³êdów i okna g³ówne-
go. Do lokalizacji wykorzys-
tujemy fakt, ¿e w liniach
opisu wystêpuje nazwa mo-
du³u i numer linii. Na pod-
stawie nazwy modu³u funk-
cja ShowTabByName prze³¹-
cza edytor na odpowiedni¹
zak³adkê. Nastêpnie zostaje pod-
wietlona i pokazana w edytorze li-
nia o ¿¹danym numerze.
Powy¿szy opis jest oczywicie jedy-
nie orientacyjny - wszelkie szczegó³y
znajdziemy w kodzie ród³owym, któ-
ry zawiera tak¿e wiele funkcji pomoc-
niczych. Stara³em siê je jednak dosyæ
obszernie opisywaæ, co powinno
znacznie u³atwiæ analizê ich przezna-
czenia i dzia³ania.
Dziêki inicjatywie i pracy Jerzego Szczesiula
powsta³o pierwsze polskie rodowisko
integruj¹ce kompilator AVR-GCC z programem
AVR Studio. Powinno byæ ono nadal
rozwijane, w zwi¹zku z czym zachêcamy
naszych Czytelników do podjêcia wyzwania:
mamy szansê daæ co ca³emu elektroniczne-
mu wiatu.
Uruchamianie
programów AVR-GCC
Jak wspomniano wy¿ej, do urucha-
miania narzêdzi AVR-GCC jest powo-
³ywany oddzielny w¹tek. Pozwala to
na zachowanie interakcji z oknem
g³ównym podczas oczekiwania na za-
koñczenie procesów potomnych. W na-
szym przypadku akurat nie ma to
wielkiego znaczenia (i tak nic nie ro-
bimy w programie podczas kompilacji,
a przy tym nie trwa ona zbyt d³ugo),
ale zastosowa³em to rozwi¹zanie jako
typowe dla takich zadañ.
Do uruchomienia AVR-GCC jest
u¿yta funkcja CreateProcess z lini¹
komend pobran¹ ze zmiennych glo-
balnych GccCommand GccParams .
Jednak najpierw musimy przeprowa-
dziæ pewne przygotowania (modu³
u_thread ):
- Uruchamiamy kana³, przez który
konsolowy program AVR-GCC prze-
le do naszej aplikacji komunikat
o wyniku swego dzia³ania. S³u¿y do
tego rurka ( pipe ). Tworzymy j¹ fun-
kcj¹ CreatePipe , uzyskuj¹c w wyniku
uchwyty wejcia i wyjcia rurki.
Przedtem musimy pamiêtaæ, aby
w atrybutach bezpieczeñstwa ( Securi-
ty Attributes ) powstaj¹cej rurki usta-
wiæ flagê bInheritHandle , co pozwo-
li na korzystanie z uchwytów rurki
przez proces potomny.
- Nastêpnie ustawiamy dodatkowe pa-
rametry startowe dla uruchamianego
procesu:
- standardowe wyjcie komunikatów
oraz b³êdów przypisujemy do
uchwytu wejcia rurki,
- ¿¹damy ukrycia konsoli procesu,
- odmaskowujemy wymagane usta-
wienia we flagach.
Teraz dopiero uruchamiamy pro-
ces. W¹tek czeka na jego zakoñcze-
nie za pomoc¹ funkcji WaitForSing-
Na tym koñczy siê funkcja Execute
w¹tku i zostaje wykonane zdarzenie
OnTerminate obiektu CompThread .
Jest on nastêpnie automatycznie lik-
widowany, gdy¿ przy tworzeniu usta-
wilimy atrybut FreeOnTerminate -
program nie musi ju¿ tym siê zajmo-
waæ.
Co robimy z komunikatem
kompilatora?
Jak wspomniano, na ka¿dym etapie
kompilacji komunikat GccOutput jest
analizowany w funkcji ParseErrors
pod k¹tem wystêpowania b³êdów
i ostrze¿eñ. Zidentyfikowane opisy
b³êdów i ostrze¿eñ s¹ lokowane
w listach b³êdów LocalErrorList
GlobalErrorList (wykorzystywanych
zamiennie przy ró¿nych ustawie-
Wspó³praca naszego
programu z AVR Studio 4
Po uruchomieniu AVR Studio ot-
wieramy w nim utworzony w podkata-
logu [ coff ] plik *.cof . Ustawiamy jako
platformê AVR Simulator i wybieramy
procesor z listy. Studio otwiera g³ów-
ny plik projektu i przechodzi w tryb
Rys. 5. Zrzut ekranowy zestawu AVR-GCC IDE+AVR Studio 4. Przy odpowied-
nim rozmieszczeniu okien wygl¹da to prawie jak jednolite rodowisko
70
Elektronika Praktyczna 1/2003
32565397.010.png 32565397.011.png
Zgłoś jeśli naruszono regulamin