AVR-GCC kompiliatoriaus ABC. Pirma dalis

Tikriausiai nemažai AVR mėgejų ne kartą suko galvą kokį kompiliatorių pasirinkti savo projektų įgyvendinimui. Pasirinkimas yra tikrai nemažas. Galima naudoti įvairius komercinius kompiliatorius (IAR, CodeVision, ImageCraft), kurie dažniausiai turi gan patogią vartotojo sąsają, kodų generatorius, tačiau jie yra komerciniai. O mokėti, ypač mėgėjai yra nelabai linkę. Lieka viena išeitis – naudotis nemokamais, laisvai platinamais produktais. Vienas sėkmingiausių ir plačiausiai pasaulyje naudojamų atvirojo kodo AVR mikrokontrolerių programavimo produktų yra AVR-GCC kompiliatorius. Tai ne kas kita, kaip GCC http://gcc.gnu.org/ kompiliatorius pritaikytas AVR mikrovaldikliams. Kadangi atviro kodo programos yra laisvai platinamos, tai galima jas modifikuoti, sukompiliuoti norimai platformai (tai ypač aktualu linux mėgėjams).

Pats AVR – GCC kompiliatorius neturi vartotojo sąsajos. Viskas daroma per komandinę eilutę. Kad darbas nebūtų toks vargingas kompiliuojant programas, yra naudojami make failai. GNU kompiliatoriai kaip taisyklė naudoja unix stiliaus make failus bei programas. Paprasčiau kalbant visi reikalingi veiksmai yra užrašomi specialiame faile (makefile) ir tas failas paleidžiamas su make.exe programa. Realiai make failu pačiam nereikia rašyti, jų yra nemažai parašytų, užtenka juos modifikuoti pritaikant savo valdiklio tipui. Apie tai kiek vėliau.

Ne paslaptis, jog kompiliatoriaus valdymas komandine eilute yra nepatogu. Todėl šiam kompiliatoriui galima naudoti ir vartotojo sąsajas. Pavyzdžiui yra nebloga atvirojo kodo sąsaja-redaktorius Programmers Notepad http://www.pnotepad.org/. Kita patogi išeitis yra naudoti AVRStudio4. Ten kūrėjai įdiegė galimybę GCC kompiliatoriu naudoti kaip pluginą. AVRStudio4 taip pat yra neblogas redaktorius, bei programa automatiškai generuojanti makefile. Kitais žodžiais tariant galima programuoti nesirūpinant kompiliavimo smulkmenomis ir tuo pačiu turėti galinga įrankį su kompiliavimo, simuliavimo ir testavimo galimybėmis.

Užteks beletristikos. Bandysiu šio straipsnio dviejose dalyse apžvelgti:
1. WinAvr – AVR-GCC distribuciją (įrankių rinkinį) bei kai kurių iš jų naudojimą;
2. Makefile sudarymo principus;
3. AVR-GCC naudojimą AVRStudio4 aplinkoje;
4. AVRLIB bibliotekos naudojimą savo projektuose.
5. Realų pavyzdį

WinAVR

WinAVR tai Windows operacinei sistemai paruoštas programinių priemonių rinkinys skirtas AVR mikrokontrolerių programoms kurti. Šiame pakete yra naudojamas AVR-GCC C/C++ kompiliatorius. Oficialus šio projekto tinklalapis http://winavr.sourceforge.net/index.html. Iš čia viską galima ir parsisiųsti. Paskutiniu metu naujausias leidimas WinAVR20070525 paketą. į šį paketą įeina nemažai įrankių:
1. GNU Binutils – Utilitai (assembleris, linkeris, make ir kt.)
Pagrindiniai utilitai tai:
1) ld – GNU linkeris;
2) as – GNU assmebleris;
Taip pat (plačiau http://sources.redhat.com/binutils/):
3) addr2line;
4) ar;
5) c++filt
6) gprof;
7) nlmconv;
8) nm;
9) objcopy;
10) objdump;
11) ranlib;
12) readelf;
13) size;
14) strings;
15) strip;
16) windres.
2. GNU GCC (http://www.gnu.org/software/gcc/) – C ir C++ kompiliatorius skirtas AVR.
3. avr-libc (http://savannah.nongnu.org/projects/avr-libc/) – AVR standartinių funkcijų biblioteka.
4. avrdude (http://www.nongnu.org/avrdude/) – atviro kodo programa skirta programavimui. Galima pačiam papildyti naujais kontroleriais, bei programatoriais konfiguruojant nustatymo failus.
5. uisp (http://savannah.nongnu.org/projects/uisp) – kitas atviro kodo programavimui skirtas paketas.
6. avrdude-gui (http://sourceforge.net/projects/avrdude-gui) – avrdude grafinis interfeisas (alpha versija).
7. GNU Debugger(GDB) (http://sources.redhat.com/gdb/) – komandinės eilutės debugeris.
8. Insight (http://sources.redhat.com/insight/) – GDB grafinis interfeisas.
9. avarice (http://sourceforge.net/projects/avarice) – programa įgalinanti apjungti Atmel JTAG ICE su GDB, kad būtų galima debuginti AVR.
10. simulavr (http://savannah.nongnu.org/projects/simulavr/) – kartu su GDB atlieka avr simuliatoriaus vaidmenį.
11. SRecord (http://srecord.sourceforge.net/) – įrankių rinkinys manipliacijai su EPROM. Skaito įrašo EPROM ir pan.
12. MFile (http://www.sax.de/~joerg/mfile/) – automatinis make file generavimas.
13. Programmers Notepad (http://sourceforge.net/projects/pnotepad/) – programų redaktorius bei grafinis interfeisas.
14. Kitos utilitos (make, bach,…);
15 Dokumentavimas įvairiais formatais.
16. Makefile šablonas.

WinAVR instaliavimas

ParsisiųskimeWinAVR20070525. Galiu paminėti, jog laikas nuo laiko pasirodo atskirų dalių atnaujinimai, pvz. avr-libc.
Instaliavimo instrukcijas galite rasti čia http://winavr.sourceforge.net/download/install_config_WinAVR.pdf.
Sakysim pagal nutylėjimą suinstaliavome C:\WinAVR kataloge. Tuomet GNU Binutils įrankiai bus C:\WinAVR\Bin. kadangi GCC kompiliatorius yra pritaikytas AVR, tai prieš kiekviena programėlių yra avr- priedėlis, pvz., avr-as.exe, avr-gcc.exe ir t.t..

Programos rašymas

Programą patogu rašyti naudojant Programmers Notepad (toliau vadinsime PN), aišku galima naudoti ir kitus redagavimo įrankius įskaitant ir patį AVRStudio. PN gali iškviesti bet kurias komandas skirtas komandinei eilutei bei atvaizduoti rezultatus. Tai patogu pavyzdžiui iškviečiant make.exe utilitą, kuris savo ruožtu iškviečia kompiliatorių, linkerį arba kitus įrankius, reikalingus projekto sukompiliavimui. įrankių nustatymui eikite į Options->Tools. Kokius įrankius nustatysite, tai jie atsiras Tools pagrindiniame menu.

PN_ToolsMenu.jpg

Na gal apie viska is eiles. Manau daugelis neprieštaraus kad naudodamasis WinAVR instaliavimo instrukcija aprašysiu PN konfiguravima ir kaip pradėti kurti programą.
PN programa pasileidzia iš c:\winavr\pn\pn.exe arba per start meniu.

PN_langas.jpg

Kad sukonfiguruoti įrankius, spauskite Tools->Options meniu.
Atsidarys langas:

PN_ToolsMenu.jpg

Suinstaliavus matosi, jog pagal nutylėjimą yra sukurti trys įrankiai: Make All, Make Clean, Program. Tačiau kad suprastume kaip viskas nustatoma panagrinėkime viską iš eilės.
Atsidarykime Make All įranki paspaudę Edit.

PM_MakeAll.jpg

įrankio laukai:
Name – bet koks sugalvotas įrankio pavadinimas;
Command – vykdoma komanda. Šiuo atveju make.exe.
Folder – katalogas kuriame yra tavo makefile. %d – rodo kad tai yra default.
Parameters – parametrai reikalingi make komandai vykdyti. All reiškia kad kompiliuojama viskas. (Apie make komandą ir jos parametrus kiek vėliau)
Shortcut – taip ir nesupratau kam jis. Tiesiog palikite none.
Save – patogus tuo, jog pasirinkus current file arba all files, programa išsaugo pakeitimus prieš vykdydama komandą, nes priešingu atveju, jeigu bus pasirinktas none, tai komanda vykdys iš karto, ir jeigu nebus išsaugoti pakeitimai, tai kompiliuojamas bus neišsaugotas projektas.
Visa kita kol kas palikite kaip yra.
žemiau pateikiama lentelė su dažniausiai pasitaikančiomis komandomis:

PM_cmdlentele.jpg

Surašius šias komandas į Tools options, visi jie bus matomi Tools meniu.
Sukonfigūravus įrankius belieka pradėti naują projektą. File->New->Project. pasirenkate katalogą, kur projektas bus saugomas sukuriate projektą norimu pavadinimu.

PN_NewProj.jpg

Tada sukurkite naują C failą per File->New C/C++. Prašykite programą ir išsaugokite projekto kataloge. Kai failas išsaugotas, tada paspauskite ant projekto dešinį peles klavišą ir pasirinkite Add files. Atsiradusiame lange pasirinkite išsaugotą C failą. Liko vienas žingsnis ir ko gero svarbiausias – makefile kūrimas.
Makefile kūrimo keliai yra keli: galima pačiam rašyti nuo nulio, bet tai labai neefektyvu, galima naudotis šablonu, paredaguojant reikiamas vietas.
Sakykime mūsų programa:

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/iom8.h>
int main (void)
{
unsigned char counter;
DDRB = 0xFF;
while(1)
{
PORTB |=1<<2;
counter=0;
while (counter !=5)
{
_delay_loop_2(30000);
counter++;
}
PORTB &=~(1<<2);
counter=0;
while(counter !=5)
{
_delay_loop_2(30000);
counter++;
}
return 1;
}
}
Lange turėtume matyti:

PM_pvz.jpg

Kad galėtume sukompiliuoti programą reikia sukurti makefile. Atsidarykime MFile programą per Start->Programs menu:

PM_MFile.jpg

Atsidariusiame lange matosi makefile šablonas. Norint sėkmingai sukompiliuoti programą reikia makefile pritaikyti projektui. Paspaudus ant makefile meniu mygtuko atsidaro makefile kūrimo įrankiai. Apie kiekvieną pakalbėkim plačiau:
1. Code generation – dar neimplementuotas;
2. Main file name… – pasirenkamas pagrindinis programos failas be plėtinio;
3. MCU type – pasirenkamas mikrokontroleris;
4. Output format – išvedimo failo formatas. Pagal nutylėjimą naudojamas ihex (Intel hex);
5. Optimization level – pasirenkamas optimizacijos lygmuo. Kuo optimizacija didesnė, tuo kodas kompaktiškesnis, tačiau atsiranda didesnė tikimybė atsirasti kompiliavimo klaidoms;
6. Debug format – debug failo išvedimo formatas. Pasirenkamas priklausomai nuo to kokia debuginimo programa bus naudojama;
7. C standard level – pasirenkamas C kalbos standartas. Pagal nutylėjimą GNU99;
8. C/C++ source file(s) – pasirenkami visi C ar C++ failai įeinantys į projektą. Jeigu failai patalpinti tam pačiam projekto kataloge, užtenka tik jų pavadinimus nurodyti, kitu atveju reikia nurodyti pilną kelią iki jų;
9. Assembler source files(s) – nurodomi visi asm failai reikalingi projektui;
10. printf() – galimybė pasirinkti printf() funkcijos tipą. Galima pasirinkti mažiau išteklių naudojantį arba pritaikytą specialiai kontroleriams su slankaus kablelio skaičiais;
11. scanf() – panašiai kaip printf() tik skaičių įvedimui;
12. External RAM options – pasirenkama kai naudojama išorinė RAM atmintis;
13. AVRdude – neimplementuota;
14. Programmer – pasirenkamas programatoriaus tipas;
15. Port – pasirenkamas portas;
16. Miscelaneous – kita, bet neimplementuota;
17. Enable Editing of Makefile – įgalina makefile redagavimą. Tai kita galimybė atlikti aukščiau minėtas operacijas. Galima tiesiog visą informaciją suvesti rankomis.
Sutvarkius makefile, jį reikia išsaugoti projekto kataloge kur yra pagrindinis C failas makefile vardu be jokio plėtinio. Kitu atveju reikės nurodyti kur yra makefile vietą bei pavadinimą jeigu jis išsaugotas kitu vardu.
Kai makefile išsaugotas belieka sukompiliuoti programą paspaudus PM Tools->make All. Jeigu programoje nėra klaidų, turėtų būti išmetamas panašus pranešimas:
> „make.exe“ all
——– begin ——–
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o main.o
Linking: main.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -MD -MP -MF .dep/main.elf.d main.o –output main.elf -Wl,-Map=main.map,–cref -lm
Creating load file for Flash: main.hex
avr-objcopy -O ihex -R .eeprom main.elf main.hex
Creating load file for EEPROM: main.eep
avr-objcopy -j .eeprom –set-section-flags=.eeprom=“alloc,load“ \
–change-section-lma .eeprom=0 -O ihex main.elf main.eep
Creating Extended Listing: main.lss
avr-objdump -h -S main.elf > main.lss
Creating Symbol Table: main.sym
avr-nm -n main.elf > main.sym
Size after:
main.elf :
section size addr
.text 148 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.debug_aranges 20 0
.debug_pubnames 27 0
.debug_info 214 0
.debug_abbrev 156 0
.debug_line 250 0
.debug_str 138 0
Total 953
AVR Memory Usage:
—————–
Device: atmega8
Program: 148 bytes (1.8% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
——– end ——–
> Process Exit Code: 0

čia galima pamatyti visus kompiliavimo rezultatus tarp kurių ir sukompiliuotos programos dydį bei kontrolerio FLASH užimamą vietą procentais.

Makefile ir jo sudarymo principai

Prieš tai esančiuose skyreliuose mes labai greitai prabėgome, t.y. sukūrėme makefile. Bet mano manymu – makefile tai sėkmingo projekto kompiliavimo pagrindas. Daugelis naudoja įvairius grafines aplinkas kurdami programas, bet nesusimąsto, kaip tos programos yra sukompiliuojamos. Paprastam projektui makefile yra nebūtinas – galima sukompiliuoti naudojant kompiliatorių (pvz., avr-gcc mano.c). Tačiau jeigu projektas didelis ir jį sudarančių bylų skaičius 10, 100 ir daugiau, be makefile neišsiversi. Be makefile neišsiversi ir naudodamas papildomas bibliotekas, pavyzdžiui, AVRLIB biblioteką apie kurią pakalbėsime tolimesniuose skyriuose. Norint perprasti makefile sudarymo vingrybes vertėtų perskaityti http://www.gnu.org/software/make/manual/html_mono/make.html. Aš labai nesigilinsiu, bandysiu apžvelgti tai kas aktualu kompiliuojant projektus su AVR.

Makefile galima suprasti kaip bylą, kurioje yra surašytos komandos kurias reikia įvykdyti. Realiai kalbant make yra daug galingesnis įrankis, kuris gali turėti kintamuosius bei kt. Dažniausiai make failai yra pavadinti makefile be jokio plėtinio. Todėl iškviečiant make komandą nereikia nurodyti make failo pavadinimo. Nurodyti reikėtų, jeigu būtų kitoks pavadinimas. sakykime jeigu projektas ir tuo pačiu makefile yra d:\myproj\muproj1 kataloge, tai sukompiliuoti užtenka surinkus komandą:
d:\myproj\muproj1> make <Enter>
Programa make.exe susiras makefile tame pačiame kataloge ir įvykdys komandas esančias makefile byloje.

Svarbu paminėti, jog make komanda gali turėti parametrus. Kaip jau pastebėjote PN programoje nustatinėdami įrankius įvedinėjome all bei clean, pvz., d:\myproj\muproj1> make all <Enter>
make all‘ yra tas pats kas ir make. bet kuriuo atveju make arba make all komanda sukompiliuos visa kodą ir sukurs hex failą bei cof failą.

Dažniausiai dirbant su didesniais projektais yra naudojami keletas c bylų. jeigu ka nors pakeisi vienoje byloje ir paleisi make komandą, tai bus sukompiliuojama tik ta byla, kuri buvo pakeista, o kitos kurios buvo anksčiau sukompiliuotos bus tik apjungiamos prie sukompiliuotos programos. Tai patogu, bei taupo laiką. Aišku yra tam tikrų niuansų, pavyzdžiui jeigu bus pakeistas optimizavimo lygmuo, tai paleidus make, nebus perkompiliuojama viskas. Todėl pirmiausia reikia surinkti ‘make clean’, kuri ištrins ankstesnes kompiliacijas ir paleidus make all vėl bus sukompiliuota su kitu optimizavimo lygmeniu.

Kaip žinia WinAVR prie to kad sukuria hex bylas, dar kuria ir bylas kurios naudojamos debuginimui(testavimui): coff bylas. Šios bylos naudojamos apjungiant projektą su AVRStudio debuginimui. Naujesniems AVR studio yra naudojami išplėsti coff failai (extended coff – extcoff). extcoff formatas naudojamas vėlesnėse nei AVRStudio 4.07 versijose.

Kitas parametras, kuris gali būti naudojamas, tai program. Naudojant program parametrą, .hex byla bus įrašyta į mikrokontrolerio FLASH.

Vienas svarbus pastebėjimas. Dažniausia klaida sudarinėjant makefile yra ta, jog nesilaikoma sintaksės. Keturi tarpai ir tabas make failuose yra NE TAS PATS. “Tabas” yra dedamas prieš kiekvieną vykdomą komandą.

Trumpai apie tai ką reikia dažniausia redaguoti makefile šablone. Pirmiausia nurodome mikrokontrolerį:
# MCU name -( po ženklo # viskas yra komentarai);
MCU = atmega128

čia įrašome norimą mikrokontrolerį, kad ir at90s2313
toliau nurodomas pagrindinis projekto failas be plėtinio c:

TARGET = mano

Toliau, jeigu projekte yra daugiau naudojamų c bylų, tai būtina jas nurodyti įtraukiant ir pagrindinę bylą:

SRC = $(TARGET).c kita_byla.c

matome jog vietoj pagrindinės bylos yra naudojamas $(TARGET) kintamasis. kuris yra lygus mano. Jeigu kiti c failai yra kitose direktorijose tai būtina nurodyti pilna kelia iki jų:

SRC = $(TARGET).c c:\katalogas\kita_byla.c

Jeigu projekte naudojami asm failai, tai juos reikia taip pat nurodyti:

ASRC = asm_failas.S

ASM failai avr-gcc yra žymimi plėtiniu didžiąja .S
Toliau make faile yra nurodomas optimizavimo lygmuo:

OPT=s

žinome jog projekte naudojami ne tik C failai bet ir headeriai (kažkaip greitai nesumąsčiau kaip juos pavadinti) su plėtiniu .h.
jeigu jie yra kur nors kitame kataloge (išskyrus tuos atvejus, kai naudojami standartiniai winavr), tai tuos katalogus reikia nurodyti, pvz.:

EXTRAINCDIRS=c:\includes d:\myproj\inc A:\includai

jeigu tai nepadeda tai priedo susiraskite makefile vietą kur yra nurodomas parametras CFLAGS ir naujoje eilutėje įrašykite:

CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))

Tai nurodys kompiliatoriui paimti EXTRRAINCDIR duomenis ir įterpti -I prieš kiekvieną žodį ir panaudoti tai kompiliuojant.
Šitas pavyzdys pridės prie include direktorijų ir esančias EXTRRAINCDIR. jeigu nebereikia šitų direktorijų tai pakanka ištrinti jas paliekant:

EXTRAINCDIRS=

Panašiai, jeigu reikia šitų include katalogu asemblerio failams tai atitinkamai reikia parašyti eilutę:

AFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) prie AFLAGS makefile vietoje.

Manau kol kas turėtų pakakti. Juo lab, kad aš ir pats daugiau praktiškai nenaudoju. Pateiktas makefile šablonas daug didesnis negu aptarėme. Galima nurodyti programavimą į FLASH ir panašiai….

Skelbta Elektronika Pažymėti: , ,
3 comments on “AVR-GCC kompiliatoriaus ABC. Pirma dalis
  1. psykas parašė:

    labas
    suinstalevau WinAVR ir bandziau uzprogramuoti atmega 16 bet nelabai man ten pavyksta, atrodo viska dariau kaip cia aprasyta(esu zalias sioje srityje) cia nukopinau ka raso programmer notepad bendan hex faila sukurti
    > „make.exe“ all

    ——– begin ——–
    avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    make.exe: *** No rule to make target `mano.elf’, needed by `elf’. Stop.

    > Process Exit Code: 2
    > Time Taken: 00:00

    • Anonymous parašė:

      pabandyk IAR ir Proteus, jie toie paprastesni ir jokiu make nereikia, tiesiog ramia galva programuoji, zinoma sitie pavyzdziai ten netiks nes kaip pastebejau turi nestandartiniu biblioteku kaip io ir delay

  2. Anonymous parašė:

    man taspac

Parašykite komentarą