Piotr Nikiel – Wbudowane systemy operacyjne w sterowaniu

advertisement
Piotr Nikiel1 – V rok
Koło Naukowe Informatyków
prof. dr hab. inż. Piotr Malecki, dr inż. Tomasz Gąciarz - opiekunowie naukowi
OPERATING SYSTEMS IN CONTROL OF MODELS AND ROBOTS
SYSTEMY OPERACYJNE W STEROWANIU MODELI I ROBOTÓW
Keywords: embedded operating system, realtime operating system, robotic control,
microcontrollers
Słowa kluczowe: wbudowane systemy operacyjne, systemy operacyjne czasu rzeczywistego,
sterowanie robotami, mikrokontrolery
The paper presents an operating system approach to microcontroller software
development. The operating system was developed by author of the paper, and is closely
related to author’s thesis: “A design of realtime operating system and its implementation on
a chosen microcontroller” (advisor: prof. Piotr Malecki). Special attention is paid to
advantages and disadvantages of the approach and to characteristics of the operating
system. An illustration to the approach is given by presenting a mechatronic system - a
flying model - whose software is based on the operating system.
1. Wprowadzenie
Mikrokontrolery
są
najbardziej
rozpowszechnionym
owocem
techniki
mikroprocesorowej. Przeważnie stosuje się je w układach sterowania, ale spotyka się także
inne zastosowania jak np. tzw. “tłumaczenie interfejsów”, obsługa czujników czy prosty
sposób realizacji (przeważnie nieskomplikowanych) systemów cyfrowych. O ile stworzenie
programu sterującego jedną czynnością, z niewielką ilością badanych wejść systemu jest na
ogół proste, o tyle budowa bardziej zaawansowanych systemów stawia programistę przed
coraz większymi trudnościami. W szczególności wraz ze wzrostem liczby procesów, które
muszą działać współbieżnie, znacząco wztasta poziom trudności realizacji oprogramowania.
Oprócz tego nieuniknione stają się trudności w zapewnieniu wymagań czasowych systemu
czy problemy wynikające ze współdzielenia pewnych elementów mikrokontrolera przez
różne procesy. System operacyjny wprowadza pewną warstwę abstrakcji i znacząco
upraszcza oprogramowanie.
Za tą argumentacją dodatkowo przemawia fakt, że współczesne rodziny
mikrokontrolerów są często wyposażone w wyjątkowo bogate i liczne układy peryferyjne.
Na przykład układ ATmega2561 firmy Atmel, będący jednym z największych
mikrokontrolerów
rodziny
AVR,
posiada:
6
rozbudowanych
układów
liczników/czasomierzy, 10 kanałów wyjścia cyfrowego PWM, ośmiokanałowy przetwornik
analogowo-cyfrowy, dwa porty szeregowe, magistralę SPI, magistralę I2C, układ
watchdoga, komparator analogowy, system przerwań zewnętrznych i 54 programowalne
linie wejścia-wyjścia cyfrowego. Oprogramowanie umożliwiające wydajne i równoległe
w czasie wykorzystanie choćby większości z wymienionych układów peryferyjnych jest
wyjątkowo trudne w realizacji.
Podejmując decyzję o zastosowaniu systemu operacyjnego należy również mieć
świadomość o wadach takiego podejścia. Na przykład praktycznie pewne jest, że
w przypadku systemu z jednym procesem wydajność obliczeniowa będzie niższa, niż bez
1
Adres e-mail autora: [email protected] lub [email protected]
zastosowania systemu operacyjnego. Ponadto trudno podać jakikolwiek zysk, który mógłby
zostać osiągnięty przy jednym procesie wraz z zastosowaniem tego rodzaju
oprogramowania.
Do znanych i ogólnie dostępnych systemów operacyjnych o profilu wbudowanym
należą m.in. uC/OS-II, FreeRTOS czy eCos. Ponadto istnieje wiele tego typu systemów,
które wymagają bardzo słonych opłat licencyjnych. W zamian otrzymuje się produkt
certyfikowany i dokładnie przetestowany, nadający się do zastosowań o najwyższych
wymaganiach niezawodności.
Wymienione systemy są dostępne w wersjach na różne rdzenie mikrokontrolerów
i mikroprocesorów. Łatwo można dostrzec szczególnie wysoką popularność wersji (czy też
tzw. “portów”) dla układów z rdzeniem ARM. Wynika to niewątpliwie z wyjątkowo
wysokiej wydajności obliczeniowej charakteryzującej ten rodzaj rdzenia.
Opisywany w tym referacie system operacyjny, będący dziełem autora referatu, jest
dostępny dla układów z rdzeniem AVR. Został przetestowany na układach ATmega16,
ATmega32, ATmega128 i ATmega2561.
2. Wbudowany system operacyjny
2.1. Ogólna charakterystyka wbudowanych systemów operacyjnych
Ze względu na potrzebę realizowania wielu czynności współbieżnie, wygodnie jest
oddzielić logicznie oprogramowanie tych czynności od siebie. Każdą taką niezależną
jednostkę nazywa się wtedy zadaniem lub procesem (pojęcia te są używane zamiennie).
Wielozadaniowy system operacyjny dostarcza podstaw do wygodnego sterowania pewną
liczbą zadań, włączając w to funkcjonalność wzajemnej synchronizacji i współpracy zadań.
Do sterowania procesami fizycznymi potrzebne jest oprogramowanie przewidywalne
w dziedzinie czasu i umożliwiające różne formy synchronizacji z czasem rzeczywistym.
W szczególności należy oczekiwać, że system operacyjny zapewni funkcje okresowego
wykonywania pewnych czynności oraz odmierzania odcinków czasu z wystarczającą
dokładnością.
Kluczową rolę w takim systemie operacyjnym pełni program szeregujący, częściej
nazywany schedulerem. Program szeregujący jest odpowiedzialny za wybór zadania, które
procesor otrzyma do wykonania i podejmuje ten wybór w zależności od różnych czynników
lub kryteriów. Istnieje wiele typowych strategii szeregowania, od najprostszych: FCFS
(ang. First Come, First Served - obsługuj zdarzenia w kolejności ich napływu) czy EDF
(ang. Earliest Deadline First - najpierw obsłuż zdarzenie z najkrótszym czasem
krytycznym) przez szeregowanie oparte na priorytetach, po bardzo skomplikowane
algorytmy biorące wiele różnych kryteriów pod uwagę. Różne strategie szeregowania zadań
będą skutkowały różnymi osiągami, np. średnim czasem oczekiwania na obsługę zdarzenia
czy wręcz możliwością (lub brakiem możliwości) nazwania oprogramowania systemem
czasu rzeczywistego.
System operacyjny powinien udostępniać pewien zestaw standardowych funkcji
i mechanizmów oraz interfejs programowania (ang. API - application programming
interface), który precyzyjnie określa sposób korzystania z nich. Do typowych mechanizmów
i podsystemów oferowanych przez system operacyjny zalicza się: zarządzanie pamięcią,
system plików, stos protokołów sieciowych, podsystem dostępu do niskich warstw sprzętu,
komunikację i synchronizację zadań (ang. IPC - interprocess communication), rozszerzenia
czasu rzeczywistego itp.
2.2. Szczegółowa charakterystyka zastosowanego systemu operacyjnego
Zastosowany system operacyjny został stworzony dla “większych” mikrokontrolerów
rodziny AVR (tj. na przykład serii ATmega). System można scharakteryzować następująco:
wielozadaniowy,
z zadaniami
definiowanymi
jako
funkcje
• system
języka C (podobnie do definiowania wątków w bibliotece pthread znanej z systemów
Unix). Jest możliwe tworzenia nowych zadań w trakcie pracy systemu (maksymalna
liczba zadań jest określona stałą kompilacji).
• system z mocnym szeregowaniem priorytetowym (dla danego priorytetu może być
przypisane tylko jedno zadanie) oraz z możliwością dynamicznej zmiany priorytetów.
• dostępny podsystem czasomierzy, umożliwiający realizację okresowych
i jednorazowych zdarzeń czasowych bez potrzeby tzw. aktywnego czekania (ang. busy
wait), tzn. zadanie czekające na zdarzenie czasowe przekazuje procesor innemu, mniej
uprzywilejowanemu zadaniu. System czasomierzy wymaga jednego z dostępnych
czasomierzy mikrokontrolera, w zamian oferując współbieżną realizację kilkunastu
zdarzeń czasowych.
• dostępne mechanizmy IPC: semafory binarne i przesyłanie wiadomości (oczekiwanie
na semafor lub na wiadomość nie wymaga aktywnego czekania)
• dostępne kolejki FIFO (które wykorzystywane są m.in. w strumieniu wyjściowym
portu szeregowego)
• dostępna prosta warstwa sieciowa, koncepcyjnie zbliżona do transmisji danych przez
protokół UDP/IP. Oprogramowanie warstwy posiada sterownik jednego z powszechnie
dostępnych układów transmisji bezprzewodowej.
• dostępne logowanie zdarzeń z interfejsem wyjściowym do specjalizowanego
urządzenia pełniącego funkcję “czarnej skrzynki”. Możliwe jest zlecenie jądru systemu
śledzenie i zapis przełączeń kontekstu, operacji na semaforach czy też jakichkolwiek
innych informacji potrzebnych do zalogowania razem z czasem ich wystąpienia.
• dostępne mechanizmy zabezpieczeń, np. system “ramcheck” śledzący ewentualne
przepełnienia buforów lub mogący wykryć błędy zewnętrznej szyny pamięci RAM.
• konfigurowalność (modularność): można wybrać tylko te elementy jądra systemu,
które istotnie są programiści potrzebne (w najprostszej wersji można pozostać przy
programie szeregującym bez podsystemów czasomierzy, semaforów, kolejek FIFO itp.).
• czas przełączenia zadań: ok. 30 µs przy zegarze systemowym 8 MHz (układy AVR są
dostępne z zegarami do 20 MHz - czas ten będzie odwrotnie proporcjonalny do
częstotliwości zegara, czyli przy 20 MHz będzie wynosił 12 µs).
• wykorzystanie pamięci RAM: system wymaga średnio 15 bajtów pamięci RAM na
struktury systemowe każdego zadania oraz pewną ilość pamięci na jego stos (przy
mniejszych zadaniach orientacyjnie może być to ok. 60 - 80 bajtów pamięci, zaś zadania
z duża ilością zmiennych lokalnych i wywołań procedur mogą wymagać nawet 200 lub
więcej bajtów). Do tej ilości pamięci należy doliczyć pewną ilość stałą dla systemu (np.
na bufor portu UART, itp.) która zależy od konfiguracji systemu. Dla odniesienia warto
podać, że mikrokontroler ATmega128 - jeden z największych w rodzinie AVR - posiada
4 kB pamięci RAM (można sprzętowo rozszerzyć pamięć RAM do 64 kB, ale z wielu
powodów nie zawsze będzie to zalecane).
Z systemem operacyjnym dostarczony jest skrypt do utworzenia obrazu pamięci
programu mikrokontrolera. Skrypt ten kompiluje źródła jądra systemu oraz źródła
programów użytkownika (w których zdefiniowane są zadania) i przygotowuje plik gotowy
do zaprogramowania pamięci Flash procesora.
3. Przykładowy system mechatroniczny i jego oprogramowanie
3.1. Część mechaniczna i elektroniczna
Prezentowany system można skrótowo określić “skomputeryzowanym modelem
latającym pionowego startu o napędzie elektrycznym czterosilnikowym”. Pierwotna
koncepcja konstrukcji takiego modelu została wymyślona przez autora niniejszej pracy
w 2005 roku. Po zapoznaniu się z różnymi dokonaniami miłośników modelarstwa
lotniczego okazało się, że taki rodzaj modelu - mimo, że stosunkowo mało popularny - jest
stosowany i najczęściej określa się go literą X (np. w języku angielskim: “RC X” - remote
controlled X).
Model posiada cztery silniki, których osie umieszczone są pionowo w normalnym
(roboczym) położeniu i zakończone śmigłami. Silniki są mocowane do konstrukcji na
czterech krawędziach krzyża greckiego, symetrycznie - stąd pochodzi symbol konstrukcji
X. Silniki naprzeciwległe obracają się w przeciwnych kierunkach, aby zneutralizować
wypadkowy moment obrotowy odczuwany przez konstrukcję modelu (brak zrównoważenia
spowodowałby obrót wokół własnej osi symetrii). Śmigła na przeciwległych silnikach są
przeciwskrętne (tj. prawoskrętne i lewoskrętne) - dzięki temu, mimo przeciwnych
kierunków obrotu, wszystkie 4 silniki generują użyteczny ciąg o zwrocie przeciwnym do
siły ciążenia.
Rysunek modelu w widoku “od góry” znajduje się na rys. 1. Na płycie CD załączonej
do opracowania znajdują się kolorowe zdjęcia opisywanego modelu.
Silniki zamontowane w modelu to silniki modelarskie firmy Graupner, typ Speed 400.
Są to silniki szczotkowe prądu stałego, nominalnie 7,2 V. Każdy silnik może pobierać
znaczny prąd, ponad 10 A. Pod komputerem pokładowym (zaznaczonym na rysunku)
znajduje się płytka mocy z sterownikami tych silników zrealizowanymi z użyciem
tranzystorów MOSFET.
Za zasilanie modelu odpowiada akumulator w technologii litowo-polimerowej. Posiada
on nominalne napięcie 7,4 V, pojemność 2100 mAh oraz dopuszczalny ciągły prąd
rozładowania 63 A. Energia akumulatora, oprócz zasilania silników, jest przetwarzana
impulsowo na napięcie 5 V (do zasilania komputera), 4 V (do zasilania oświetlenia) i 12 V
(do wielu zastosowań). Ponadto na płytce mocy znajduje się przetwornik A/C monitorujący
napięcie akumulatora.
Komputer pokładowy jest oparty na mikrokontrolerze ATmega2561. Mikrokontroler
jest połączony z następującymi obwodami i układami:
• 2 czujnikami przyspieszenia typu MXR7202 (przez 4 kanały przetwornika A/C)
• magistralą 1-wire (na której znajduje się przetwornik A/C mierzący napięcie
akumulatora)
• sterownikiem silników, za pomocą wyjść cyfrowych PWM
• portem szeregowym RS-232
• modemem bezprzewodowym (moduł RXQ21 firmy Telecontrolli) za pomocą
drugiego portu szeregowego i linii pomocniczych
• interfejsem “czarnej skrzynki”
• szeregiem wyjść cyfrowych załączających oświetlenie lub “klakson”
• interfejsem programowania
• magistralą I2C (na której znajduje się sensor temperatury)
Rysunek 1. Model widziany z góry. Miejsca oznaczone cyframi: 1- listwy z włókna węglowego
o przekroju 2x12 mm, 2- komputer pokładowy, pod nim znajdują się (niewidoczne na rysunku): płytka
mocy (ze sterownikiem silników) oraz akumulator, 3- rurki aluminiowe (pomocnicze), 4- silniki (pod
płaszczyzną rysunku) wraz ze śmigłami (nad płaszczyzną).
3.1. Oprogramowanie
W systemie działa równolegle kilka procesów (zrealizowanych jako zadania systemu
operacyjnego). W kolejności od najbardziej istotnego są to:
• fcontrold - odpowiada za analizę położenia robota i wyliczanie trajektorii ruchu oraz
wysyłanie stosownych przebiegów do sterownika silników. Odbiera od operatora
polecenia ruchu modelu (wznieś się, leć na wprost, itp.)
• adc - dokonuje pomiarów różnych wielkości za pomocą przetwornika A/C. Do
szczególnie istotnych mierzonych wielkości należą pomiary czujników przyspieszenia,
które są podstawowym żródłem informacji o ruchu i połoźeniu modelu.
• net - jest serwerem usług sieciowych, odpowiada za komunikację bezprzewodową
• fstatd - wysyła informacje o bieżącym położeniu, wychyleniu itp. przez interfejs
sieciowy do komputera operatora robota
• powerd - mierzy napięcie akumulatora oraz wygenerowane impulsowo napięcia,
w razie wyczerpania baterii wyłącza robota, a także odsyła pomiary do operatora
• scontrold - odbiera od operatora niekrytyczne polecenia nt. oświetlenia robota
itp. i realizuje je
• sstatd - wysyła niekrytyczne informacje (stan różnych elementów robota) do
operatora
• lights - steruje oświetleniem robota generując interesujące efekty wizualne
• ramcheck - nadzoruje pamięć RAM, ewentualne nadpisania buforów, itp.
• idle, init - są procesami systemowymi o znaczeniu podobnym do systemu Unix
Od strony funkcjonalnej oprogramowanie działa bardzo dobrze, wszystkie zastosowane
mechanizmy systemu operacyjnego funkcjonują zgodnie z oczekiwaniami. Nie mniej można
było zauważyć okresowe błędy transmisji magistralą 1-wire, której przebiegi realizowane
są programowo, z poziomu jednego z zadań w systemie (mikrokontrolery AVR nie
posiadają peryferyjnego układu magistrali 1-wire). Analiza przypadku prowadzi do
orzeczenia, że opóźnienie realizowane w jednym z zadań jest za krótkie jak na wybraną
częstotliwość zegara mikrokontrolera (potrzebne jest opóźnienie rzędu 60 - 90 µs, podczas
gdy czas przełączenia zadania wynosi około 30 µs, przy wybranej częstotliwości zegarowej
8 MHz).
Do sprawnego sterowania robota zostało utworzone oprogramowanie dla komputera
stacjonarnego lub przenośnego pozwalające na odbiór informacji wysyłanych przez
komputer pokładowy oraz wysyłanie komend do komputera pokładowego.
4. Wnioski
Zastosowanie
systemu
operacyjnego
pozwoliło
stworzyć
bardzo
przejrzyste i przewidywalne oprogramowanie, charakteryzujące się łatwością rozbudowy,
przy dużej równoległości kilku procesów i niełatwych wymaganiach. Rozbudowa
oprogramowania mikrokontrolerów jest najczęściej trudna, zwłaszcza przy wykorzystaniu
dużej ilości powiązanych ze sobą układów peryferyjnych.
Wysiłek włożony w projekt i implementację systemu operacyjnego jest wartościowy,
ponieważ takie oprogramowanie można wykorzystać w wielu różnych projektach
oprogramowania, tworząc od początku jedynie nowe, stosowne do potrzeb, zadania systemu
operacyjnego.
Download