mikrokontrolerze ATmega128 firmy Atmel, z wykorzystaniem narzędzi GNU.

Podobne dokumenty
Systemy wbudowane. Wykład 4: Systemy operacyjne dla systemów wbudowanych. Obsługa przez przerwania. Z wywłaszczaniem zadań:

Programowanie mikrokontrolerów AVR

Technika mikroprocesorowa. Systemy operacyjne czasu rzeczywistego

PMiK Programowanie Mikrokontrolera 8051

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Programowanie w języku C++ Grażyna Koba

1 Podstawy c++ w pigułce.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Technika mikroprocesorowa. Struktura programu użytkownika w systemie mikroprocesorowym

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

LabVIEW PLATFORMA EDUKACYJNA Lekcja 5 LabVIEW i Arduino konfiguracja środowiska i pierwszy program

Metody obsługi zdarzeń

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Przerwania, polling, timery - wykład 9

Instytut Teleinformatyki

Prezentacja systemu RTLinux

Szkolenia specjalistyczne

Język C. Wykład 9: Mikrokontrolery cz.2. Łukasz Gaweł Chemia C pokój 307

Electronic Infosystems

2. Architektura mikrokontrolerów PIC16F8x... 13

Dokumentacja fillup - MS SQL

1 Podstawy c++ w pigułce.

1 Zapoznanie się ze środowiskiem Xenomai.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

1.1 Co to jest USBasp? Parametry techniczne Obsługiwane procesory Zawartość zestawu... 4

Wstęp do Programowania, laboratorium 02

Materiały dodatkowe. Simulink Real-Time

Konfiguracja pakietu CrossStudio for MSP

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

SYSTEMY CZASU RZECZYWISTEGO (SCR)

Szkoła programisty PLC : sterowniki przemysłowe / Gilewski Tomasz. Gliwice, cop Spis treści

Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil

4. Procesy pojęcia podstawowe

3. Sieć PLAN. 3.1 Adresowanie płyt głównych regulatora pco

Dokument opisuje sposób postępowania prowadzący do wysłania deklaracji VAT, PIT lub CIT drogą elektroniczną za pomocą funkcji systemu ADA modułu FK.

Algorytm. a programowanie -

NPS-520. Serwer druku do urządzeń wielofukcyjnych. Skrócona instrukcja obsługi. Wersja 1.00 Edycja 1 11/2006

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Narzędzia uruchomieniowe dla systemów Embedded firmy Total Phase

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Modułowy programowalny przekaźnik czasowy firmy Aniro.

Przykładowe sprawozdanie. Jan Pustelnik

Projektowanie oprogramowania systemów PROCESY I ZARZĄDZANIE PROCESAMI

1.Wstęp. 2.Generowanie systemu w EDK

BF20 JTAG dla ARM ów z interfejsem USB Instrukcja obsługi

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Instytut Teleinformatyki

Systemy wbudowane. Wprowadzenie. Struktura. Mikrokontrolery AVR. Wprowadzenie do programowania w C

High Speed USB 2.0 Development Board

LITEcompLPC1114. Zestaw ewaluacyjny z mikrokontrolerem LPC1114 (Cortex-M0) Sponsorzy:

Wykład 3: Implementacja programów wbudowanych

Mechanizmy pracy równoległej. Jarosław Kuchta

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

dokument DOK wersja 1.0

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

1. Tworzenie nowego projektu.

1. Instalacja platformy.net Framework.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

o Instalacja środowiska programistycznego (18) o Blink (18) o Zasilanie (21) o Złącza zasilania (22) o Wejścia analogowe (22) o Złącza cyfrowe (22)

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Systemy wbudowane. Systemy operacyjne czasu rzeczywistego

Instrukcja laboratoryjna cz.0

Politechnika Śląska w Gliwicach

MIKROKONTROLERY I MIKROPROCESORY

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

LOW ENERGY TIMER, BURTC

1 second UPS. Poziom trudności: łatwy. Wersja dokumentacji: 1.3. Aktualizacja: Beckhoff Automation Sp. z o. o.

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Praktyka Programowania

GNU GProf i GCov. przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A Białystok

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Instrukcja instalacji i obsługi modemu ED77 pod systemem operacyjnym Windows 98 SE (wydanie drugie)

Schemat blokowy architektury AVR

Wydział Elektryczny. Katedra Telekomunikacji i Aparatury Elektronicznej. Konstrukcje i Technologie w Aparaturze Elektronicznej.

Programowanie w języku Python. Grażyna Koba

Wstęp. do języka C na procesor (kompilator RC51)

Podstawowe zagadnienia

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

JAZZ OPLC JZ20-R10 i JZ20-R16

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

1 Moduł Modbus ASCII/RTU 3

Programowanie w języku C++

1. Opis aplikacji. 2. Przeprowadzanie pomiarów. 3. Tworzenie sprawozdania

Programowanie Proceduralne

Site Installer v2.4.xx

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

Transkrypt:

System operacyjny µc/os II na platformie VR Rys. 1. Warstwy oprogramowania w systemie µc/os II µc/os (Micro-Controller Operating System) to system operacyjny czasu rzeczywistego, napisany w języku NSI C i przeznaczony głownie dla aplikacji wbudowanych (ang. embedded systems). Druga odsłona tego systemu, czyli µc/os-ii należy od lat do kanonu najlepiej udokumentowanych systemów tego typu, dlatego polecana jest szczególnie dla osób stawiających pierwsze kroki w programowaniu wielowątkowym. Nie oznacza to natomiast, że jest to system o małych możliwościach. Jego komercyjna wersja jest standardem w wielu profesjonalnych zastosowaniach, a liczba procesorów i mikrokontrolerów, dla których został on przystosowany jest imponująca i stale rośnie (obecnie ponad 40 rodzin). Dzieje systemu mc/os II rozpoczęły się ponad 15 lat temu, kiedy to jego autor Jean J. Labrosse, sfrustrowany działaniem dostępnych w owym czasie systemów operacyjnych czasu rzeczywistego (ang. RTOS Real Time Operating Systems) postanowił napisać swój własny. I nie byłoby w tym może nic specjalnego, gdyby nie to, że zdecydował się opublikować swój kod razem z obszerną dokumentacją, w postaci książki [1], opisującej nie tylko jego system, ale także generalne mechanizmy oprogramowania tego typu. Szybko okazało się, że jest to jeden z najlepiej zaprojektowanych systemów na rynku. Jego ewolucja poszła w kierunku zwiększenia stabilności działania, bardziej niż dodawania nowych fajerwerków. To co wyróżnia go do dziś na tle konkurencji to naprawdę małe zużycie zasobów (moc obliczeniowa, pamięć), świetna dokumentacja oraz silnie deterministyczne działanie. Dzięki temu może być stosowany w aplikacjach wymagających bezkompromisowej pewności działania (ang. Safety Critical Systems), takich jak układy awioniki czy urządzenia medyczne. mc/os II został przystosowany do pracy z kilkudziesięcioma różnymi rodzinami procesorów i mikrokontrolerów, obejmującymi jednostki 8, 16 i 32 bitowe. W artykule pokażemy sposób implementacji systemu na 8 bitowym mikrokontrolerze Tmega128 firmy tmel, z wykorzystaniem narzędzi GNU. Po co nam RTOS? Zastosowanie systemu operacyjnego okupione jest zużyciem zasobów pamięci kodu i pamięci operacyjnej, a także pewnej mocy obliczeniowej (ok. 2 do 5% czasu CPU). Co otrzymujemy w zamian? Przede wszystkim łatwiejszą kontrolę nad tym co się dzieje w aplikacji (dotyczy to szczególnie zależności czasowych) oraz prostsze dodawanie nowej funkcjonalności. Dzięki zastosowaniu RTOS m o ż e m y p o d z i e l i ć aplikację na wątki (zadania), które będą wykonywane niezależnie, w kolejności zgodnej z przyznanym im priorytetem. System zadba o to, aby mikrokontroler w odpowiednich chwilach czasowych przełączał się z wykonywania jednego zadania na drugie. Oznacza to, że możemy pisać kod danego wątku tak, jakby tylko on miał się wykonywać. Więcej informacji na ten temat można znaleźć w literaturze [1 3]. rchitektura oprogramowania wykorzystującego uc/os II Portowanie oprogramowania (nie tylko systemu operacyjnego) na daną platformę sprzętową polega najczęściej na zaimplementowaniu pewnych specyficznych funkcji, działających w najniższej najbliższej sprzętowi warstwie oprogramowania (rys. 1). mc/os II definiuje cały zestaw takich funkcji, przy czym nie wszystkie muszą być wykorzystywane. Pliki portu implementują specyficzne funkcje, zdefiniowane przez system mc/os II, ale zależne od platformy sprzętowej. Jest to przede wszystkim obsługa stosu, zapis i odtwarzanie stanu rejestrów CPU, zarządzanie obsługą przerwań, w tym przerwania systemowego. Warstwa systemu zawiera implementację mechanizmów szeregowania zadań i różnych wariantów komunikacji międzywątkowej, alokacji pamięci, obsługi czasu systemowego itp. Najwyższą warstwą jest aplikacja użytkownika, obejmująca już konkretne zadania uruchamiane w systemie, które zapewniają wymaganą funkcjonalność. 64

PROGRMY R E K OS_FLGS; Co będzie nam potrzebne do rozpoczęcia pracy z µc/os II Przede wszystkim musimy zaopatrzyć się w kod źródłowy mc/ OS II oraz ściągnąć pliki portu do R E Tmega128 ze strony producenta (www.micrium.com). Skorzystamy z portu dla mikrokontrolerów VR i kompilatora GNU V3.xx. Będziemy więc potrzebować narzędzi do kompilacji i linkowania programów, a także samej edycji kodu idealnie tę rolę spełnia dostępny darmowo pakiet WinVR (http://sourceforge.net/projects/winavr/). Goto- List. 1. #ifndef SSEMBLER typedef INT16U #endif // SSEMBLER L K L M wy program trzeba będzie także skopiować do pamięci Flash mikrokontrolera wykorzystując jeden z dostępnych programatorów wraz z oprogramowaniem (np. darmowym VR Studio). Uruchomienie pierwszego programu wykorzystującego mc/os II może okazać się skomplikowane, dlatego warto wcześniej upewnić M 65

List. 2. void Task1(void *pdata) DDRB = 0x01; while(1) PORTB ^= 0x01; /* Task1 */ List. 3. void Task2(void *pdata) while(1) PORTB ^= 0x02; /* Task2 */ OSTimeDly(120); OSTimeDly(60); się, że zarówno kompilator C, jak i programator działają prawidłowo. Kompilujemy i uruchamiamy w tym celu najprostszy program zmieniający stan na wyjściu portu, przez co zawężamy obszar poszukiwania ewentualnych błędów mogących powstać w późniejszym etapie. Kody źródłowe wszystkich opisywanych w dalszej części programów oraz inne pożyteczne informacje można znaleźć na stronie http://home.agh.edu.pl/~lkrzak w dziale VR. // ustaw pin 1 portu B jako wyjście Kompilujemy µc/os II Zacznijmy od dodania niezbędnych plików do projektu. W tym celu w pliku makefile dodajemy jako kod źródłowy w C plik UCOS_II.C, który dołączy wszystkie wymagane przez warstwę systemu pliki. Warto wcześniej otworzyć ten plik i sprawdzić czy znajdujące się w nim ścieżki do pozostałych plików mają pokrycie w rzeczywistości. Dodatkowo, może się pojawić problem z dużymi i małymi literami w nazwach plików narzędzia GNU są na to wrażliwe i konsekwentnie będą produkować błędy podczas kompilacji, jeżeli tego nie dopilnujemy. Do skryptu kompilacji musimy dołączyć także pliki warstwy portu. Są to OS_CPU_C.C oraz OS_CPU_.SM. Ten drugi musi być dołączony jako plik kodu w języku asembler. Niestety, w dostępnym na stronie producenta porcie uwidacznia się problem polegający na tym, że podczas przetwarzania pliku OS_CPU_.SM dołączany jest dyrektywą #include plik OS_CFG. H, w którym nieopatrznie umieszczono definicję typu OS_FLGS. sembler jej nie rozumie i zgłasza błąd. Można temu zapobiec dodając warunek dla preprocesora, który wyłączy ją podczas p r z e t w a - rzania plik u p r z e z a s e m b l e r (list. 1). Po p r a w - nie napisany plik makefile, uwzględn i a j ą c y t e poprawki powinien przeprowadzić czystą kompilację z minimalną liczbą ostrzeżeń, nawet przy ustawionym najbardziej rygorystycznym sprawdzaniu kodu (opcja kompilatora pedantic). W testowanej wersji systemu, tj. 2.52 i kompilatorze w wersji 3.4.6 wykryto tylko jedno ostrzeżenie, wynikające z pozostawienia nieużywanej zmiennej w pliku OS_TSK.C. // ustaw pin 0 portu B jako wyjście // zmień stan portu // wprowadź opóźnienie // zmień stan portu // wprowadź opóźnienie Uruchamiamy system Program działający pod kontrolą systemu operacyjnego jest dzielony na zadania (wątki), które są przełączane i działają pozornie niezależnie od siebie. W systemie zawsze działa przynajmniej jedno zadanie, tzw. wątek bezczynności (idle task) utworzony przez system. W systemach operacyjnych bez wywłaszczania zadań (non preemptive OS) zadania same decydują o tym, kiedy przekazać kontrolę CPU innemu wątkowi. Komplikuje to tworzenie aplikacji, ponieważ programista sam musi zatroszczyć się o to, aby zadania w odpowiednim czasie zwolniły zasoby CPU. mc/os II jest natomiast systemem z wywłaszczaniem (preemptive OS), co oznacza, że sam decyduje o tym, które zadanie ma w danym czasie przejąć kontrolę. Konieczne jest więc okresowe dopuszczenie do głosu warstwy systemu, która jeżeli zajdzie taka konieczność, przełączy zadanie. Idealnym do tych celów jest mechanizm periodycznych przerwań, generowanych np. przez układ sprzętowego licznika (timera). Port dla Tmega128 wykorzystuje domyślnie do tego celu przerwanie od przepełnienia licznika TIMER0. Należy więc odpowiednio ustawić rejestry układu, aby przerwanie to było generowane. Poniższe dwie linie kodu w zasadzie załatwiają sprawę, przy założeniu, że przerwania są globalnie odblokowane. TCCR0 = 0x06; TIMSK = 0x01; Dla częstotliwości taktowania mikrokontrolera wynoszącej 8 MHz otrzymujemy przerwanie co ok. 8 ms. Pamiętajmy, że im krótszy okres przerwania tym częściej przełączane mogą być zadania, a więc wątki o wyższym priorytecie szybciej są w stanie przejąć kontrolę. Niestety jednocześnie wzrasta tak- List. 4. void Task3(void *pdata) while ((PINB & 0x04)) // sprawdzaj pin w pętli OSTimeDly(2); ; OSSemPost(event1); // sygnalizuj zdarzenie event1 OSTaskSuspend(OS_PRIO_SELF); // wstrzymaj zadanie /* Task3 */ List. 5. void Task2(void *pdata) INT8U error; // zaczekaj na zdarzenie OSSemPend(event1, 1000, &error); if (OS_NO_ERR == error) // zdarzenie wystąpiło // ustawienie pinu jako wyjście while (1) PORTB ^= 0x02; // zmiana stanu portu else OSTimeDly(60); PORTB &= 0x02; while (1) ; /* Task2 */ // przekroczono czas oczekiwania na zdarzenie // ustawienie pinu jako wyjście // ustawienie niskiego stanu na porcie 66

że procentowe zużycie mocy obliczeniowej potrzebnej na częstsze działanie mechanizmu szeregowania zadań [2]. Precyzyjniejszą kontrolę nad czasem systemowym można uzyskać zmieniając typ przerwania z przepełnienia (overflow) na porównanie (output compare). Wymaga to niewielkiej ingerencji w pliki portu mc/os II. Po skonfigurowaniu przerwania licznika pora zainicjalizować system, w tym celu wywołujemy funkcję OSInit(). Uruchomienie systemu następuje po wywołaniu funkcji OSStart(). Jeżeli wszystko poszło dobrze, program nie powinien już opuścić tej funkcji, jest ona bowiem główną pętlą systemową. Migamy LED ami program 1 Spróbujmy napisać zadanie (list. 2), które będzie cyklicznie gasić i zapalać diodę LED podłączoną do pinu 0 portu B (zakładamy, że dioda świeci przy niskim stanie na pinie). Zadanie to będzie się składać z pętli, w której będziemy zmieniać stan na wyjściu portu, zaś operacja ta będzie przeplatana z funkcją opóźniającą zadanie o 120 taktów przerwania systemowego (ok. 1 s). Drugie zadanie napiszemy tak, aby zmieniało stan pinu 1 portu B dwa razy szybciej (list. 3). Mając dane funkcje, możemy je wprowadzić do systemu jako wątki. Wcześniej musimy jednak zapewnić im pewien obszar pamięci RM na stos, potrzebny do zapisania kontekstu zadania (m.in. rejestry CPU i zmienne lokalne). W tym celu dla każdego zadania deklarujemy globalnie tablicę o domyślnym rozmiarze: OS_STK Task1Stk[OS_TSK_DEF_STK_ SIZE]; OS_STK Task2Stk[OS_TSK_DEF_STK_ SIZE]; Teraz możemy już zainicjalizować zadania, przeznaczając je do uruchomienia poprzez umieszczenie przed OSStart() wywołań: OSTaskCreate(Task1, NULL, (void *)&Task1Stk[OS_TSK_DEF_STK_SIZE 1], 4); OSTaskCreate(Task2, NULL, (void *)&Task2Stk[OS_TSK_DEF_STK_SIZE 1], 5); Zwróćmy uwagę na trzeci parametr tych funkcji, oznaczający wskaźnik do obszaru stosu zadania. W mikrokontrolerach VR stos rośnie w kierunku młodszych adresów, dlatego jako początkową wartość wskaźnika stosu zadania podajemy adres ostatniego bajtu zadeklarowanej do tego celu wcześniej tablicy. W systemie mc/os II każde zadanie musi posiadać unikatowy priorytet. Nie dozwolone jest więc dzielenie czasu procesora na działanie dwóch zadań o tym samym priorytecie, jak ma to miejsce np. w systemie ecos (tzw. round robin scheduling). W naszym przypadku zadanie 2 będzie miało wyższy priorytet (=5) od zadania 1 (=4). Po skompilowaniu kodu i zaprogramowaniu mikrokontrolera obie diody powinny migać, przy czym jedna dwa razy szybciej od drugiej. Dodajemy komunikację między zadaniami program 2 Zmodyfikujmy nasz program tak, aby druga dioda zaczęła migać dopiero po pojawieniu się na pinie 2 portu B stanu niskiego. W przypadku, gdy sytuacja ta nie wystąpi, dioda po zadanym czasie oczekiwania zapali się na stałe. Stan pinu wejściowego będzie mo- R E K L M ELF Twoją podporą Po 60 latach w branży elektronicznej wiemy, czego potrzebujesz. Mówimy Twoim językiem. Dostarczamy zarówno pojedyncze komponenty, jak i ilości przemysłowe. 67

nitorowany przez trzecie zadanie, które po zakończeniu działania zostanie wstrzymane. Ponieważ zadania nie wiedzą nic o sobie, komunikację między nimi trzeba oprzeć o struktury globalne lub systemowe. mc/os II posiada mechanizmy dedykowane do komunikacji międzywątkowej. Są to generalnie semafory (semaphores) i skrzynki pocztowe (mailboxes). Dokładny opis tych mechanizmów wykracza poza ramy tego artykułu, spróbujmy więc posłużyć się przykładem wykorzystującym semafor. by móc skorzystać z semafora trzeba go najpierw utworzyć wywołaniem: OS_EVENT event1; // zmienna globalna... event1 = OSSemCreate(0); nadając mu w ten sposób wartość początkową równą 0 i wiążąc go z globalną zmienną event1, która jest typu OS_EVENT. Utwórzmy wobec tego trzecie zadanie, podobnie jak dwa poprzednie (list. 4). Zadanie to najpierw sprawdza w pętli czy nastąpiła zmiana stanu na wejściu. Jeśli tak, to sygnalizowane jest zdarzenie event1, co oznacza że wartość semafora zostanie zwiększona z zero na jeden. Następnie zadanie wstrzymuje swoje działanie. Zmodyfikujmy zadanie 2 w ten sposób, aby czekało na zdarzenie event1 (list. 5). Funkcja OSSemPend czeka na wystąpienie zdarzenia event1. Jeżeli po czasie 1000 cykli systemowych zdarzenie nie wystąpi, to w zmiennej code pojawi się wartość OS_TIMEOUT, w przeciwnym razie będzie tam wartość OS_NO_ ERR i dioda zacznie migać. Szyjemy system na miarę Działanie systemu można w pewnym stopniu dopasować do danej aplikacji, edytując plik OS_CFG.H. Znajduje się tam wiele definicji, wpływających na sposób działania systemu i zajmowane zasoby. W szczególności istnieje możliwość wyłączania nieużywanych funkcji lub całych modułów z procesu kompilacji, co zaoszczędzi nam cenną pamięć. Daną funkcję wykluczamy wpisując przy związanej z nią definicji zero. Przykładowo, jeżeli nie potrzebujemy funkcji kasującej utworzone zadania, wpisujemy: Książka jest uznanym na świecie, kompletnym przewodnikiem po systemie operacyjnym mc/os, napisanym przez jego autora. Doskonale spełnia rolę podręcznika dla programistów tworzących aplikacje na platformie mc/os. OS_TSK_DEL_EN 0 /* Include code for OSTaskDel() */ W pierwszej aplikacji możemy skorzystać z domyślnych ustawień, warto jednak przyjrzeć się kilku definicjom: OS_CPU_HOOKS_EN jeśli równe 1, system będzie umożliwiał podłączenie specjalnych funkcji tzw. haków (ang. hooks), wywoływanych w specyficznych momentach, np. podczas przełączania zadania lub w trakcie pracy wątku bezczynności. Możemy je wykorzystać chociażby do monitorowania działania naszego programu. OS_TSK_STT_EN jeśli równe 1, w tle działać będzie zadanie statystyczne, liczące procentowe wykorzystanie czasu CPU. O S _ T S K _ D E F _ S T K _ S I Z E domyślny rozmiar stosu dla zadań. W naszym programie korzystamy z tej definicji, aby przedzielić pamięć na stos obu zadań. Nie musi tak być. Lepiej z punktu widzenia zużycia pamięci byłoby dobrać rozmiar stosu do każdego zadania, biorąc pod uwagę liczbę zmiennych lokalnych, liczbę możliwych zagnieżdżeń itp. nalityczny dobór rozmiaru stosu jest zadaniem skomplikowanym, mc/ OS II posiada jednak mechanizmy pozwalające oszacować tę wielkość metodą testowania [1]. Podsumowanie mc/os II zapewnia większość podstawowych mechanizmów potrzebnych w systemach czasu rzeczywistego, zużywając przy tym naprawdę niewiele zasobów. Idealnie nadaje się zarówno do systemów z małymi mikrokontrolerami, jak i większych systemów (nawet komputerów PC), w których muszą zostać spełnione ścisłe reżimy czasowe. Niezawodność systemu została potwierdzona wieloma certyfikatami, a także ogromną liczbą wdrożeń. Warto poznać mc/os II, zwłaszcza, jeśli ma to być pierwszy krok na drodze do programowania w aplikacjach wbudowanych z wykorzystaniem systemu operacyjnego czasu rzeczywistego. mc/os II w wersji 2.52 jest rozpowszechniany w postaci kodu źródłowego dołączonego na płycie CD do książki pt. MicroC/OS II The Real Time Kernel napisanej przez autora systemu J. L. Labrosse a. Książka ta stanowi wyjątkową pozycję, łączącą podręcznik użytkownika systemu z wnikliwym opisem najważniejszych mechanizmów występujących w systemach czasu rzeczywistego. Należy podkreślić, iż dystrybuowana wersja nie jest przeznaczona do celów komercyjnych te wymagają osobnej (odpłatnej) licencji. Na koniec warto wspomnieć, iż producent systemu firma Micrium ma w swojej ofercie biblioteki przeznaczone do zastosowania w systemach wbudowanych, obsługujące USB, stos TCP/IP, różne systemy plików, protokoły CN i Modbus, itp. Łukasz Krzak Cezary Worek Katedra Elektroniki GH Literatura [1] J. L. Labrosse, MicroC/OS II The Real Time Kernel, Second Edition, CMP Books 2002 [2]. Lipowski, C. Worek, Wprowadzenie do systemów operacyjnych dla systemów wbudowanych na przykładzie platformy RM, Elektronika Praktyczna 11 12/2006 [3]. Lipowski, C. Worek, Systemy operacyjne w systemach mikroprocesorowych, Elektronika Praktyczna Plus 1/2006 [4] http://home.agh.edu.pl/~lkrzak 68