Systemy Czasu Rzeczywistego (SCR) Wykład 14: System operacyjny czasu rzeczywistego w praktyce - przykładowa platforma sprzętowo-programowa ZL9AVR + Nut/OS SKiTI2017 WYDZIAŁ ELEKTROTECHNIKI I AUTOMATYKI KATEDRA INŻYNIERII SYSTEMÓW STEROWANIA Kierunek: Automatyka i Robotyka Studia stacjonarne I stopnia: rok II, semestr IV dr inż. Tomasz Rutkowski 2017
ZL9AVR+ Nut/OS Platforma sprzętowa SCR 2017 2
Platforma sprzętowa SCR 2017 3
Platforma sprzętowa -baza Platforma sprzętowa składa się z następujących modułów firmy Kamami: ZL9AVR płyta bazowa z dodatkowym wyposażeniem: 4 przyciski i przycisk zerowania 8 diod LED Złącze wyświetlacza wietlacza alfanumerycznego LCD (2x16 znaków) 2 porty szeregowe RS232 (gniazda DB9F) Złącze konwertera USB2RS232 Złącze JTAG Przetwornik piezoelektryczny Złącza szpilkowe dla linii I/O mikrokontrolera Pamięć SRAM o pojemności 32kB SCR 2017 4
Platforma sprzętowa -baza Źródło: http://www.kamami.pl SCR 2017 5
Platforma sprzętowa -baza ZL7AVR moduł dipavr z mikrokontrolerem ATmega-128: pamięć programu: 128 kb, pamięć danych EEPROM: 4 kb, pamięć danych SRAM: 4 kb, częstotliwość taktowania: 16 MHz, złącze do programowania Kanda ISP, wbudowany generator sygnału zerującego, możliwość zastosowania zewnętrznego źródła napięcia referencyjnego dla przetwornika A/C, liczba linii I/O: 53. SCR 2017 6
Platforma sprzętowa -baza Źródło: http://www.kamami.pl SCR 2017 7
Platforma sprzętowa -baza ZL1ETH uniwersalny interfejs Ethernet: kontroler RTL8019AS, złącze RJ-45 (Ethernet 10Base-T), 3 diody LED (Link, Rx, Tx), nieulotna pamięć konfiguracji kontrolera (EEPROM), 8-bitowa magistrala danych. SCR 2017 8
Platforma sprzętowa -baza Źródło: http://www.kamami.pl SCR 2017 9
Wyświetlacz alfanumeryczny LCD (2x16 znaków) Moduł 16-przyciskowej klawiatury matrycowej 4 4 Moduł czytnika kart SD/MMC Platforma sprzętowa - elementy dodatkowe Moduł z graficznym wyświetlaczem LCD (od telefonu Nokia 3310) zegar RTC + 8kB pamięci EEPROM) Moduł z cyfrowym czujnikiem temperatury i termostatem z interfejsem I2C SCR 2017 10
Platforma sprzętowa - elementy dodatkowe Źródło: http://www.kamami.pl SCR 2017 11
ZL9AVR + Nut/OS Platforma programowa SCR 2017 12
Czym jest Nut/OS? Platforma programowa -Nut/OS Wielowątkowy system operacyjny czasu rzeczywistego (RTOS) Opracowany został przez niemiecką firmę Egnite Kod sytemu jest objęty liberalną licencją BSD (w aplikacjach komercyjnych należy jedynie zaznaczyć że wykorzystuje się system Ethernut) Kod sytemu jest napisany modularnie w języku C z nielicznymi wstawkami asemblerowymi Jest dostępny dla kilku platform sprzętowych Współpracuje obecnie z rodzinami mikrokontrolerów: Atmel AVR (Atmega103/Atmega-128), ARM (Atmel), Renesas H8/300H Składa się z bibliotek i odpowiedniego kodu startowego, dołączanych do programu użytkownika SCR 2017 13
Platforma programowa -Nut/OS Nut/OS udostępnia typowe mechanizmy wielozadaniowego OS: Wielowątkowość z podziałem czasu procesora, Zarządzanie pamięcią, dynamiczna alokacja RAMu Synchronizacja wątków (events) Obsługa systemów plików (UROM, FAT) Sterowniki podstawowych urządzeń (GPIO, SPI, I2C) Wysokopoziomowa obsługa przerwań Powyższe mechanizmy umożliwiają uruchomienie stosu TCP/IP (Nut/Net)!!! SCR 2017 14
Platforma programowa -Nut/OS Możliwości Nut/Net: obsługa protokołów TCP/IP: ARP, IP, TCP, UDP, ICMP, PPP (modem) obsługa popularnych kontrolerów Ethernet: RTL8019AS, CS8900, LAN91C111, DM9000, wbudowany serwer WWW o sporych możliwościach: skrypty CGI, dynamiczne generowanie zawartości stron autoryzacja użytkowników, konfiguracja interfejsu sieciowego z wykorzystaniem DHCP, interfejs programistyczny przypominający pecetowe sockety. SCR 2017 15
Podstawowe biblioteki Nut/OS: Platforma programowa -Nut/OS libnutarch.a funkcje specyficzne dla używanej platformy sprzętowej (np. przełączanie kontekstu mikrokontrolera) oraz sterowniki urządzeń przeznaczone wyłącznie dla konkretnej architektury (np. UART wbudowany w mikrokontroler, kontroler Ethernet RTL8019), libnutdev.a pozostałe sterowniki urządzeń, libnutfs.a funkcje obsługi systemów plików UROM i FAT, libnutcrt.a miniaturowa wersja standardowej biblioteki języka C, zawiera takie funkcje jak printf(), malloc(), fopen() itp. libnutos.a zarządzanie wątkami, obsługa komunikacji międzyprocesowej oraz funkcje dynamicznej alokacji pamięci, libnutnet.a stos TCP/IP, funkcje obsługi gniazd sieciowych SCR 2017 16
Kod startowy Nut/OS, nutinit.o: Platforma programowa -Nut/OS kod startowy systemu, uruchamiany po zerowaniu mikorkontrolera, jego główne zadania to: inicjalizacja układów peryferyjnych mikrokontrolera (m.in. zewnętrznej pamięci RAM), ustawienie stosu, uruchomienie zarządzania wątkami, po wykonaniu powyższych czynności, kod startowy skacze do funkcji main() programu użytkownika, SCR 2017 17
Platforma programowa -Nut/OS, WinAVRi AVR Studio Aby utworzyć w AVR Studio projekt wykorzystujący Nut/OS należy pamiętać by: Zainstalować na PC WinAVR i AVR Studio, Zainstalować na PC Nut/OS, przygotować biblioteki systemu na odpowiednią platformę sprzętową oraz umieścić je odpowiednio w strukturze katalogów WinAVR, Przygotować, odpowiednia edycja, plików sterujących kompilacją Makefile i Sources, Pliki Makefile i Sources umieścić w katalogu projektu AVR Studio, Projekt w AVR Studio kompilować z przygotowanym wcześniej plikiem Makefile (opcja Use external Makefile ). SCR 2017 18
Platforma programowa - Nut/OS, wątki W Nut/OS zaimplementowano: Priorytety wątków z zakresu od 0 do 254, przy czym 0 oznacza najwyższy a 254 najniższy priorytet: najwyższe priorytety (od 0 do 31) są zarezerwowane dal wątków systemu operacyjnego nowo utworzone wątki mają priorytet równy 64 Jądro systemu z wielowątkowością kooperatywną (bez wywłaszczania): jeśli pracujący w danej chwili wątek zwolni procesor, scheduler uruchomi wątek znajdujący się w stanie gotowości o najwyższym priorytecie, jeżeli żaden z wątków nie jest gotowy (oczekuje na zajście zdarzenia lub jest uśpiony) to system przełącza się na wątek jałowy idle o najniższym priorytecie SCR 2017 Przełączanie wątków w tej metodzie jest możliwe jedynie gdy obecnie wykonujący się wątek dobrowolnie zwolni procesor 19
Platforma programowa - Nut/OS, wątki W Nut/OS każdy z wątków może znajdować się w jednym z następujących stanów: TDS_RUNNING : obecnie pracujący wątek, TDS_SLEEP : wątek oczekujący na wystąpienie zdarzenia, zakończenie operacji wejścia wyjścia lub uśpiony na pewien czas (np.: przez funkcję NutSleep()), po zakończeniu okresu oczekiwania/uśpienia wątek przechodzi w stan TDS_READY, TDS_READY : wątek gotowy do wznowienia pracy, SCR 2017 20
Platforma programowa - Nut/OS, wątki (podstawowe funkcje) HANDLE NutThreadCreate(char *name, void (*fn) (void *), void *arg, size_t stacksize); Tworzy nowy wątek o nazwie name. Wątek zaczyna swoją pracę od wywołania funkcji fn z parametrem arg. Przez arg można przekazać funkcji fn dowolny wskaźnik jako argument (lub podać NULL). Wartość stacksize określa rozmiar stosu dla tworzonego wątku. Domyślna wartość to 768 bajtów (makrodefinicja NUT_THREAD_MAINSTACK). Nowo utworzony wątek ma priorytet 64. SCR 2017 21
Platforma programowa - Nut/OS, wątki (podstawowe funkcje) u_char NutThreadSetPriority(u_char level); Ustawia priorytet obecnie pracującego wątku na wartość level. Funkcja zwraca wartość priorytetu wątku przed zmianą. SCR 2017 22
void NutDelay(u_long ms); Platforma programowa - Nut/OS, wątki (podstawowe funkcje) Czeka dokładnie określoną liczbę ms milisekund. Bieżący wątek nie jest przełączany. Funkcję można stosować do precyzyjnych opóźnień. SCR 2017 23
Platforma programowa - Nut/OS, wątki Za pomocą następujących funkcji można uśpić wątek w Nut/OS: NutSleep(), NutThreadYield(), NutEventWait(), NutTcpConnect(), NutTcpAccept(), NutTcpReceive(), NutTcpSend(), lub inna funkcja blokująca operacje wejścia wyjścia na gnieździe sieciowym. SCR 2017 24
void NutSleep(u_long ms); Platforma programowa - Nut/OS, wątki (podstawowe funkcje) Przerywa działający wątek na czas, co najmniej równy liczbie ms milisekund i przełącza go zgodnie z algorytmem schedulera. Rzeczywisty czas, na jaki wątek zostanie uśpiony zależy od rozdzielczości timera systemowego (domyślnie 62,5 milisekundy). Funkcji NutSleep nie wolno używać do odmierzania precyzyjnych opóźnień!!! SCR 2017 25
void NutThreadYield(void); Platforma programowa - Nut/OS, wątki (podstawowe funkcje) Wywołanie tej funkcji powoduje natychmiastowe przełączenie bieżącego wątku zgodnie z algorytmem schedulera. SCR 2017 26
Platforma programowa - Nut/OS, zarządzanie pamięcią Nut/OS udostępnia standardowe funkcje języka C umożliwiające dynamiczną alokację pamięci: malloc free Do dyspozycji jest 32 kb pamięci RAM SCR 2017 27
Platforma programowa - Nut/OS, zarządzanie pamięcią (podstawowe funkcje) void *malloc(size_t), free(void *); Funkcje alokujące i zwalniające pamięć zgodne ze standardową biblioteką języka C. void *NutHeapAlloc(size_t), NutHeapFree(void *); Ethernutowe odpowiedniki funkcji malloc() i free(). size_t NutHeapAvailable(); Zwraca ilość dostępnej pamięci sterty w bajtach. SCR 2017 28
Przykłady: 1) interfejs UART0 2) podstawy wątków 3) prosty serwer WWW SCR 2017 29
Przykład 1: interfejs UART0 SCR 2017 30
Przykład 1 SCR 2017 31
Przykład 1 SCR 2017 32
Przykład 1 SCR 2017 33
Przykład 1 int NutRegisterDevice(NUTDEVICE * dev, uptr_t base, u_char irq); Funkcja ta odpowiada za rejestrację i inicjalizację urządzeń w systemie Nut/OS. Parametr dev jest wskaźnikiem do struktury opisującej sterownik urządzenia. Dla sterowników wbudowanych w Nut/OS struktury te są już zadeklarowane w plikach nagłówkowych, np. DEV_DEBUG odpowiada zerowemu UART owi w mikrokontrolerze ATmega128. Przez parametry base i irq możemy przekazać adres bazowy rejestrów urządzenia i numer przerwania. Jeżeli rejestracja urządzenia przebiegnie prawidłowo, funkcja zwróci wartość 0, jeśli nie, wartość 1. SCR 2017 34
Przykład 1 FILE *freopen(const char *name, CONST char *mode, FILE * stream); Funkcja ta odpowiada za przekierowanie standardowego wyjścia (stdout) do portu szeregowego. Funkcja otwiera plik o nazwie name w trybie mode i ustalonym deskryptorze stream. W kodzie z poprzedniego slajdu: plik o nazwie DEV_DEBUG_NAME (uart0) w trybie do zapisu (w) i deskryptorze stdout (standardowe wyjście). SCR 2017 35
Przykład 1 int _ioctl(int fd, int cmd, void *buffer); Funkcja jest wykorzystywana do wykonywania niestandardowych operacji na urządzeniach wejścia wyjścia. Funkcja _ioctl odpowiada za ustawienie prędkości przesyłania danych przez port szeregowy. Parametr fd to numer deskryptora pliku urządzenia, cmd to kod polecenia a buffer to dane dla polecenia. Poprawne wykonanie funkcji jest sygnalizowane zwróceniem wartości 0, niepoprawne, wartości ujemnej. SCR 2017 36
Przykład 2: podstawy wątków SCR 2017 37
Przykład 2 SCR 2017 38
Przykład 2 SCR 2017 39
Przykład 2 SCR 2017 40
Przykład 2 SCR 2017 41
Przykład 3: prosty serwer WWW SCR 2017 42
Przykład 3 SCR 2017 43
Przykład 3 SCR 2017 44
Przykład 3 SCR 2017 45
Przykład 3 SCR 2017 46
Przykład 3 SCR 2017 47
Przykład 3 SCR 2017 48
Bibliografia: [1] P.Szymczyk(2003). Systemy Operacyjne Czasu Rzeczywistego. Uczelniane Wydawnictwa Naukowo-Dydaktyczne, Kraków. [2] J.Ułasiewicz(2007). System czasu Rzeczywistego QNX6 Neutrino. Wydawnictwo BTC, Legionowo. [3] K.Lal, T.Rak, K.Orkisz(2003). RTLinux system czasu rzeczywistego. Helion, Gliwice. [4] http://www.kamami.pl [5] http://www.ethernut.de/en [6] Elektronika Praktyczna 2006-2007 SCR 2017 49
Dziękuję za uwagę!!! SCR 2017 50