Uwaga! Ta strona wysyła Ci "ciasteczko".
Użytkowników online:
2
Artykuły>Mikrokontrolery i PLD>AVR-GCC w Linuksie, cz.1
printer_icon

AVR-GCC w Linuksie - przykład instalacji ze źródeł

28.04.10 ABXYZ
obrazek

Ostatnio aktualizowałem na swoim PC system Linux Slackware i całe oprogramowanie. I z tej okazji opiszę tutaj szczegółowo, krok po kroku, jak zainstalować kompilator AVR-GCC z plików źródłowych. Opiszę również jak zacząć używać AVR-GCC: jak skompilować przykładowy program w języku C i jak zaprogramować pamięć AVRa. Na pewno przykład ten komuś się przyda.

Aby zbudować środowisko programistyczne AVR-GCC (kompilator języka C i zestaw programów narzędziowych), potrzeba zainstalować pakiety: binutils, gcc, avr-libc. Przyda się także program do obsługi programatora ISP, najlepszy jest avrdude. To jest zestaw minimum pozwalający kompilować programy i programować AVRy. W drugiej części tego artykułu napiszę na temat debugowania i symulacji, opiszę instalację: avr-gdb, avr-insight, avarice, simulavr.

KROK 1

Zacząłem od utworzenia na dysku tymczasowego katalogu o nazwie avrsrc, do którego pobrałem z internetu paczki zawierające pliki źródłowe instalowanego oprogramowania.

$ mkdir avrsrc

$ cd avrsrc

$ wget ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2

$ wget ftp.gnu.org/gnu/gcc/gcc-4.3.3/gcc-core-4.3.3.tar.bz2

$ wget http://mirror.lihnidos.org/GNU/savannah/avr-libc/avr-libc-1.7.1.tar.bz2

$ wget http://mirror.lihnidos.org/GNU/savannah/avrdude/avrdude-5.11.tar.gz

Wiem z doświadczenia, że kompilacja najnowszych wersji gcc dla AVRów, z jakiś nieznanych powodów, może zakończyć się niepowodzeniem. Aby uniknąć ewentualnych problemów, pobrałem z Internetu gcc w  tej wersji, jaka jest w  aktualnym pakiecie WinAVR. Zamierzamy programować AVRy tylko w język C (bez C++), dlatego pobrałem mniejszą paczkę gcc-core.

Następnie założyłem nowy katalog dla środowiska AVR-GCC, wszystkie pliki instalowane będą w osobnym katalogu /usr/local/avr . Przy kolejnej aktualizacji, nie będzie kłopotu z odinstalowaniem starszej wersji AVR-GCC, po prostu usunę stary katalog albo zmienię jego nazwę na inną. Właścicielem katalogu /usr/local jest root, więc aby założyć w tam nowym podkatalog, zmieniłem użytkownika systemu na root.

$ su

# mkdir /usr/local/avr
# exit
$

Dodałem do ścieżki przeszukiwania podkatalog /usr/local/avr/bin, tam trafią wszytki plik wykonywalne.

$ export PATH=$PATH:/usr/local/avr/bin

Aby na stałe dodać katalog /usr/local/avr/bin do ścieżki przeszukiwania systemu, otworzyłem do edycji plik /etc/profile (używam edytora tekstu gvim)

$ su

# gvim /etc/profile
# exit

następnie w pliku /etc/profile odnalazłem fragment:

# Set the default system $PATH: PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"

i zaraz po nim dopisałem instrukcję:

# Dodajemy do ścieżki przeszukiwania katalog /usr/local/avr/bin PATH=$PATH:/usr/local/avr/bin

KROK 2 - instalacja binutils

Rozpakowałem archiwum binutils-2.20.1.tar.bz2 i przeszedłem do katalogu ze źródłami binutils

$ tar -xjvf binutils-2.20.1.tar.bz2

$ cd binutils-2.20.1

Kompilację binutils należy przeprowadzić z podkatalogu, więc w katalogu ze źródłami binutils założyłem podkatalog obj-avr.

$ mkdir obj-avr
$ cd obj-avr

Będąc w katalogu binutils-2.20/obj-avr uruchomiłem skrypt configure z odpowiednio dobranymi opcjami.

$ ../configure --prefix=/usr/local/avr --target=avr --disable-nls

Skrypt configure zakończył działanie bez błędu, uruchomiłem kompilację

$ make

Aby skrypt instalacyjny miał dostęp do katalogu /usr/local/avr, trzeba instalację plików przeprowadzić z konta użytkownika root Zmieniłem użytkownika na root i uruchomiłem instalację plików.

$ su

# make install

Wyszedłem z kąta root i wróciłem do katalogu avrsrc

# exit

$ cd ../..

KROK 3 - Instalacja gcc

Rozpakowałem archiwum gcc-core-4.3.3.tar.bz2 i przeszedłem do katalogu z plikami źródłowymi gcc

$ tar -xjvf gcc-core-4.3.3.tar.bz2
$ cd gcc-4.3.3

Podobnie jak w przypadku binutils, kompilację gcc należy przeprowadzić z podkatalogu. W katalogu ze źródłami gcc założyłem podkatalog obj-avr.

$ mkdir obj-avr
$ cd obj-avr

Będąc w katalogu gcc-4.3.3/obj-avr uruchomiłem skrypt configure z odpowiednimi opcjami.

$ ../configure --prefix=/usr/local/avr --target=avr --enable-languages=c --disable-nls --disable-libssp --with-dwarf2

Uruchomiłem kompilację

$ make

Zmieniłem użytkownika na root i uruchomiłem instalację plików

$ su
# make install

Wyszedłem z kąta root i wróciłem do katalogu avrsrc

# exit
# cd ../..

KROK 4 - insatalacja avr-libc

Rozpakowałem archiwum avr-libc-1.7.1.tar.bz2 i  przeszedłem do katalogu ze źródłami avr-libc.

$ tar -xjvf avr-libc-1.7.1.tar.bz2
$ cd avr-libc-1.7.1

Będąc w katalogu avr-libc-1.7.1 uruchomiłem skrypt configure z odpowiednimi opcjami.

$ ./configure --prefix=/usr/local/avr --build=`./config.guess` --host=avr

Skompilowałem

$ make

Następnie zmieniłem użytkownika na root

$ su

W trakcie instalacji plików avr-libc powinien być już dostępny działający kompilator avr-gcc. Dlatego również dla użytkownika root dodałem do ścieżki przeszukiwania katalog /usr/local/avr/bin

# export PATH=$PATH:/usr/local/avr/bin

Uruchomiłem instalacje plików avr-libc

# make install

Wyszedłem z kąta root i wróciłem do katalogu avrsrc

# exit
# cd ..

KROK 5 - instalacja avrdude

Rozpakowałem archiwum avrdude-5.11.tar.gz i przeszedłem do katalogu ze źródłami avrdude.

$ tar -xzvf avrdude-5.11.tar.gz
$ cd avrdude-5.11

Będąc w katalogu avrdude-5.11 uruchomiłem skrypt configure .

$ ./configure --prefix=/usr/local/avr

Skompilowałem

$ make

Przeszedłem na konto root i uruchomiłem instalację plików

$ su
# make install

Wyszedłem z kąta root i wróciłem do katalogu avrsrc

# exit
$ cd ..

Programator USBasp

Ja używam programatora USBasp. W Linuksie nie trzeba instalować żadnych dodatkowych sterowników, aby korzystać z programatora USBasp. Jednak programator jest dostępny jedynie dla użytkownika root. Żeby dać możliwość korzystania z programatora USBasp także innym użytkownikom systemu, zrobiłem następującą rzecz: zmieniłem użytkownika na root, i z pomocą edytora tekstu, w katalogu /etc/udev/rules.d/, utworzyłem nowy plik o nazwie 60-objdev.rules

# su

# gvim /etc/udev/rules.d/avrdude-usbasp.rules

I wkleiłem do tego pliku poniższą regułkę.

SUBSYSTEM=="usb", SYSFS{idVendor}=="16c0",
SYSFS{idProduct}=="05dc", GROUP="adm", MODE="0666"

Zapisałem plik i zrestartowałem udev poleceniem:

#/etc/rc.d/rc.udev force-restart

# exit

Aby to zadziałało musiałem odłączyć na chwilę programator USBasp z portu USB komputera i podłączyć ponownie.

Test AVR-GCC - kompilacja przykładowego programiku

Utworzyłem katalog projektu, aby w nim przeprowadzić kompilację przykładowego programiku, celem sprawdzenia czy kompilator właściwie działa.

$ mkdir avrgcc_test

$ cd avrgcc_test

W katalogu projektu avrgcc_test, z pomocą edytora tekstu, utworzyłem nowy plik o nazwie led.c

$ gvim led.c

I wkleiłem do niego poniższy kod przykładowego programiku, i zapisałem.

/* "led.c" - programik do testowania środowiska WinAVR */
/* układ ATmega 1MHz */
/* PB0,PB1 - diody LED; PD0 - przycisk */

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>               

int main(void)
{
    DDRB  |= _BV(0)|_BV(1);
    PORTB |=  _BV(0);
    PORTB &= ~_BV(1);
    DDRD  &= ~_BV(0);
    PORTD |=  _BV(0);

    while (1) 
    {
        PORTB ^=_BV(0);
        PORTB ^=_BV(1);
        _delay_ms((PIND & _BV(0))? 1000: 200);
    }
}
Listing przykładowego programu

Animacja poniżej demonstruje jak powinien działać nasz przykładowy program.

obrazek
Efekt działania przykładowego programu. Do portów PB0..PB1 przyłączone są diody LED, do PD0 przycisk.

Następnie skompilowałem programik z pliku led.c poleceniem:

$ avr-gcc -mmcu=atmega16 -Os -Wall led.c -o led.out -lm

Z wynikowego pliku led.out utworzyłem plik dla programatora led.hex

$ avr-objcopy -O ihex -R .eeprom led.out led.hex

Sprawdziłem wielkość kodu wynikowego

$ avr-size led.out

Z pomocą programu avrdude zapisałem kod zawarty w pliku led.hex do pamięci flash AVRa atmega16

$ avrdude -c usbasp -p m16 -U flash:w:led.hex

Kompilacja przykładowego programu i programowanie pamięci flash AVRa przebiegło bez problemów, zatem AVR-GCC zainstalowany i programator ISP działa.

Plik Makefile

Przydałby się jeszcze plik makefile, aby zautomatyzować kompilację projektów składających się z wielu plików źródłowych. Ja do katalogu projektu kopiuje zwykle taki plik

# avr-gcc makefile

# Typ AVRa
MMCU = atmega16

# Częstotliwość zegara
F_CPU = 1000000

# Typ programatora
PROGRAMMER = usbasp 
PROGRAMMER_PORT = usb

# Nazwa wynikowego pliku hex
PROJECT = led

# Pliki źródłowe
SOURCES = led.c

CC = avr-gcc
OBJCOPY = avr-objcopy

CDEFS = -DF_CPU=$(F_CPU)UL

CFLAGS = $(CDEFS) 
CFLAGS += -mmcu=$(MMCU) -g -Os -Wall

OBJECTS = $(SOURCES:.c=.o)

$(PROJECT).hex: $(PROJECT).out
	$(OBJCOPY) -O ihex -R .eeprom $(PROJECT).out $(PROJECT).hex

$(PROJECT).out:  $(OBJECTS)
	$(CC)  $(CFLAGS) $^ -o $@ -lm

$.o:%.c
	$(CC) $(CFLAGS) $< -o $@

program_flash: $(PROJECT).hex
	avrdude -c $(PROGRAMMER) -P $(PROGRAMMER_PORT) -p $(MMCU) -U flash:w:$(PROJECT).hex 

clean:
	rm -f $(OBJECTS) 
	rm -f $(PROJECT).out
	rm -f $(PROJECT).hex

.PHONY: clean program_flash


Plik Makefile

Ważne! Plik makefile składa się z reguł zbudowanych według wzoru:

CEL:ZALEŻNOŚCI [Tab]KOMENDA

Znak tabulacji przed komendą jest konieczny, trzeba o tym pamiętać edytując plik makefile.

Jest już w katalogu odpowiedni pliki Makefile, zatem, aby skompilować przykładowy programik wydaję polecenie:

$ make

Żeby zaprogramować AVRa, piszę:

$ make program_flash

Żeby posprzątać w katalogu projektu

$ make clean


28.04.10 ABXYZ




Inne artykuły na podobny temat:

  1. Atmel AVR GNU Toolchain


legenda

Komentarze (5)

Jeff
13.09.2012 (08:14)
gość
Te wskazówki odnoszą się do tych co słabo znają Linuxa. Ja miałem kłopot i coś chyba robiłem źle (w każdym razie nie rozumiałem co się wykonuje, itp.). Zależało mi też na wersji Linuxa nie instalowanej na dysku, gdyż mam programator STK200 i chcąc programować musiałem szukać starszych komputerów u znajomych (w firmie) z wejściem LPT (później zauważyłem że nie wszędzie odpala się Ubuntu z USB, ale to już inna historia).
Natomiast autorowi tego artykułu jestem bardzo wdzięczny bo wskazał mi drogę jak prosto i tanio można rozpocząć zabawę z mikrokontrolerami.
abxyz
28.08.2012 (19:54)
autor strony
Nie o to chodzi, żeby prędko. Instalacja oprogramowania ze źródeł ma kilka zalet, możesz mieć na dysku najświeższą wersje programu, możesz skompilować go z dodatkowymi opcjami itd.
Jeff
28.08.2012 (13:30)
gość
Polecam też Ubuntu np. wersję 10.04.
Używam w wersji na USB w trybie "Peristance".
Ja potrzebuje jedynie programy AVRDUDE i Putty. Programy te można w bardzo wygodny sposób zainstalować z bazy oferowanych programów.
Również trybie tekstowym jeśli tylko wpisze się AVRDUDE to od razu podpowie jakiej należy użyć komendy, żeby zainstalować ten program. Jeśli jest się podłączonym do internetu to po 3 minutach już można korzystać z programu.
cszawisza
29.03.2011 (08:18)
gość
Również bardzo dziękuje :)
Tom
07.06.2010 (18:31)
gość
Dziękuje Panu autorowi artykułu. Pomógł mi ten rozwiązać problem.

Osobiście do pisania programów (nauki) z kursu używam KontrollerLab. Dość prosty w obsłudze.

Pozdrawiam
tom
Artykuły>Mikrokontrolery i PLD>AVR-GCC w Linuksie, cz.1
Ostatnie artykuły