AVR-GCC w Linuksie - przykład instalacji ze źródeł
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.
$ 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.
# mkdir /usr/local/avr
# exit
$
Dodałem do ścieżki przeszukiwania podkatalog /usr/local/avr/bin, tam trafią wszytki plik wykonywalne.
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)
# gvim /etc/profile
# exit
następnie w pliku /etc/profile odnalazłem fragment:
i zaraz po nim dopisałem instrukcję:
KROK 2 - instalacja binutils
Rozpakowałem archiwum binutils-2.20.1.tar.bz2 i przeszedłem do katalogu ze źródłami binutils
$ 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.
$ cd obj-avr
Będąc w katalogu binutils-2.20/obj-avr uruchomiłem skrypt configure z odpowiednio dobranymi opcjami.
Skrypt configure zakończył działanie bez błędu, uruchomiłem kompilację
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.
# make install
Wyszedłem z kąta root i wróciłem do katalogu avrsrc
$ 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
$ 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.
$ cd obj-avr
Będąc w katalogu gcc-4.3.3/obj-avr uruchomiłem skrypt configure z odpowiednimi opcjami.
Uruchomiłem kompilację
Zmieniłem użytkownika na root i uruchomiłem instalację plików
# make install
Wyszedłem z kąta root i wróciłem do katalogu avrsrc
# 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.
$ cd avr-libc-1.7.1
Będąc w katalogu avr-libc-1.7.1 uruchomiłem skrypt configure z odpowiednimi opcjami.
Skompilowałem
Następnie zmieniłem użytkownika na root
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
Uruchomiłem instalacje plików avr-libc
Wyszedłem z kąta root i wróciłem do katalogu avrsrc
# cd ..
KROK 5 - instalacja avrdude
Rozpakowałem archiwum avrdude-5.11.tar.gz i przeszedłem do katalogu ze źródłami avrdude.
$ cd avrdude-5.11
Będąc w katalogu avrdude-5.11 uruchomiłem skrypt configure .
Skompilowałem
Przeszedłem na konto root i uruchomiłem instalację plików
# make install
Wyszedłem z kąta root i wróciłem do katalogu avrsrc
$ 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
# gvim /etc/udev/rules.d/avrdude-usbasp.rules
I wkleiłem do tego pliku poniższą regułkę.
SYSFS{idProduct}=="05dc", GROUP="adm", MODE="0666"
Zapisałem plik i zrestartowałem udev poleceniem:
# 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.
$ cd avrgcc_test
W katalogu projektu avrgcc_test, z pomocą edytora tekstu, utworzyłem nowy plik o nazwie 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); } }
Animacja poniżej demonstruje jak powinien działać nasz przykładowy program.
Następnie skompilowałem programik z pliku led.c poleceniem:
Z wynikowego pliku led.out utworzyłem plik dla programatora led.hex
Sprawdziłem wielkość kodu wynikowego
Z pomocą programu avrdude zapisałem kod zawarty w pliku led.hex do pamięci flash AVRa atmega16
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
Ważne! Plik makefile składa się z reguł zbudowanych według wzoru:
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:
Żeby zaprogramować AVRa, piszę:
Żeby posprzątać w katalogu projektu
Natomiast autorowi tego artykułu jestem bardzo wdzięczny bo wskazał mi drogę jak prosto i tanio można rozpocząć zabawę z mikrokontrolerami.