Ethernet i AVR–y, cz.1.pdf
(
532 KB
)
Pobierz
089-091_ethernet_cz1.indd
K U R S
Ethernet i AVR–y
Ethernut od podstaw, część 1
Jeszcze niedawno korzystanie z sieci lokalnych
i Internetu pozwalały wyłącznie duże komputery.
Dziś łatwo dostępne, tanie i szybkie mikrokontrolery
oraz kontrolery sieciowe umożliwiają taki dostęp
również samodzielnie konstruowanym urządzeniom
elektronicznym. Ethernet stał się dla nich
wygodnym środkiem komunikacji i uzupełnił,
a często zastąpił, dotychczas stosowane interfejsy
umożliwiające wymianę danych z innymi urządzeniami,
np. port szeregowy. O ile UART da się oprogramować w kilku
linijkach kodu i jest to łatwe zadanie nawet dla początkującego
elektronika, o tyle napisanie od początku najprostszego programu dla
mikrokontrolera wykorzystującego sieć opartą na protokole TCP/IP
wymaga mnóstwa czasu i wiedzy. Na szczęście nie musimy tego
robić, powstały bowiem sieciowe systemy operacyjne, przeznaczone
dla małych mikrokontrolerów. Jednym z nich jest Nut/OS, znany
również jako Ethernut. W artykule omówię możliwości tego systemu,
opiszę sposób instalacji i posługiwania się bibliotekami Nut/OS–a oraz
przedstawię jego przykładowe zastosowania.
takie uproszczenia jest niezbyt wy-
godny interfejs programistyczny. Dzię-
ki integracji z systemem operacyjnym,
Nut/Net jest łatwy w obsłudze, o czym
przekonacie się w dalszej części arty-
kułu.
Oto niektóre z jego możliwości:
– obsługa protokołów TCP/IP: ARP,
IP, TCP, UDP, ICMP,
– obsługa kilku najpopularniej-
szych kontrolerów Ethernet,
m.in. RTL8019AS, CS8900,
LAN91C111, DM9000,
– możliwość łączenia się z Interne-
tem za pomocą protokołu PPP
(modem),
– wbudowany serwer WWW o spo-
rych możliwościach – skrypty CGI,
dynamiczne generowanie zawar-
tości stron, autoryzacja użytkowni-
ków,
– autokonfiguracja interfejsu siecio-
wego z wykorzystaniem DHCP,
– wbudowane
resolvowanie
nazw
ho-
stów
,
– bardzo prosty interfejs programi-
styczny, naśladujący „pecetowe”
sockety
.
Nut/OS – ogólnie
Nut/OS to wielowątkowy sys-
tem operacyjny czasu rzeczywistego
(RTOS) stworzony przez niemiecką fir-
mę Egnite. Kod źródłowy systemu jest
objęty bardzo liberalną licencją BSD,
co umożliwia tworzenie bazujących
na nim komercyjnych aplikacji, na-
wet o zamkniętym kodzie źródłowym.
Należy jedynie zaznaczyć, że produkt
używa systemu Ethernut. Nut/OS jest
dostępny dla kilku platform sprzęto-
wych oraz obsługuje sporo urządzeń
peryferyjnych, a wszystko to można
łatwo dopasować do własnych wyma-
gań. Obecnie obsługiwane są następu-
jące rodziny mikrokontrolerów:
– Atmel AVR (Atmega103/Atmega-
128),
– ARM (Atmel),
– Renesas H8/300H.
System napisano w języku C z nie-
wielką liczbą wstawek asemblerowych,
bardzo przejrzyście i modularnie, dla-
tego stworzenie wersji na inny proce-
sor nie powinno sprawiać kłopotów.
Nut/OS udostępnia programiście ty-
powe mechanizmy wielozadaniowego
systemu operacyjnego:
– wielowątkowość z podziałem czasu
procesora,
– zarządzanie pamięcią, dynamiczną
alokację RAM–u,
– komunikację międzyprocesową
(
events
),
– obsługę systemów plików (UROM
i FAT),
– sterowniki urządzeń,
– timery (jednorazowe i okresowe),
– wysokopoziomową obsługę prze-
rwań.
Wymienione cechy stanowią mini-
malną funkcjonalność jądra systemu,
konieczne do uruchomienia najważ-
niejszego elementu Nut/OSa – stosu
TCP/IP Nut/Net. Oczywiście istnieją
stosy, które obywają się bez wymie-
nionych mechanizmów, ale ceną za
Środowisko uruchomieniowe
Jako platformę do uruchamiania
i testowania aplikacji Nut/OS wykorzy-
stałem zestaw składający się z trzech
modułów firmy Kamami: ZL1ETH
(uniwersalny interfejs Ethernet z ukła-
dem RTL8019 i gniazdkiem RJ45 zinte-
growanym z transformatorem), ZL9AVR
(płyta bazowa z wyposażeniem umoż-
liwiającym budowanie własnych apli-
kacji ethernetowych), ZL7AVR (moduł
dipAVR z mikrokontrolerem ATmega-
128). Kompletny zestaw pokazano na
fot. 1
.
Co to jest stos TCP/IP
TCP (
Transmission Control Protocol
) jest to strumieniowy protokół komunikacji pomiędzy dwoma
komputerami. Został stworzony przez Vintona Cerfa i Roberta Kahna. Jest on częścią większej
całości określanej jako stos TCP/IP. W modelu OSI TCP odpowiada warstwie transportowej.
TCP zapewnia wiarygodne połączenie dla wyższych warstw komunikacyjnych zabezpieczanych za
pomocą sum kontrolnych i numerów sekwencyjnych pakietów. Brakujące pakiety są obsługiwane
przez żądania retransmisji. Host odbierający pakiety TCP porządkuje je według numerów sekwen-
cyjnych tak, by przekazać wyższym warstwom modelu OSI pełen, złożony segment.
Fragment informacji z
http://pl.wikipedia.org/wiki/TCP
Elektronika Praktyczna 12/2006
89
K U R S
Mikrokontroler ATmega128 zainsta-
lowany na płytce ZL7AVR jest takto-
wany sygnałem zegarowym o często-
tliwości 16 MHz. Na płytce bazowej
umieszczono m.in. 32 kB statycznej
pamięci RAM, niezbędnej do prawi-
dłowej pracy systemu.
Zestaw ten jest w pełni zgodny
ze specyfikacją Ethernut I, ale nieco
lepiej wyposażony od wersji mini-
malnej: wprowadzono dodatkowe ele-
menty często używane w systemach
mikroprocesorowych – prostą klawia-
turę, diody LED, złącze dla wyświe-
tlacza alfanumerycznego LCD, 2 porty
szeregowe RS232, złącze konwertera
USB2RS232 oraz JTAG.
Do kompilacji projektów i biblio-
tek Nut/OS–a posłuży dobrze zna-
ne środowisko WinAVR oparte na
AVR–owej wersji kompilatora GCC.
Uruchomimy w ten sposób kompi-
lację źródeł systemu, trwającą, w za-
leżności od szybkości komputera, od
kilkunastu sekund do kilku minut.
Jeżeli wszystko przebiegnie bez zakłó-
ceń, na ekranie zobaczymy komunikat
o pomyślnej kompilacji Nut/OS-a.
c:\nutbuild> make install
Polecenie to przekopiuje skompi-
lowane przed chwilą biblioteki, pliki
nagłówkowe oraz narzędzie
crurom
do katalogu, w którym jest zainstalo-
wany kompilator AVR–GCC (WinAVR).
Biblioteki i nagłówki dla architektury
AVR znajdą się w folderze
kata-
log_winavr\NutOS\avr
. Poprawna
instalacja zostanie również zasygnali-
zowana odpowiednim komunikatem.
Po wykonaniu powyższych czynności,
katalog nutbuild możemy usunąć.
Kolejnym sposobem na zainstalo-
wanie Nut/OS-a jest wykorzystanie
graficznego konfiguratora dołączonego
do źródeł systemu. W tym celu insta-
lujemy wersję dla Windows i urucha-
miamy program
Nut/OS Configurator
.
Na ekranie pojawi się okno, w którym
należy wybrać plik konfiguracyjny
dla posiadanej przez nas platformy
sprzętowej – dla zastosowanego zesta-
wu jest to plik
ethernut13f.conf
w katalogu
katalog_instalacji\
nut\conf
. Następnie w menu
Edi-
t>Settings>Build>Platform
wybieramy
interesującą nas architekturę –
avr–gcc
i z menu
Build
wybieramy pozycję
Bu-
ild Nut/OS
. Jeśli wszystko przebiegnie
prawidłowo, w katalogu
nutbld\lib
znajdą się biblioteki systemu. Nieste-
ty, graficzne narzędzie konfiguracyjne
jest jeszcze niedopracowane, dlatego
często odmawia współpracy i działa
niestabilnie. Z tego powodu nie pole-
cam jego używania.
Ostatnią opisaną metodą, najtrud-
niejszą, jest ręczna kompilacja syste-
mu. W tym celu instalujemy window-
sową wersję źródeł, ponieważ zawiera
ona binarne narzędzia (crurom i nut-
configure). Uruchamiamy wiersz po-
leceń cmd i wchodzimy do katalogu,
w którym zainstalowaliśmy źródła. Za
pomocą programu
nutconfigure
two-
rzymy drzewo katalogów, w którym
będziemy kompilować system dla wy-
branej platformy sprzętowej:
nutconfigure –c ./nut/conf/
ethernut13f.conf –m avr–gcc create–
buildtree
W wyniku wykonania powyższego
polecenia powstanie katalog
nutbld
,
w którym znajdą się pliki
Makefile
oraz binaria dla wybranej konfigura-
cji. Parametr
–c
podaje plik konfigu-
racyjny dla platformy sprzętowej. Plik
Co to jest „stos”?
Często stosowane pojęcie „stosu” określa
warstwowy – jak widać na rysunku – model
sieciowej komunikacji aplikacji współpracujących
ze sobą zdalnie poprzez sieć informatyczną. Or-
ganizacja ISO opracowała 7–warstwowy
Model
Referencyjny Połączonych Systemów Otwartych
(model OSI), który obejmuje wszystkie elementy
niezbędne do zdalnej komunikacji. Przyjęto
podział według sekwencji zdarzeń zachodzących
podczas sesji komunikacyjnej. Warstwy od 1 do
3 zapewniają fizyczny ilogiczny dostęp do sie-
ci, a warstwy od 4 do 7 obsługują logistycznie
komunikację pomiędzy aplikacjami.
Kompilacja systemu
Mimo że biblioteki Nut/OS są
dostępne także w formie binarnej,
chciałbym na początku przedstawić
sposoby kompilacji systemu ze źródeł.
Zacznijmy więc od ściągnięcia kodu
źródłowego ze strony
www.ethernut.de
(publikujemy je także na CD–EP12/
2006B). Można pobrać zarówno wer-
sję dla Linuksa, jak i dla Windows.
Kompilację bibliotek systemu Ethernut
(co wymaga wcześniejszego zainstalo-
wania kompilatora AVR-GCC) możemy
przeprowadzić na trzy sposoby, opisu-
ję je poniżej.
Najpewniejszą metodą jest wyko-
rzystanie skryptów dołączonych do
opisanego zestawu ZL9AVR. Zawiera
je archiwum
nutbuild.zip
, znajdujące
się na płycie CD dołączonej do EPoL
lub na stronie
kamami.pl
. Archiwum
to rozpakowujemy do oddzielnego ka-
talogu na dysku, np.
c:\nutbuild
.
W tym samym katalogu umieszcza-
my archiwum ze źródłami systemu
w wersji „for Linux Environment”
– plik z rozszerzeniem
.bz2
, który za-
wiera sam kod źródłowy Nut/OS–a.
Nasz katalog powinien wyglądać na-
stępująco:
[dir] data
[file] Makefile
[file] ethernut–4.2.1.tar.bz2
Jeżeli wersja ściągniętych źródeł
Ethernuta jest inna niż 4.2.1 (naj-
nowsza stabilna), należy edytować
plik
Makefile
i zmienić zmienną
NUT_VERSION
na numer posiadanej
wersji. Następnie uruchamiamy inter-
preter poleceń (
cmd
), wchodzimy do
utworzonego przed chwilą katalogu
i wykonujemy polecenia:
c:\nutbuild> make
ethernut13f.conf
jest odpowiedni
dla płyty bazowej ZL9AVR. Parametr
–m
wskazuje kompilator C (avr–gcc
lub ImageCraft).
Następny krok to edycja pliku
nutbld/UserConf.mk
. Dopisujemy
do niego linię:
HWDEF+=–DNUT_CPU_FREQ=16000000
Jest to definicja częstotliwo-
ści oscylatora kwarcowego na płyt-
ce (16 MHz), potrzebna do oblicza-
nia wartości rejestrów sterujących
UART–em i timerami. Zapisujemy plik
Userconf.mk
i w katalogu
nutbld
wykonujemy polecenia:
make
make install
W ten sposób uruchomimy kom-
pilację systemu, która jeśli wszystko
wykonaliśmy zgodnie z instrukcją, po-
winna przebiec bezproblemowo. Jej
wynikiem będą pliki w katalogu
nut-
bld\lib
– biblioteki systemu Nut/OS.
Należy je jeszcze zainstalować, trzeba
więc wykonać kolejne czynności:
– w katalogu, w którym jest zainsta-
lowany WinAVR (najczęściej jest
to
c:\winavr
) tworzymy podka-
talogi
NutOS
i
NutOS\avr
,
– kopiujemy katalog
nutbld\lib
do
NutOS\avr
,
– kopiujemy katalog
nut\include
do
NutOS\avr
,
– kopiujemy plik
nut\tools\wi-
n32\crurom.exe
do jakiegokol-
wiek katalogu znajdującego się
w ścieżce systemowej PATH, np.
c:\winavr\bin
. Jest to narzę-
dzie do tworzenia systemu plików
90
Elektronika Praktyczna 12/2006
K U R S
UROM, który pozwala na przecho-
wywanie niewielkich plików w pa-
mięci Flash mikrokontrolera (np.
strony internetowej dla serwera
WWW).
Dokładnie te same operacje wy-
konuje opisany wcześniej skrypt
Nutbuild
, wyręczając nas we
„wklepywaniu” poleceń i modyfiko-
waniu plików konfiguracyjnych.
W taki sam sposób możemy za-
instalować gotowe biblioteki zawarte
w wersji dla Windows. Po skopio-
waniu plików, źródła systemu (o ile
nie będą nam potrzebne) możemy
odinstalować. Umieszczenie biblio-
tek w podanym podkatalogu drzewa
WinAVR jest konieczne do prawi-
dłowego działania plików
Makefi-
le
zastosowanych w przykładowych
aplikacjach.
Mamy już zainstalowane biblio-
teki systemu – pora zacząć pisać
programy.
–
io.h
, zawierający m.in. deklarację
funkcji
_ioctl()
.
Jak wspomniałem wcześniej, port
szeregowy wymaga inicjalizacji, nie
przez ustawienie określonych wartości
rejestrów sterujących UART–em, ale
za pomocą interfejsu udostępnianego
przez system operacyjny. Za rejestra-
cję i inicjalizację urządzeń w systemie
Nut/OS odpowiada funkcja:
int NutRegisterDevice(NUTDEVICE *
dev, uptr_t base, u_char irq);
Parametr
dev
jest wskaźnikiem
do struktury opisującej sterownik
urządzenia. Dla sterowników wbu-
dowanych w Nut/OS struktury te są
już zadeklarowane w plikach nagłów-
kowych, np.
DEV_DEBUG
odpowiada
zerowemu UART–owi w mikrokon-
trolerze ATmega128. Przez parametry
base
i
irq
możemy przekazać adres
bazowy rejestrów urządzenia i numer
przerwania – w tym przypadku nie są
one istotne. Jeżeli rejestracja urządze-
nia przebiegnie prawidłowo, funkcja
NutRegisterDevice
zwróci wartość
0, jeśli nie, wartość –1.
Następnym krokiem jest przekiero-
wanie standardowego wyjścia (
stdo-
ut
) do portu szeregowego. Odpowi-
ada za to funkcja:
FILE *freopen(CONST char *name,
CONST char *mode, FILE * stream);
Otwiera ona plik o nazwie
name
w trybie mode i (w przeciwieństwie
do popularnej funkcji
fopen
) usta-
lonym deskryptorze stream. W na-
szym przypadku jest to plik o nazwie
DEV_DEBUG_NAME
(uart0)
w trybie
do zapisu
(w)
i deskryptorze
stdo-
ut
(standardowe wyjście). Podobnie
jak w systemach uniksowych, w Nut/
OSie urządzenia są reprezentowane
przez pliki, dlatego zapis do pliku
o nazwie
uart0
spowoduje wysłanie
danych do zerowego portu szeregowe-
go. Jeżeli funkcja
freopen
wykona
się prawidłowo, zwróci wskaźnik do
podanego w parametrach deskryptora
pliku, w przeciwnym przypadku – pu-
sty wskaźnik
(NULL)
.
Kolejna linia kodu wywołuje funk-
fileno
ze struktury
FILE* stdo-
ut
),
cmd
– kod polecenia, czyli
UART_SETSPEED
,
buffer
– dane
dla polecenia, w naszym programie
wskaźnik do zmiennej z podaną
prędkością UARTa. Poprawne wy-
konanie funkcji jest sygnalizowane
zwróceniem wartości 0, niepopraw-
ne, ujemnej.
Po wywołaniu powyższych funkcji,
możemy wreszcie wypisać tekst: „Hel-
lo, world!”. Następnie każemy progra-
mowi czekać w nieskończonej pętli.
Kompilacja programu
Kompilacja aplikacji Nut/OS wy-
maga pewnych dodatkowych opcji
dla kompilatora C oraz podania
w odpowiedniej kolejności biblio-
tek systemu oraz specjalnego kodu
startowego (
nutinit.o
) przy linko-
waniu. Chcąc ułatwić pracę czytel-
nikom, przygotowałem gotowe pli-
ki sterujące kompilacją –
Makefile
i
Sources
. Plik
Makefile
zawie-
ra reguły sterujące wywoływaniem
AVR–GCC oraz opcje konieczne do
prawidłowej kompilacji programu
i zazwyczaj nie trzeba go modyfi-
kować. Zmian wymaga natomiast
plik
Sources
, który dla programu
podanego przed chwilą wygląda na-
stępująco:
OUTPUT = hello
SOURCES = hello.c
OPTIONS = –Os
LIBS = –lnutarch –lnutdev –lnutos
–lnutarch –lnutcrt
Definicja
OUTPUT
to nazwa pliku
wynikowego (bez rozszerzenia),
SO-
URCES
– wykaz plików źródłowych
rozdzielony spacjami,
OPTIONS
–
dodatkowe opcje kompilatora, w tym
przypadku – optymalizacja kodu
pod względem wielkości
(–Os)
.
LIBS
jest listą bibliotek dołączo-
nych do projektu. Projekt kompilu-
jemy wydając polecenie
make
. W je-
go wyniku powstaną pliki
hello.
hex
i
hello.bin
, którymi możemy
zaprogramować mikrokontroler.
Polecenie
make clean
usuwa
wszystkie pliki utworzone podczas
kompilacji, zaś
make isp
pro-
gramuje procesor z wykorzystaniem
programatora STK–200 (np. ZL2PRG)
i programu AVRdude standardowo
obecnego w środowisku WinAVR.
Za miesiąc opiszę dokładniej
pliki
Makefile
, funkcje poszczegól-
nych bibliotek systemu Nut/OS oraz
przedstawię prostą aplikację serwera
WWW. Zapraszam do lektury!
Tomasz Włostowski
twlostow@onet.eu
Na komputerze PC powyższy kod
wyświetli oczywiście tekst: „Hello,
world!”. Ponieważ nasz system nie
ma monitora, jako „wyświetlacz” za-
stosujemy terminal na komputerze
połączonym z płytką przez port szere-
gowy. Dlatego program musi być uzu-
pełniony o inicjalizację UART–a i prze-
kierowanie standardowego wyjścia na
port RS232. Poprawny kod jest nieco
większy i wygląda następująco:
#include <dev/board.h>
#include <stdio.h>
#include <io.h>
#define UART_SPEED 38400
main()
{
u_long baudrate = UART_SPEED;
NutRegisterDevice (&DEV_DEBUG,
0, 0);
freopen (DEV_DEBUG_NAME, "w",
stdout);
_ioctl(_fileno(stdout), UART_
SETSPEED, &baudrate);
printf("Hello, world!\n");
for(;;);
}
cję:
int _ioctl(int fd, int cmd, void
*buffer);
Służy ona do wykonywania nie-
standardowych operacji na urządze-
niach wejścia–wyjścia. W naszym
przypadku
_ioctl
odpowiada za
ustawienie prędkości przesyłania
danych przez port szeregowy. Para-
metr
fd
to numer deskryptora pli-
ku urządzenia (w naszym przypadku
uzyskaliśmy go za pomocą makra
Pierwsza zmiana polega na dołą-
czeniu dodatkowych plików nagłów-
kowych:
–
dev/board.h
, który zawiera de-
klaracje nazw urządzeń oraz spe-
cyficznych dla nich struktur ity-
pów danych,
Elektronika Praktyczna 12/2006
91
Pierwszy program
Stworzymy teraz najprostszą apli-
kację systemu Nut/OS, będącą odpo-
wiednikiem programu znajdującego
się na początku prawie wszystkich
książek o programowaniu w języku C:
#include <stdio.h>
main()
{
printf("Hello, world!\n");
return 0;
}
Plik z chomika:
jacek_040
Inne pliki z tego folderu:
Ethernet i AVR–y, cz.1.pdf
(532 KB)
Ethernet i AVR–y, cz.2.pdf
(886 KB)
Ethernet i AVR–y, cz.3.pdf
(509 KB)
Ethernet i AVR–y, cz.4.pdf
(988 KB)
Ethernet i AVR–y, cz.5.pdf
(814 KB)
Inne foldery tego chomika:
Alfanumeryczne wyświetlacze LCD (zxpro)
ARDUINO
arduino en
Arduino(1)
arduino(2)
Zgłoś jeśli
naruszono regulamin