Ethernet i AVR–y, cz.7.pdf
(
2032 KB
)
Pobierz
102-104_enut_cz7.indd
KURS
Ethernet i AVR–y
Ethernet od podstaw, część 7
Duża część systemów mikroprocesorowych musi mieć dostęp
do aktualnej daty i godziny. Niestety wiąże się to z okresowym
ustawianiem i korygowaniem wskazań zegara RTC. Jeśli połączymy
nasze urządzenie z Internetem, możemy zapomnieć o tej przykrej
konieczności. W ostatnim odcinku kursu zajmiemy się zatem
funkcjami związanymi z czasem w systemie Nut/OS.
Czas w systemie Nut/OS
Jednym z powodów stosowania
systemów operacyjnych na mikro-
kontrolerach jest uniezależnienie
(w pewnym stopniu) oprogramo-
wania od sprzętu. Oznacza to, że
niektóre peryferia programuje się
identycznie na wszystkich architek-
turach sprzętowych obsługiwanych
przez system. W Nut/OS przykła-
dem takiej niezależności są funk-
cje obsługujące zegar czasu rze-
czywistego. Ponadto są one zgodne
z ich „pecetowymi” odpowiednika-
mi znajdującymi się w standardo-
wej bibliotece języka C.
Zacznijmy od pobierania aktual-
nej daty i godziny – wykonuje się
to w następujący sposób:
rza czas jako liczbę 100–nanose-
kundowych cykli od początku roku
1601). Choć takie formaty wydają
się nieco dziwne, ułatwiają odmie-
rzanie zadanych odstępów czasu.
Druga linia kodu przekształca
wartość zwróconą przez funkcję
time()
na postać bardziej zro-
zumiałą dla człowieka – struktu-
rę _
tm
, której składowe opisane
są w ramce poniżej. Funkcja
lo-
caltime()
zwraca datę i godzinę
w lokalnej strefie czasowej. Ponie-
waż zegar przechowuje czas UTC,
konieczne jest ustawienie właści-
wej strefy czasowej. Do tego celu
służy zmienna globalna
_timezo-
ne,
zawierająca różnicę w sekun-
dach między lokalną strefą czaso-
wą a czasem uniwersalnym.
W Polsce jest to –1 godzina,
czyli –3600 sekund. Należy pamię-
tać o poprawnym zainicjowaniu
_
timezone
w swoim programie.
System Nut/OS obsługuje rów-
nież automatyczną zmianę czasu
letniego na zimowy i vice versa.
Sterują tym dwie kolejne zmienne
globalne:
_daylight
– zapisanie nieze-
rowej wartości powoduje włączenie
automatycznej zmiany czasu,
_dstbias
– różnica między
czasem letnim a zimowym w se-
kundach
D o m y ś l -
ne ustawie-
nia zmiennych
_daylight,
_dstbias
są
poprawne dla
obszaru Polski.
Odczytywanie bie-
żącego czasu mamy opanowane,
pora na ustawianie zegara
.
Polega
to na:
– przekształceniu czasu lokal-
nego ze struktury
czas_do_usta-
wienia
na czas w formacie POSIX
Time za pomocą funkcji
mkti-
me()
:
struct _tm czas_do_
ustawienia; // struktura
z czasem, który ma być
ustawiony
time_t t_sec =
mktime(&czas_do_ustawienia);
– ustawieniu zegara za pomocą
funkcji
stime()
stime(&t_sec);
time_t t_sec = time(NULL);
struct _tm czas = localtime(&t_sec);
Wywoływana w pierwszej linii
kodu funkcja
time()
zwraca aktu-
alny czas w postaci liczby sekund
od północy dnia 1 stycznia 1970
czasu uniwersalnego (UTC –
Uni-
versal Coordinated Time
). Taka
reprezentacja daty i godziny jest
standardem w systemach unikso-
wych (POSIX Time), a sam sposób
zapisu czasu w postaci liczby cykli,
które upłynęły od określonej daty
początkowej jest wykorzystywa-
ny w niemal wszystkich systemach
operacyjnych (np. Windows odmie-
Protokół SNTP
i synchronizacja zegarów
Na wstępie wspomniałem, że
jeśli połączymy nasze urządzenie
z Internetem, możemy zapomnieć
o ręcznym ustawianiu zegara. Jest
to możliwe dzięki protokołom sie-
ciowym NTP (
Network Time Pro-
tocol
) i jego uproszczonej wersji
SNTP (
Simple Network Time Pro-
tocol
), którego obsługa jest wbu-
dowana w system Nut/OS. Serwery
SNTP nasłuchują na porcie 123
protokołu UDP. Pobranie aktualnej
Format struktury
tm
przechowującej datę i godzinę:
struct _tm {
int _tm_sec; – sekundy (0…59)
int _tm_min; – minuty (0…59)
int _tm_hours; – godziny (0…23)
int _tm_mday; – dzień miesiąca (1…31)
int _tm_mon; – miesiąc (0 – styczeń, 11 – grudzień)
int _tm_year; – rok (aktualna wartość jest równa 1900 + tm_year)
int _tm_wday; – dzień tygodnia (0 – niedziela)
int _tm_yday; – dzień roku
int _tm_isdst; – wartość niezerowa oznacza czas letni
};
102
Elektronika Praktyczna 6/2007
KURS
List. 1. Najistotniejsze fragmenty kodu programu zegara wykorzystującego protokół SNTP (SNTPDemo)
int main(void)
{
initialize();
init_network();
// ustawienie strefy czasowej w sekundach (–1 godzina od czasu GMT)
_timezone = (–1) * 60L * 60L;
LCD_clear();
u_long addr = NutDnsGetHostByName(SNTP_SERVER_ADDR);
NutSNTPStartThread(addr, 300000); // aktualizujemy zegar co 5 minut
for(;;)
{
char LCD_line1[16], LCD_line2[16];
time_t t_sec = time(NULL);
struct _tm *t = localtime(&t_sec);
sprintf(LCD_line1, „Data: %02u.%02u.%u”, t–>tm_mday, t–>tm_mon + 1, 1900 + t–>tm_year);
sprintf(LCD_line2, „Czas: %02u:%02u:%02u”, t–>tm_hour, t–>tm_min, t–>tm_sec);
LCD_clear();
LCD_setpos(0);
LCD_putstring(LCD_line1);
LCD_setpos(40);
LCD_putstring(LCD_line2);
NutSleep(500);
}
}
List. 2. Zmodyfikowany serwer WWW obsługujący uwierzytelnianie użytkowników (fragmenty kodu przykładu HTTPServer-
Auth)
main()
{
initialize();
init_network();
(...)
NutRegisterAsp();
NutRegisterAspCallback(ASP_callback);
NutRegisterCgi(„ledlcd.cgi”, CGI_callback);
// zabezpieczamy haslem katalog cgi–bin zawierający skrypt sterujacy diodami LED i wyswietlaczem.
NutRegisterAuth(„cgi–bin”, „user:haslo”);
// oraz drugi katalog ‘tajne’ zawierajacy strone ze scisle tajnymi informacjami :)
NutRegisterAuth(„tajne”, „user2:haslo2”);
NutThreadCreate(„lcds”, lcd_scrolling, NULL, 256);
for(i=0;i<5;i++)
{
sprintf(str,”httpd%d”,i);
NutThreadCreate(str, httpd_thread, NULL, NUT_THREAD_MAINSTACK);
}
NutThreadSetPriority(254);
for(;;) NutSleep(10000);
}
daty i godziny polega na wysłaniu
pakietu z odpowiednim zapytaniem
i odebraniu odpowiedzi zawierają-
cej aktualny czas UTC. Maksymal-
ne odchylenie odebranego czasu od
wzorca zależy od opóźnienia trans-
misji pakietu przez sieć i zwykle
nie przekracza kilkuset milisekund.
Aby uruchomić synchronizację cza-
su w systemie Nut/OS, wystarczy
wywołać funkcję:
int NutSNTPStartThread(u_
long server_addr, u_long
interval);
Tworzy ona osobny wątek okre-
sowo korygujący ustawienia zegara
czasu rzeczywistego. Czas jest po-
bierany z serwera SNTP o adresie
server_addr
co
interval
milise-
kund.
Lista publicznych serwerów SNTP
znajduje się między innymi na stro-
nie
http://ntp.isc.org/bin/view/Servers/
WebHome
. Na
list. 1
przedstawio-
no kod prostej aplikacji zegara nie
wymagającego ręcznego ustawiania.
Data i godzina jest pokazywana na
wyświetlaczu alfanumerycznym 2x16
znaków. Program korzysta z serwera
tempus1.gum.gov.pl
znajdującego
się w Głównym Urzędzie Miar i syn-
chronizowanego zegarem atomowym.
ślonych katalogów strony interneto-
wej za pomocą hasła. Aby urucho-
mić mechanizm uwierzytelniania,
należy podczas inicjacji serwera
HTTP skorzystać z funkcji:
int NutRegisterAuth(CONST
char *dirname, CONST char
*login)
.
Parametr
dirname
to nazwa
zabezpieczonego katalogu,
lo-
gin
– nazwa użytkownika i hasło
rozdzielone dwukropkiem.
Hasła
są przesyłane przez przeglądarkę
do serwera w postaci jawnej i mo-
gą być podsłuchane. Serwer HTTP
wbudowany w Nut/OS nie obsluguje
polaczen szyfrowanych, dlatego nie
powinno się go stosować w aplika-
cjach wymagających wysokiego pozio-
mu bezpieczeństwa. Zmodyfikowany
Uzupełnienia
Jeden z Czytelników zwrócił
uwagę na pominięcie przeze mnie
jednej z ważnych funkcji ethernuto-
wego serwera HTTP – uwierzytel-
niania użytkowników. Pozwala ono
na zabezpieczenie dostępu do okre-
Elektronika Praktyczna 6/2007
103
KURS
kod serwera WWW z czwartej części
kursu, w którym zmiana stanu diod
LED i napisu na wyświetlaczu wyma-
ga uwierzytelnienia użytkownika (do-
myślnie – user:
user
, hasło:
haslo
)
znajduje się na
list. 2
.
ZL9AVR+ZL1ETH, powstała w 2002
roku. Wówczas w Polsce niepodziel-
nie królowały układy z rodziny
AVR. Od tego czasu minęło 5 lat
(w elektronice to cała epoka, albo
i dwie...). Dziś 32–bitowe mikrokon-
trolery z rdzeniami ARM są łatwo
dostępne i bardzo tanie, a ich moc
obliczeniowa pozwala na realizowa-
nie znacznie ciekawszych aplikacji
niż przedstawione w ramach ni-
niejszego kursu. Przykładami mogą
być obiornik internetowych sta-
cji radiowych oraz radiowęzeł lub
system monitoringu wykorzystujący
do transmisji danych sieć Ethernet.
Niektóre z nich już niebawem zoba-
czycie na łamach EP.
Życzę powodzenia w realizowa-
niu własnych aplikacji dla systemu
Nut/OS!
Tomasz Włostowski, EP
tomasz.wlostowski@ep.com.pl
Podsumowanie – co po AVR–
ach?
Pierwsza wersja oryginalnego
zestawu Ethernut, której odpowied-
nikiem jest nasz kursowy zestaw
Prenumerata e-wydania
Elektronikę Praktyczną możesz czytać na monitorze swego komputera
w postaci identycznej z wydaniem papierowym!
wbudowane linki
klikasz i jesteś na odpowiedniej stronie WWW
hipertekstowy spis treści i wyszukiwarka
od razu znajdziesz to, czego szukasz
wygodne archiwum
czyli poprzednie wydania pod ręką
multimedia
animacje, dźwięk, wideo
E-prenumeratę można zamawiać (na www.ep.com.pl/eprenumerata
lub www.avt.pl/eprenumerata) na 6, 12 lub 24 wydania w cenie odpowiednio:
6,20 zł, 5,70 zł i 5,20 zł za wydanie (patrz str. 141)
2x
gratis!
Prenumeratorzy
wydania papierowego otrzymują za darmo również e-prenumeratę
Jedno okazowe
e-wydanie
archiwalne można zamówić za darmo tytułem próby
Elektronika Praktyczna 6/2007
104
Plik z chomika:
XelosPL
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:
AVR_ASM
c_avr
java
kody
KURS C & C++
Zgłoś jeśli
naruszono regulamin