77_80.PDF

(201 KB) Pobierz
AVR-GCC - środowisko programistyczne dla mikrokontrolerów AVR
P R O G R A M Y
Środowisko programistyczne
dla mikrokontrolerów AVR
Wracamy do tematu úrodowiska
AVR Studio z†bezp³atnym
kompilatorem C†dla
mikrokontrolerÛw AVR - GCC-
AVR. W†artykule przedstawimy
instalacjÍ i†konfiguracjÍ tego
oprogramowania do pisania,
kompilacji i†uruchamiania
programÛw w†C†pod system
Windows.
Z†pewnoúci¹ wiÍkszoúÊ elektroni-
kÛw zauwaøy³a, øe ostatnio nasta³a
moda na stosowanie mikrokontrole-
rÛw jednouk³adowych nawet w†bar-
dzo prostych uk³adach. SzczegÛlnym
zainteresowaniem cieszy siÍ rodzina
AVR firmy Atmel. S¹ to doúÊ nowo-
czesne, szybkie i†bogato wyposaøone
mikrokontrolery. Aby u³atwiÊ uøyt-
kownikowi uruchamianie uk³adÛw,
producent wprowadzi³ moøliwoúÊ
programowania uk³adÛw juø po za-
montowaniu w†systemie docelowym.
Bardzo interesuj¹ce cechy tych mik-
rokontrolerÛw s¹ zwi¹zane z†ich ar-
chitektur¹ i†list¹ rozkazÛw stworzon¹
z†myúl¹ o†stosowaniu kompilatorÛw
jÍzyka C.
Nie chcÍ w†tym miejscu wywo³ywaÊ
polemiki miÍdzy osobami uznaj¹cymi
za jedynie ìs³usznyî jÍzyk asembler
i†ich przeciwnikami. Jak zwykle praw-
da leøy poúrodku. Asembler pozwala
úciúle kontrolowaÊ zasoby i†przebieg
programu, a†jÍzyki wysokiego poziomu
- skrÛciÊ czas przygotowywania pro-
gramu, ktÛry jednoczeúnie moøe byÊ
bardziej czytelny.
Atmel udostÍpnia nieodp³atnie zin-
tegrowane úrodowisko programistycz-
ne dla AVR-Ûw - oprogramowanie
AVR Studio. Posiada ono edytor
(z†rozpoznawaniem sk³adni), asemb-
ler, symulator umoøliwiaj¹cy úledze-
nie wykonywania programÛw z†pod-
gl¹dem wszystkich wbudowanych
w†mikrokontroler uk³adÛw. Da siÍ
rÛwnieø tworzyÊ, kompilowaÊ i†uru-
chamiaÊ programy napisane w†jÍzyku
C. Ta ostatnia cecha daje duøe moø-
liwoúci, ale rÛwnieø sprawia najwiÍ-
cej k³opotÛw w†poprawnym skonfigu-
rowaniu úrodowiska i†dopasowaniu
do niego kompilatora.
Dobrym uzupe³nieniem dla AVR
Studio jest bezp³atny kompilator jÍzy-
ka C†- AVR-GCC. Pierwotnie powsta³
on z†myúl¹ o†systemach typu Unix,
ale po pewnym czasie przeniesiono
go rÛwnieø na platformÍ Windows.
GCC to skrÛt od GNU Compiler
Collection , a†GNU to skrÛt od GNU's
Not Unix . WiÍcej informacji o†GCC
i†projekcie GNU moøna znaleüÊ na
stronie g³Ûwnej GCC ( http://
gcc.gnu.org/ ).
AVR Studio rÛwnieø instaluje siÍ
bardzo ³atwo, przy czym domyúlnym
katalogiem jest c:\Program Files\At-
mel\AVR Studio . W†podkatalogu ap-
pnotes znajduj¹ siÍ przyk³adowe pro-
gramy napisane w†asemblerze i†pliki
definicyjne ( .inc ).
Konfiguracja i†tworzenie
projektu
Opis konfiguracji przedstawiÍ na
przyk³adzie krÛtkiego programu. Po
uruchomieniu AVR Studio, z†menu
Project wybieramy polecenie New... .
Pojawi siÍ okno Select new project
( rys. 1 ). W†polu Project name wpisu-
jemy nazwÍ projektu led . Pole Loca-
tion okreúla úcieøkÍ dostÍpu do tego
projektu, przyjmijmy, øe bÍdzie to ka-
talog c:\avr\pierwszy . Na koniec
waøne jest, aby podúwietliÊ w†polu
Project type pozycjÍ Generic 3rd Par-
ty C Compiler .
Podczas klikniÍcia prawym klawi-
szem myszy w†oknie projektu otwie-
ra siÍ menu podrÍczne, z†ktÛrego
wybieramy Create New File... ( rys.
2 ). W†wywo³anym oknie wpisujemy
nazwÍ tworzonego pliku - led.c
i†úcieøkÍ dostÍpu do katalogu,
w†ktÛrym utworzyliúmy projekt. Aby
zachowaÊ porz¹dek, przeci¹gamy
w†oknie projektu ikonÍ z†nazw¹ no-
wego pliku do folderu Source Files .
W†otwartym oknie zatytu³owanym
led.c wpisujemy krÛtki program
w†jÍzyku C ( list. 1 ).
Spowoduje on, øe mikrokontroler
bÍdzie wystawia³ na wyjúciach portu
B na zmianÍ poziomy wysokie i†nis-
kie. Waøna uwaga: ostatnia linia kaø-
dego pliku przetwarzanego przez
kompilator powinna byÊ zakoÒczona
znakiem koÒca linii!
Instalacja kompilatora
Przed instalacj¹ naleøy zaopatrzyÊ
siÍ w†pakiet instalacyjny AVR-GCC
w†wersji 3.2 (opatrzonej dat¹ 2002-06-
25) dostÍpny w postaci jednego pliku
do úci¹gniÍcia ze strony AVR Freaks
( http://www.avrfreaks.net ) i†AVR Stu-
dio (aktualnie wersja 3.55) udostÍp-
nione przez Atmela na stronie inter-
netowej firmy.
Instalacja AVR-GCC sprowadza siÍ
do uruchomienia instalatora i†postÍ-
powania wed³ug wskazÛwek. Naleøy
pozwoliÊ programowi instalacyjnemu
za³oøyÊ domyúlny katalog. Podczas
instalacji nie powinny siÍ pojawiÊ
øadne b³Ídy. Na koniec zostaniemy
poinformowani o†poprawnym zakoÒ-
czeniu instalacji.
Utworzony zostaje katalog c:\avr-
gcc , a†w†nim kilka podkatalogÛw.
Najwaøniejsze z†nich to:
- avr\include - zawieraj¹cy pliki na-
g³Ûwkowe (.h),
- avrfreaks z†plikiem avr_make (glo-
balna czÍúÊ makefile ), makefile (dla
projektu) oraz plikiem wsadowym
uruchamiaj¹cym kompilacjÍ
gcc_cmp.bat ,
- bin - w†ktÛrym s¹ zawarte progra-
my wykonywalne pakietu.
Rys. 1
Elektronika Praktyczna 12/2002
77
32284508.009.png 32284508.010.png
P R O G R A M Y
Rys. 2
Rys. 3
Maj¹c juø gotowy program, musimy
go skompilowaÊ przy uøyciu AVR-GCC.
Pakiet kompilatora po naszej instalacji
jest juø w†zasadzie przygotowany. Trze-
ba jedynie utworzyÊ plik makefile
w†katalogu projektu. Jest to plik teks-
towy okreúlaj¹cy przebieg przetwarza-
nia, kompilacji i†konsolidacji. Dla u³at-
wienia, w†pakiecie przygotowanym
przez AVR Freaks plik ten zawiera pa-
rametry konfiguracyjne, ktÛre naleøy
zmodyfikowaÊ dla konkretnego projek-
tu. W†koÒcowych liniach sterowanie
jest przekazywane plikowi avr_make
znajduj¹cemu siÍ w†katalogu c:\avr-
gcc\avrfreaks , ktÛry zawiera wspÛlne
dla wszystkich projektÛw polecenia
i†nie jest potrzebna jego modyfikacja.
Przyk³adowy plik makefile znajdzie-
my w†wyøej wymienionym katalogu.
Naleøy go skopiowaÊ do katalogu
z†projektem - w†naszym przypadku
do c:\avr\pierwszy . Na list. 2 przed-
stawiam go w wersji w†jÍzyku
polskim, przystosowanej do prezento-
wanego przyk³adu.
Najproúciej jest go modyfikowaÊ po-
przez dodanie do projektu w†AVR
Studio. W†tym celu klikamy prawym
klawiszem w†oknie projektu, z†menu
wybieramy Add File ( rys. 3 ) i†otwie-
ramy plik makefile . Przeci¹gnijmy go
myszk¹ do folderu Other Files . Naj-
waøniejsze parametry, jakie musimy
przede wszystkim okreúliÊ to:
- MCU, czyli typ mikrokontrolera,
- TRG - nazwa pliku wynikowego,
przy czym musi to byÊ ta sama na-
zwa jak nazwa projektu i†programu
g³Ûwnego,
- SRC - lista plikÛw ürÛd³owych do
kompilacji,
- zaleønoúci obiektÛw wynikowych
od innych plikÛw (tutaj led.o jest
zaleøny od led.c )
Zapis $(TRG) oznacza wywo³anie
zmiennej (makra) okreúlonej wczeú-
niej poprzez przyporz¹dkowanie
TRG= .
Teraz trzeba poinstruowaÊ AVR
Studio, jak ma wspÛ³pracowaÊ z†kom-
pilatorem GCC.
Upewnijmy siÍ, øe w†oknie projek-
tu jest wybrana zak³adka Target-De-
bug . Wskazuj¹c myszk¹ na rdzeÒ
drzewa Target-Debug , klikamy pra-
wym klawiszem i†z†menu wybieramy
pozycjÍ Settings... Pojawi siÍ okno,
ktÛre naleøy wype³niÊ tak, jak to po-
kazano na rys. 4 . Ustawienia te po-
woduj¹ podjÍcie odpowiednich akcji
przy kompilowaniu i†debuggowaniu
programu. AVR Studio uruchamia
program wsadowy ( gcc_cmp.bat ) prze-
prowadzaj¹cy kompilacjÍ, a†nastÍpnie,
jeúli nie zasygnalizowano øadnych
b³ÍdÛw, ³aduje plik debuggera o†na-
zwie takiej, jak nazwa projektu z†roz-
szerzeniem . cof .
Przy okazji warto utworzyÊ dodat-
kow¹ zak³adkÍ Clean , ktÛra bÍdzie
s³uøy³a do usuwania plikÛw tworzo-
nych przez kompilator. W†tym celu
klikamy prawym klawiszem na oknie
projektu i†wybieramy Targets>Add .
W†polu Name wpisujemy Clean , a†po-
niøej wybieramy Copy settings
from>Debug . Wybieramy zak³adkÍ
Target-Clean i†podobnie jak wyøej
modyfikujemy ustawienia. Linia pole-
cenia ma mieÊ postaÊ c:\avrgcc\avr-
freaks\gcc_cmp.bat clean , co oznacza,
øe program bÍdzie wywo³ywany z†pa-
rametrem clean . Oba okienka z†grupy
Run Stage Settings pozostawiamy
puste.
W†systemie Windows 2000 trzeba
wywo³ywaÊ program wsadowy z†pod-
katalogu win2000 , czyli c:\avrgcc\av-
rfreaks\win2000\gcc_cmp.bat . Jeúli
w†oknie wyjúciowym AVR Studio po-
jawia siÍ komunikat b³Ídu, informuj¹-
cy o†k³opocie z†odnalezieniem pliku
c:\tmpout.txt , naleøy w†pliku
gcc_cmp.bat podaÊ pe³n¹ úcieøkÍ
dostÍpu do pliku gcc_cmp2.bat ( @start
List. 2.
# Simple Makefile Volker Oth (c) 1999
# edited by AVRfreaks.net nov.2001
# tłumaczenie: Michał Lankosz sierpień 2002
###### zmień poniższe parametry dla swojego projektu ##########
#wpisz typ mikrokontrolera (np. at90s8535, attiny22, atmega128 itd.)
MCU = at90s2313
#wpisz nazwę pliku docelowego (bez rozszerzenia!)
TRG = led
#wpisz nazwy plików źródłowych w C rozdzielając spacją
SRC = $(TRG).c
#wpisz dodatkowe pliki źródłowe w asemblerze
ASRC =
#dodatkowe biblioteki i pliki obiektowe do dołączenia (zlinkowania)
LIB =
#dodatkowe pliki include do kompilacji
INC =
#flagi dla asemblera
ASFLAGS = -Wa, -gstabs
#flagi dla kompilatora
CPFLAGS = -g -O3 -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst)
#flagi dla linkera
LDFLAGS = -Wl,-Map=$(TRG).map,-cref
########### tej linijki nie powinieneś modyfikować #############
include $(AVR)/avrfreaks/avr_make
# zależności
$(TRG).o: $(TRG).c
List. 1.
#include <io.h>
#include <io2313.h>
int main(void)
{
outp(0xff,DDRB);
while(1)
{
outp(0xff,PORTB);
outp(0x00,PORTB);
}
}
78
Elektronika Praktyczna 12/2002
32284508.011.png 32284508.012.png 32284508.001.png
P R O G R A M Y
/MIN /wait cmd /c c:\avrgcc\avr-
freaks\win2000\gcc_cmp2.bat %1 ).
Na tym etapie mamy juø wszystko
ustawione. W†oknie projektu wybiera-
my zak³adkÍ Target-Debug i†naciska-
my klawisz F7 (menu Project>Build ),
aby skompilowaÊ program. Komunika-
ty kompilatora s¹ wyúwietlane w†ok-
nie zatytu³owanym Project Output .
W†katalogu projektu wygenerowany
zostanie miÍdzy innymi plik led.hex .
Jest to gotowy plik w†formacie Intel
Hex, ktÛrym programuje siÍ mikro-
kontroler, na przyk³ad za pomoc¹
programatora YAAP (EP7/2002) lub
Ponyprog ( www.lancos.com ). Ten dru-
gi szczegÛlnie polecam ze wzglÍdu na
duø¹ liczbÍ obs³ugiwanych uk³adÛw.
Ca³y projekt ze wszystkimi zmody-
fikowanymi plikami najproúciej jest
zapisaÊ poleceniem Save All (ikona
z†kilkoma dyskietkami).
dzia³aj¹ pu³apki ( breakpointy ). Doty-
czy to szczegÛlnie bardziej z³oøonych
programÛw. Z†tego wzglÍdu dobrze
jest, w†celu analizy danego fragmen-
tu programu, utworzyÊ pomocniczy
projekt zawieraj¹cy tylko istotne dla
jego dzia³ania instrukcje.
Przeúledzimy teraz skompilowany
program led . Zauwaømy, øe po pier-
wszej kompilacji sta³y siÍ aktywne
niektÛre przyciski na gÛrnej listwie
AVR Studio zawieraj¹cej zestaw po-
leceÒ do sterowania przebiegiem pro-
gramu. Oznacza to, øe zosta³ odnale-
ziony plik dla symulacji led.cof . Au-
tomatycznie rÛwnieø otworzy³o siÍ
okno Simulator Options ( rys. 5 ),
w†ktÛrym moøna wybraÊ typ mikro-
kontrolera i†czÍstotliwoúÊ jego takto-
wania. Opcje te s¹ dostÍpne z†menu
Options>Simulator Options .
SymulacjÍ rozpoczynamy klawiszem
F5 (Run) lub wybieraj¹c ikonÍ 9.
W†oknie z†programem ürÛd³owym po-
jawia siÍ øÛ³ta strza³ka wskazuj¹ca li-
niÍ kodu, ktÛra zostanie wykonana
w†kolejnym kroku. Aby wykonaÊ linij-
kÍ wskazywan¹ strza³k¹, przyciskamy
klawisz F11 ( Trace Into , ikona 11).
To dopiero pocz¹tek moøliwoúci sy-
mulatora. Moøemy bowiem ìzoba-
czyÊî poziom, jaki wystÍpuje na wy-
prowadzeniach portu B. W†tym celu
klikamy na ikonÍ 6 (lub przyciskamy
klawisze Alt+5) i†rozwijamy ga³¹ü
PORTB. Wykonuj¹c kolejne kroki, ob-
serwujemy zawartoúÊ rejestru portu
wyjúciowego ( rys. 6 ).
OtwÛrzmy teraz okno procesora
kombinacj¹ klawiszy Alt+3 (lub iko-
n¹ 4). Znajduj¹ siÍ w nim przynaj-
mniej dwie przydatne funkcje: stoper
i†licznik cykli zegarowych. DziÍki
nim moøemy ³atwo zmierzyÊ czas
wykonania danego fragmentu progra-
mu. W†pÍtli while programu moøna
na przyk³ad zauwaøyÊ, øe na wyjúciu
portu B poziom wy-
soki bÍdzie siÍ utrzy-
mywa³ przez jeden
Rys. 5
cykl zegara, a†niski przez trzy. Nie-
symetria wynika z†budowy pÍtli. Przy
tej okazji warto siÍ rÛwnieø zapoznaÊ
z†moøliwoúci¹ podgl¹du kodu maszy-
nowego úledzonego programu.
Klikaj¹c na ikonce 21 (Ctrl+F11),
otworzymy okno zawieraj¹ce linijki
tekstu w rodzaju:
+0000002C: BA18 OUT 0x18,R1
Powyøsza linia zawiera informacjÍ,
øe pod adresem 2Ch znajduje siÍ in-
strukcja o†kodzie BA18h, ktÛrej odpo-
wiada zapis asemblerowy OUT
0x18,R1.
Uruchomienie pracy krokowej
w†tym trybie powoduje wykonywanie
pojedynczych instrukcji asemblera.
Aby powrÛciÊ do analizy kodu w†C,
ponownie uøywamy ikony 21.
Za pomoc¹ ikony 19 (Shift+F5) ze-
ruje siÍ symulowany mikrokontroler,
czyli doprowadza do jego stanu wyj-
úciowego, jaki jest tuø po ìresecieî
w†rzeczywistym uk³adzie.
Uruchamianie i†debugging
programu
DoúÊ waøne podczas uruchamiania
nowego kodu jest analizowanie dzia-
³ania niektÛrych jego fragmentÛw.
W†szczegÛlnoúci przydatna jest praca
krokowa i†wgl¹d w†zawartoúÊ poszcze-
gÛlnych zmiennych. årodowisko AVR
Studio jest przygotowane do úledzenia
dzia³ania zarÛwno programÛw napisa-
nych w†asemblerze, jak i†w†jÍzyku C.
Konieczne by³o jednak odpowiednie
przystosowanie kompilatora. G³Ûwnym
problemem jest to, øe kompilator GCC
normalnie generuje plik debuggera
w†formacie ELF, ktÛrego nie akceptuje
AVR Studio. Najnowszy pakiet kompi-
latora zawiera juø zewnÍtrzny program
konwersji formatu ELF na COFF ( elf-
cof.exe ), ktÛry jest automatycznie uru-
chamiany wed³ug polecenia zawartego
w†pliku avr_make .
Z†doúwiadczenia wiem, øe konwer-
sja formatÛw jest b³Ídna lub AVR
Studio zawiera b³Ídy. Objawiaj¹ siÍ
one tym, øe nie da siÍ podgl¹daÊ nie-
ktÛrych zmiennych i†czasami nie
Podgl¹d zmiennych
OprÛcz wewnÍtrznych rejestrÛw
i†pamiÍci procesora moøemy rÛwnieø
podgl¹daÊ zmienne uøywane w†pro-
gramie. Dla przyk³adu zmodyfikujmy
nasz program led.c do postaci poka-
zanej na list. 3 .
Musimy jeszcze usun¹Ê niepotrzeb-
ne pliki z†poprzedniej kompilacji,
zmieniaj¹c zak³adkÍ w†projekcie na
Target-Clean i†wciskaj¹c klawisz F7.
Wracamy do Target-Debug , kompilu-
jemy i†uruchamiamy kombinacj¹ kla-
Rys. 4
Rys. 6
Elektronika Praktyczna 12/2002
79
32284508.002.png 32284508.003.png 32284508.004.png 32284508.005.png
P R O G R A M Y
Opis ikon menu AVR Studio
Ikony podglądu ( Views ):
Ikony sterowania programem ( Debug ):
1. Wartości zmiennych
2. Rejestrów
3. Pamięci
4. Istotnych parametrów
pracy procesora
5. Informacji
6. Urządzeń wejścia/wyjścia
7. Dodanie zmiennej do
podglądu
8. Usunięcie zmiennej
z podglądu
9. Uruchomienie symulacji
10. Przerwanie symulacji
11. Krok z wejściem do
funkcji
12. Krok z przeskokiem
funkcji
13. Wyskoczenie z funkcji
14. Uruchomienie i zatrzy−
manie w miejscu kursora
15. Wykonanie n kroków
16. Wykonanie n kroków
17. Ustawienie lub usunięcie
pułapki
18. Usunięcie wszystkich
pułapek
19. Wyzerowanie procesora
Pozostałe
20. Kompilacja
i uruchomienie
programu
21. Przełącznik widoku
źródła
wiszy Ctrl+F7. Klikamy na ikonÍ
7†(okularki) i†podajemy nazwÍ intere-
suj¹cej nas zmiennej, czyli x . Rozpo-
czynamy pracÍ krokow¹. Instrukcja
w†pÍtli while powinna powodowaÊ
przesuwanie o†jeden bit w†lewo bi-
tÛw zmiennej x i†zapisywanie tego
bajtu do rejestru wyjúciowego portu
B. Rzeczywiúcie, widzimy efekt ìwÍ-
øaî na bitach portu, podgl¹daj¹c sta-
ny jego wyjúÊ w†oknie IO. Jednak
zmienna x ma przez ca³y czas war-
toúÊ 0xFF. Taki stan rzeczy spowo-
dowa³ kompilator, ktÛry zoptymalizo-
wa³ kod. Kompilator ìstwierdzi³î, øe
nie ma potrzeby specjalnie czytaÊ
i†zapisywaÊ zmiennej x do pamiÍci
RAM. Wystarczy operowaÊ na jed-
nym z†rejestrÛw, co skrÛci kod i†jed-
noczeúnie przyspieszy dzia³anie pro-
gramu.
Dla celÛw uruchomieniowych moø-
na zmieniÊ parametry kompilacji tak,
aby kod nie by³ optymalizowany. Wy-
starczy w†pliku makefile w†linii za-
czynaj¹cej siÍ od wyrazu CPFLAGS=
zamiast -O3 wpisaÊ -O0. Po usuniÍ-
ciu plikÛw poprzedniej kompilacji,
ponownej kompilacji i†uruchomieniu
pracy krokowej, zmienna x jest juø
obserwowalna. RÛønice moøna do-
strzec, analizuj¹c kod asemblerowy
tego fragmentu programu.
Gdy program jest z³oøony z†kilku
plikÛw ürÛd³owych i†nag³Ûwkowych,
dodajemy ich nazwy do odpowied-
nich folderÛw w†oknie projektu.
W†ten sposÛb mamy do nich szybki
i†³atwy dostÍp. Naleøy pamiÍtaÊ, aby
w†pliku makefile znalaz³a siÍ lista
plikÛw do kompilacji i†odpowiednie
zaleønoúci.
Po przebrniÍciu przez przedstawio-
ny opis i†uruchomieniu pierwszego
programu, proponujÍ odwiedziÊ stro-
nÍ AVR Freaks zawieraj¹c¹ mnÛstwo
przyk³adÛw, projektÛw i†dokumentÛw
pomocniczych.
Mam nadziejÍ, øe niniejszy opis po-
zwoli pokonaÊ trudy zwi¹zane z†przy-
gotowaniem wspÛ³pracy AVR Studio
z†kompilatorem AVR-GCC i†zachÍci
CzytelnikÛw zainteresowanych progra-
mowaniem mikrokontrolerÛw do
w³asnych eksperymentÛw.
Micha³ Lankosz
sq9fqq@sq9fqq.prv.pl
http://sq9fqq.prv.pl
List. 3.
#include <io.h>
#include <io2313.h>
char x;
int main(void)
{
outp(0xff,DDRB);
x = 0xff;
while(1)
outp(x <<= 1,PORTB);
}
80
Elektronika Praktyczna 12/2002
32284508.006.png 32284508.007.png 32284508.008.png
Zgłoś jeśli naruszono regulamin