KARTOS 8–bitowe jądro czasu rzeczywistego, część 2


P R O G R A M Y
OS
8 bitowe jądro czasu
rzeczywistego, część 2
W pierwszej części cyklu została wstępnie poruszona teoretyczna zadań, szeregowanie zadań, zarzą-
dzanie kolejkami.
problematyka systemów operacyjnych z uwzględnieniem systemów
Pamięć systemowa  to obszar
operacyjnych czasu rzeczywistego. Kontynuacją będzie przedstawienie
pamięci danych zawierający zmien-
prostej implementacji dla małych, tanich i powszechnie dostępnych,
ne systemowe oraz stos systemowy.
Część rozszerzająca systemu
a jednocześnie wydajnych mikrokontrolerów jednoukładowych RISC.
składa się z konfigurowalnych au-
Zaprezentujemy również aplikację demonstracyjną.
tonomicznych modułów rozszerza-
jących funkcjonalność jądra. W jej
Budowa systemu KaRTOS krokontrolera i zegar systemowy do skład wchodzą również wszystkie
System KaRTOS składa się odmierzania jednostkowych odcin- sterowniki układów peryferyjnych.
z dwóch głównych części: podstawo- ków czasu o długości 1 ms. Jest to W zależności od docelowej aplikacji,
wej i rozszerzającej, co pokazano sche- minimalny kwant czasu, którym za- poszczególne podsystemy mogą być
matycznie na rys. 7. Część podstawo- rządza system KaRTOS. włączane lub wyłączane na etapie
wa jest niezbędna do pracy syste- Funkcje podstawowe (jądro) kompilacji kodu. Minimalna kompi-
mu. Jej uruchomienie jest konieczne.  to zbiór niezbędnych procedur lacja systemu w wersji 3.00 z włą-
W skład części podstawowej wchodzą: realizujących takie zadania jak: ini- czonym algorytmem karuzelowym
Timer systemowy  to blok wy- cjalizacja mikrokontrolera (również szeregowania zadań zajmuje jedynie
korzystujący sprzętowy licznik mi- timera systemowego), inicjalizacja 1654 bajty pamięci ROM i 13 baj-
tów pamięci RAM.
W tab. 1 pokazano zapotrzebo-
wanie na pamięć programu ROM
przez główne moduły systemu KaR-
TOS w wersji 3.00.
Zadania w systemie KaRTOS
Każde zadanie uruchomione w sys-
temie KaRTOS posiada swoje własne
zasoby. Należą do nich:
Kod  instrukcje wykonywane
przez kontroler znajdujące się w pa-
mięci ROM. Wielkość zajmowanej
Rys. 7. Budowa systemu KaRTOS pamięci zależy od algorytmu realizo-
wanego przez zadanie. Zadanie mru-
Tab. 1. Zapotrzebowanie na pamięć programu ROM przez główne moduły syste- gania diodą zajmie kilkanaście baj-
mu KaRTOS w wersji 3.00
tów w pamięci programu, natomiast
Rozmiar
implementowanie skomplikowanych
Lp. Nazwa modułu Opis
[bajty]
funkcjonalności wymaga większej jej
0. KaRTOS wer. 3.01 1654 Podstawowa wersja systemu.
pojemności.
Włączenie algorytmu szeregowania round robin
Stos  obszar pamięci RAM za-
1. KaRTOS_PRIORITY_SCHED 160 z priorytetami i określeniem maksymalnego czasu dla
wierający adresy powrotu przy wyko-
zadania.
nywaniu skoków do funkcji, zmienne
Moduł zegara czasu rzeczywistego działającego
2. KaRTOS_RTC 242 tymczasowe oraz kontekst zadania
w oparciu o główny zegar systemowy.
niezbędny podczas jego przełączania
Moduł zegara czasu rzeczywistego działającego
3. KaRTOS_32KHZ_RTC 294
(rejestry danych, wskaznik stosu, re-
w oparciu rezonator 32,768 kHz.
jestr statusu kontrolera). Rozmiar tej
4. KaRTOS_EXT_TIME 180 Uruchomienie rozszerzonej wersji zegara z datą.
struktury jest definiowany przez pro-
5. KaRTOS_UART_ON 1248 Sterownik wraz z funkcjami obsługi portu szeregowego.
gramistę implementującego algorytm
6. KaRTOS_ADC_ON 148 Sterownik wraz z funkcjami obsługi przetwornika ADC
zadania. Rozmiar stosu musi być tym
7. KaRTOS_EEPROM_ON 132 Sterownik wraz z funkcjami obsługi pamięci EEPROM.
większy, im więcej stopni zagnieżdżeń
8. KaRTOS_STRING 206 Pakiet funkcji do manipulacji na ciągach znaków.
posiada korzystające z niego zadanie.
9. KaRTOS_SEM 234 Moduł implementujący semafory.
Dla średnio rozbudowanego zadania
Elektronika Praktyczna 6/2008
105
P R O G R A M Y
nia mogą posiadać Implementując algorytm zadania
identyczny priorytet należy pamiętać, aby nie dopuścić do
i być traktowane na wyjścia z funkcji zadania. Można to
równi, zrealizować na różne sposoby:
 l i c z n i k   zadanie to nieskończona pętla
jest zmienną o sze- void Task_2(void)
{
rokości 16 bitów,
for(;;)
{
Rys. 8. Krążenie zadań w systemie KaRTOS przechowującą war-
//Instrukcje zadania ;
tość (w ms) interwa-
} ;
wystarczający będzie stos o wielkości łu czasu, na jaki zadanie zostało  nieskończona pętla znajduje się
100 bajtów. zawieszone, na końcu kodu, po zakończeniu
Blok kontrolny (Task Control  wskaznik do struktury TCB umoż- algorytmu zadania
void Task_2(void)
Block)  obszar pamięci o rozmiarze liwiający realizację kolejek zadań,
{
8 bajtów zawierający informacje o za-  wskaznik stosu przechowujący ad-
//Instrukcje zadania ;
//Instrukcje zadania ;
daniu. Umożliwia on identyfikację za- res wierzchołka stosu zadania.
for(;;){ TimeSleepms(1000)
dań i zarządzanie nimi przez system. Każde zadanie w systemie może
; }
}
TCB zawiera: znajdować się w jednym z czterech
 numer identyfikacyjny zadania stanów: wykonywane, gotowe, ocze-
 PID (Process ID)  jest to licz- kujące lub zablokowane. Wędrówkę  Hello wolrd tu KaRTOS , czyli
ba z zakresu od 2 do 255 jed- zadań w systemie KaRTOS pokazano pierwsza aplikacja w systemie
noznacznie identyfikująca zadanie na rys. 8. KaRTOS
w systemie. PID numer 0 jest za- Wystartowane zadanie znajduje Po przedstawionym powyżej mi-
rezerwowany, a numer PID o nu- się w stanie gotowe do momentu, aż nimalnym wstępie teoretycznym
merze 1 posiada systemowy pro- zostanie uruchomione (wykonywa- nadszedł wreszcie czas upragniony
ces bezczynności. Oczywistym jest, ne) zgodnie ze swoim priorytetem. przez wszystkich praktyków, czyli
że w poprawnie działającym syste- Zadanie wykonywane to takie, któ- koniec marudzenia  przystępujemy
mie nie mogą istnieć dwa zadania re jest aktualnie w posiadaniu pro- do działania. Co jest potrzebne do
o identycznym numerze identyfika- cesora. Oczekujące zadanie to takie, tego, by napisać i uruchomić apli-
cyjnym. PID jest nadawany zada- które przerwało swoje działanie na kację w systemie KaRTOS:
niu podczas jego tworzenia, określony czas. W stanie zablokowane 1. system KaRTOS  zawarty w pliku
 priorytet  liczba z zakresu od 1 znajduje się zadanie, które oczekuje Hello_world_tu_KaRTOS.zip  jest
do 254 określająca ważność zada- na określony zasób (dostęp do pa- to gotowa aplikacja demonstracyjna
nia  im mniejsza wartość, tym mięci współdzielonej RAM, pamięci opisywana poniżej. Po rozpakowa-
zadanie jest ważniejsze. Najważ- EEPROM, port itp.) lub na określony niu pliku w katalogu Hello_world_
niejsze jest zadanie z priorytetem komunikat synchronizujący. Innymi
1, gdyż priorytet 0 jest zarezerwo- słowy, w stanie zablokowane znajdu-
wany. Systemowy proces bezczyn- je się zadanie nie mogące kontynu-
ności posiada najmniejszą ważność ować działania z powodu innego niż
(priorytet 255). Jeśli w systemie oczekiwanie na odmierzenie interwału
istnieją zadania o tym samym czasu.
priorytecie oznacza to, że są rów-
nie ważne. W skrajnym przypad-
ku wszystkie uruchomione zada-
Rys. 9. Schemat układu dla aplikacji demonstracyjnej systemu KaRTOS
Elektronika Praktyczna 6/2008
106
P R O G R A M Y
tu_KaRTOS znajdą się następujące 4. Zainstalowany programator pozwa- rająca rozmiar stosu zadania (zde-
zasoby: lający załadować kod wynikowy finiowane w main.h).
 katalog KaRTOS  zawiera sys- do kontrolera ATmega8(L).
tem operacyjny, Posiadając powyższe składniki Konfigurowanie systemu
 plik main.h  zawiera parametry możemy przystąpić do dzieła, jakim W katalogu Hello_world_tu_KaR-
zadań (TASK_PID  numer za- jest napisania i uruchomienia pierw- TOS\KaRTOS\ATMega8\ znajduje się
dania (przyjmuje wartości od 2 szej aplikacji dla systemu KaRTOS. plik KaRTOS.conf. W nim zawarte są
do 255), TASK_STACK  określa Uruchomimy trzy zadania: zmienne konfigurujące system opera-
rozmiar stosu zadania w bajtach,  Task_1  będzie wysyłało co 1 cyjny. Plik jest podzielony na pięć
TASK_PRIORITY  numer prio- sekundę przez port szeregowy sekcji, z których edytować będziemy
rytetu zadania (przyjmuje warto- ekran powitalny aplikacji   Hel- pierwsze trzy:
ści od 1 do 254)), lo world tu KaRTOS ! . Parame- 1. Sekcja SWITCH ON/OFF KaR-
 plik main.c  tutaj zawarte są try transmisji: 8N1,38400 (osiem TOS MODULES  umożliwia włącze-
procedury tworzenia, inicjalizacji bitów danych, bez bitu parzysto- nie lub wyłączenie poszczególnych
zadań oraz inicjalizacji i urucho- ści, jeden bit stopu z prędkością modułów systemu do kompilacji. Do-
mienia systemu operacyjnego, 38,4 kbps), konujemy tego  komentując (lub nie)
 pliki Task_1.h, Task_2.h, Task_  Task_2  będzie zapalało na 1 poszczególne zmienne kompilatora
3.h, Task_4.h  pliki nagłówkowe sekundę i gasiło na 1 sekundę za pomocą znaków  // . Dla potrzeb
zadań istniejących w systemie diodę_1 podłączoną do pinu PC0 naszej pierwszej aplikacji wszystkie
 zawierają deklaracje funkcji mikrokontrolera, moduły winny być wyłączone ( zako-
i zmiennych globalnych poszcze-  Task_3  będzie zapalało na mentowane ) z wyjątkiem modułu ob-
gólnych zadań, 100 ms i gasiło na 400 ms dio- sługi portu szeregowego  KaRTOS_
 pliki Task_1.c, Task_2.c, Task_3.c, dę_2 podłączoną do pinu PC1 UART_ON.
Task_4.c  pliki zawierające kod mikrokontrolera. 2. Sekcja HARDWARE SYSTEM
poszczególnych zadań, CONFIGURATION  w tej sekcji mo-
 makefile  plik z instrukcjami Zmienne żemy ustawić takie parametry jak:
automatycznej kompilacji dla Zmienne zdefiniowane w sys- rozmiar stosu systemowego (w bajtach)
programu make. temie KaRTOS przedstawiono  SYS_STACK 20, podział pamięci
2. Kawałek sprzętu, czyli mikrokon- w tab. 2. RAM na sekcje: pamięci zmiennych
troler ATmega8(L) wraz z peryfe- globalnych oraz pamięci systemowej.
riami jak na rys. 9 (jeśli do kon- Konfiguracja zadań NO_TASKS_RAM_ADDR 620, (więcej
trolera jest podłączony rezonator Otwórz plik main.h i upewnij na ten temat w kolejnej części).
o innej częstotliwości (lub nie jest się, że parametry zadań TASK_1, 3. Sekcja KaRTOS_1MS_OCR_
podłączony żaden), zaprogramuj go TASK_2 i TASK_3 są odpowiednio WART  wartość rejestru OCR timera
do pracy z wewnętrznym oscylato- skonfigurowane (list. 1). systemowego zgłaszającego przerwanie
rem o częstotliwości 8 MHz). co 1 ms. Częstotliwość zegara tak-
3. Zainstalowany kompilator avr gcc Uruchomienie zadań tującego mikrokontroler jest dzielona
najlepiej WinAVR 20040720, Otwórz plik main.c i upewnij się, wstępnie przez 64. W naszym wypad-
że zadania Task_1, Task_2 i Task_3 ku ma wtedy wartość równą 8 [MHz]
Tab. 2. Zmienne zdefiniowane w sys- zostaną utworzone i uruchomione /64=125 [kHz]. Zatem aby odmierzyć
temie KaRTOS
(list. 2). Funkcja void KaRTOSTaskInit( 1/1000 sekundy, w rejestrze OCR musi
Typ zmiennej void(*pMyfunction)(void), u08 Pid, u08 się znajdować wartość 125. Dlatego:
Opis zmiennej
w systemie
u08Prio, u16 u16StackSize) przyjmuje KaRTOS_1MS_OCR_WART=125.
u08 zmienna 8 bitowa bez znaku
następujące parametry:
s08 zmienna 8 bitowa ze znakiem  void(*pMyfunction)(void) Konfigurowanie pinów
 wskaznik do funkcji zawierają- kontrolera
u16 zmienna 16 bitowa bez znaku
cej kod zadania  w naszym przy- W katalogu Hello_world_tu_KaR-
s16 zmienna 16 bitowa ze znakiem
padku są to funkcje o nazwach TOS\KaRTOS\ATMega8\ otwieramy
u32 zmienna 32 bitowa bez znaku
Task_1, Task_2 i Task_3, plik Initm8.c. Dokonujemy konfigu-
s32 zmienna 32 bitowa ze znakiem
 u08 Pid  8 bitowa zmienna racji portów w zależności od tego,
zawierająca numer zadania (zdefi- do których nóżek mikrokontrolera
List. 1. Parametry zadań w pliku
niowane w main.h), mamy podłączone diody. Jeśli na-
main.h
 u08 u08Prio  8 bitowa zmien- sza aplikacja ma działać w układzie
#define TASK_1_PID 10
na zawierająca priorytet zadania  z rys. 9, dokonujemy konfiguracji
#define TASK_1_STACK 100
#define TASK_1_PRIORITY 10
im mniejsza wartość, tym zadanie PORTU C następująco: DDRC=0x03
#define TASK_2_PID 20
ma wyższy priorytet (zdefiniowane oraz PORTC=0x03 (piny 0 i 1 portu
#define TASK_2_STACK 100
#define TASK_2_PRIORITY 20
w main.h), są wyjściami w stanie wysokim).
#define TASK_2_PID 30
 u16 u16StackSize  zmienna
#define TASK_2_STACK 100
#define TASK_2_PRIORITY 30
o rozmiarze dwóch bajtów zawie- Implementacja kodu zadań
Na list. 3 przedstawiono imple-
List. 2. Wywołanie funkcji tworzącej zadania w pliku main.c
mentację zadania Task_1 realizujące-
KaRTOSTaskInit(&(Task_1),TASK_1_PID,TASK_1_PRIORITY,TASK_1_STACK) ;
go wysyłanie danych przez port sze-
KaRTOSTaskInit(&Task_2,TASK_2_PID,TASK_2_PRIORITY,TASK_2_STACK) ;
regowy. Jako pierwsza wywoływana
KaRTOSTaskInit(&Task_3,TASK_3_PID,TASK_3_PRIORITY,TASK_3_STACK) ;
//KaRTOSTaskInit(&Task_4,TASK_4_PID,TASK_4_PRIORITY,TASK_4_STACK)
jest funkcja systemowa KaRTOSUar-
Elektronika Praktyczna 6/2008
107
P R O G R A M Y
List. 3. Implementacja zadania Task_1
void Task_1(void)
{
KaRTOSUartInit(12,0) ; // 38400 bps dla 8, MHz
for(;;)
{
KaRTOSUartOpen() ;
KaRTOS_UART_PRINT( \n\r*** Hello World tu KaRTOS !! *** ) ;
KaRTOSUartClose() ;
TimeSleepms(1000) ;
} ;
Rys. 11. Widok okna terminala z dzia-
}
łającą aplikacją
List. 4. Implementacja zadania W naszym przypadku używa- o założonym czasie trwania. Ustawie-
Task_2 my zegara o częstotliwości 8 MHz, nie pinu w stan wysoki powoduje, że
void Task_2(void)
a chcemy uzyskać prędkość transmisji podłączona dioda gaśnie, a my znów
{
38,4 kb/s bez podwojenia prędkości realizujemy opóznienie o odpowiednim
for(;;)
{
(u08doubleSpeed=0). Wykonując czasie trwania. Realizując cyklicznie
cbi(PORTC,0) ;
TimeSleepms(1000) ; proste obliczenie podane w dokumen- w nieskończonej pętli powyższy al-
sbi(PORTC,0) ;
tacji mikrokontrolera lub korzystając gorytm powodujemy mruganie diody
TimeSleepms(1000) ;
} ;
z gotowych tabelek również tam za- z zadanymi czasami świecenia i nie
}
wartych otrzymujemy wartość UBRR świecenia.
równą 12 (u16Baudrate=12). Po dokonaniu wszystkich powyż-
List. 5. Implementacja zadania Kolejnym krokiem w naszym za- szych czynności jesteśmy gotowi do
Task_3 daniu (list. 3) jest zaimplementowa- kompilacji kodu i zaprogramowania
void Task_3(void)
nie nieskończonej pętli wysyłającej kontrolera.
{
co sekundę ciąg znaków. Funkcja
for(;;)
{
systemowa KaRTOSUartOpen otwiera Kompilacja
cbi(PORTC,1) ;
TimeSleepms(100) ; port szeregowy, KaRTOS_UART_PRINT Po rozpakowaniu archiwum Hel-
sbi(PORTC,1) ;
wysyła ciąg znaków będących jej ar- lo_world_tu_KaRTOS.zip na dysk c:\
TimeSleepms(400) ;
} ;
gumentem i zawarty między znakami możemy przystąpić do kompilacji.
}
cudzysłów, a KaRTOSUartClose zamy- W tym celu otwieramy wiersz pole-
ka wcześniej otwarty port. Pozostaje ceń systemu windows i przechodzimy
tInit dokonująca inicjalizacji portu nam jeszcze zrealizować sekundowe do katalogu c:\Hello_world_tu_KaRTOS\.
USART mikrokontrolera. Deklaracja opóznienie, do czego służy systemo- Po wydaniu polecenia make na kon-
wspomnianej funkcji ma następują- wa funkcja TimeSleepms. Jako argu- soli powinny pojawić się komunikaty
cą postać: void KaRTOSUartInit(u16 ment podajemy czas w milisekundach świadczące o postępie kompilacji i po
u16Baudrate, u08 u08doubleSpeed).  w naszym przypadku 1000 ms. chwili ekran powinien wyglądać jak
Przyjmuje ona dwa parametry: Zadania Task_2 i Task_3 będą mia- na rys. 10. Oznacza to, że kompila-
 u16Baudrate  wartość ta zo- ły podobną budowę ze względu na cja przebiegła pomyślnie, a w katalogu
stanie przepisana do rejestru realizację podobnych algorytmów  c:\Hello_world_tu_KaRTOS\ znajduje się
UBRR, określa zatem prędkość różnią się jedynie czasami opóznień. plik main.hex (i main.bin), z kodem
transmisji, Kod zadań przedstawiają odpowiednio wynikowym, który możemy załadować
 u08doubleSpeed  włącza (jeśli list. 4 i 5. Po ustawieniu odpowied- do pamięci kontrolera.
ma wartość 1) lub wyłącza (jeśli niego pinu w stan niski, co powo-
wartość jest różna od 1) podwo- duje zapalenie podłączonej do niego Aplikacja działa
jenie prędkości transmisji portu. diody, należy zrealizować opóznienie Teraz wystarczy podłączyć sprzęt
(rys. 9) do komputera PC za pomo-
cą niekrosowanego kabla szeregowego
i uruchomić dowolną aplikację ter-
minala (np. TTermSSH). Następnie
ustawiamy parametry transmisji, jak
podano powyżej (8N1, 38400). Jeśli
połączenia są wykonane poprawnie,
to po podłączeniu zasilania do płyty
kontrolera zaobserwujemy mrugające
diody, a terminal zapełni się ekranem
powitalnym jak na rys. 11.
Mariusz Żądło
iram@poczta.onet.pl
Autor zachęca Czytelników do kształtowania tre-
ści kolejnych odcinków cyklu. Napisz w e mailu
czy bardziej interesuje Cię teoria działania, czy
raczej wolisz aby prezentowane były przykła-
dowe aplikacje i projekty dla systemu KaRTOS.
Inne uwagi również mile widziane.
Rys. 10. Widok okna konsoli po pomyślnej kompilacji aplikacji demo
Elektronika Praktyczna 6/2008
108


Wyszukiwarka

Podobne podstrony:
KARTOS 8–bitowe jądro czasu rzeczywistego, część 3
KARTOS 8–bitowe jądro czasu rzeczywistego, część 3
KARTOS 8–bitowe jądro czasu rzeczywistego, część 4
Systemy czasu rzeczywistego
tomasz szmuc programowanie systemow czasu rzeczywistego wyklad
RTLinux system czasu rzeczywistego
Systemy czasu rzeczywistego
MikroTik jako monitor ruchu czasu rzeczywistego
DS1307ZN zegar czasu rzeczywistego do zegarka do auta
systemy rozproszone i czasu rzeczywistego
Część II Wykorzystanie metod entomologicznych do oceny czasu zgonu – opis przypadków
Część I Wykorzystanie metod entomologicznych do oceny czasu zgonu – opis przypadków

więcej podobnych podstron