Uwaga! Ta strona wysyła Ci "ciasteczko".

Artykuł pochodzi ze strony XYZ HOBBY ROBOT (abxyz.bplaced.net)

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




Copyright © 2009-2017 XYZ Hobby Robot - Wszelkie prawa zastrzeżone