Date post: | 30-Dec-2015 |
Category: |
Documents |
Upload: | vielka-cline |
View: | 26 times |
Download: | 0 times |
Charakteristika RTMON
Preemptivní systém Samostatný soubor, který se přilinkuje
k uživatelským procesům Je užíván pomocí služeb
Služby pro práci s procesy Služby pro práci se schránkami a
zprávami Musí být inicializován
Vektor uživatelského procesu(1)
Název Délka Význam
HDNPRO 1 Číslo procesu (identifikátor)
HDPRIO 1 Priorita (nejvyšší 1, nejnižší 254), systém si vyhrazuje priority 0 a 255
HDSTAR 2 Startovací adresa kódu procesu
Vektor uživatelského procesu(2)
Název Délka Význam
HDSTAC 2 Adresa dna zásobníku procesu
HDSTSZ 2 Velikost zásobníku
HDAKST 2 Aktuální hodnota ukazatele zásobníku proces
Vektor uživatelského procesu(3)
Název Délka Význam
HDPCYK 2 Časová perioda spuštění (počet systémových tiků)
HDPTRU 2 Zbývá period do spouštění (počet systémových tiků)
HDPDLY 2 Zbývá period do konce zastavení (počet systémových tiků)
HDSTAT 1 Stav procesu
Stav procesu (1)
STDEF – pouze definován pomocí CRTP
STREDY – připraven na spuštění STRUN – běžící STSTOP – pozastavený STABOR – abortovaný STWTIM – čeká na uplynutí času do
spuštění
Stav procesu (2)
STWCON – čeká na uplynutí času do pokračování
STWQF – čeká na zprávu ve schránce, jejíž adresa je v HDSOW
STWQE – čeká na uvolnění schránky, jejíž adresa je v HDSOW
STOCRT – proces přetekl přes časovou periodu spouštění
Vektor uživatelského procesu(4)
Název Délka Význam
HDSOW 2 Adresa schránky na kterou se čeká
HDNEXT 2 Adresa další hlavičky procesu (0000H = poslední hlavička)
HDRESV 2 reserva
Volání služeb (1)
Před voláním služby je nutno naplnit příslušné vstupní registry podle požadavků volané služby.
Akumulátor A obsahuje číslo volané služby (pevně dáno)
Akumulátor B většinou obsahuje číslo procesu, což je identifikátor vrácený službou CRTP (založení procesu - registrace pro jádro RTMON).
Volání služeb (2)
Každá služba vrací nejméně akumulátor A, kde je uložen návratový kód procesu (chyba).
Vlastní volání jádra RTMON se provede pomocí instrukce JSR SERV, čímž se předá řízení manažeru služeb.
Seznam návratových kódů služeb (1)
Název Význam
EOK OK, žádná chyba
ENS Chybné číslo služby
ENP Chybné číslo procesu (neznámý identifikátor)
EQFU Schránka je plná (nelze zapsat do schránky)
Seznam návratových kódů služeb (2)
Název Význam
EQEM Schránka je prázdná (nelze číst ze schránky)
ETPF Nelze založit další proces, tabulka procesů je plná
ETQF Nelze založit další schránku, tabulka schránek je plná
CRTP - založení procesu Vyplní hlavičku procesu do tabulky hlaviček
a regulérně zaregistruje proces pro jádro systému.
Nastavuje zásobník procesu a hodnotu jeho aktuálního ukazatele na dno zásobníku.
Stav procesu nastaví na „pouze definován“ a vyplní proměnnou HDSTAR ve vektoru procesu startovací adresou procesu.
Vrátí identifikátor procesu, kterým se odkazují ostatní služby na daný proces.
Je možno založit až 20 procesů (bez úpravy).
STRP – spuštění procesu Spustí založený proces buďto jednorázově
nebo s periodickým spouštěním. Při periodickém spouštění musí uživatel
zaručit, že proces bude dokončen do doby dalšího možného spuštění. Pokud tato situace přece jen nastane, bude proces vyloučen z dalších rozhodování jádra a obdrží status STOVRT.
Při definovaném pozastavení do prvního spuštění nejsou odpočítávány tiky procesu v periodě spouštění. Proces počká až uplyne doba do spuštění, spustí proces a začne odpočítávat tiky do dalšího spuštění.
DLYP – pozastavení procesu
Pozastaví další zpracování procesu buďto na neurčito nebo na zadanou dobu.
Je-li pozastavení časově omezeno, proces pokračuje po uplynutí časového intervalu.
Není-li časově omezeno, nemůže proces již dále pokračovat dokud jiný proces nespustí službu CONP
CONP – pokračování procesu
Povolení dalšího zpracování procesu pozastaveného službou DLYP.
Má-li pokračovat proces s vyšší prioritou, dostane ihned přidělen procesor, v jiném případě musí počkat, až budou uspokojeny ostatní procesy s vyššími prioritami.
CHPP – změna periody spouštění
Změní periodu spouštění u periodicky spouštěných procesů.
Lze s výhodou využít pro zastavení dalšího periodického spouštění nebo pro zahájení spouštění s novou periodou.
Je nutno mít na paměti, že programátor aplikace musí zaručit ukončení procesu do příchodu dalšího požadavku na spuštění
STOP – zakončení procesu
Slouží k zakončení práce procesu. Musí být na konci každého procesu! Provádí regulérní korekci dat vektoru
procesu. Pokud nebude proces před předáním
procesoru jádru systému ukončen touto službou, bude systém zablokován bez šance k regulérnímu obnovení práce bez resetu mikropočítače.
ABRP – abort procesu Provede symbolické vyřazení procesu z tabulek
systému. Je-li periodicky spouštěn musí být perioda spouštění
před službou ABRP vynulována pomocí služby CHPP!
Programátor by po použití služby ABRP neměl provádět s daným procesem žádné další operace.
Tato služba nemá v RTMON HC11 tak výrazně nutné uplatnění jako v jiných systémech reálného času, jelikož se programy nemohou do mikropočítače zavádět dynamicky a není tedy třeba uvolňovat paměť jiným aplikacím.
CRTQ – založení schránky
Založí schránku pro výměnu dat mezi procesy a vrátí identifikátor schránky, kterým se odkazují ostatní procesy na tuto datovou strukturu.
Schránka má velikost 2 byty a je možno založit až 20 schránek
WRTQ – zápis do schránky bez čekání
Zapíše informace z registru IY do schránky určené identifikátorem bez čekání na volnou schránku.
Je -li ve schránce stará zpráva, bude přepsána a vrácen kód chyby EQFU
WRWQ – zápis s čekáním na volnou schránku
Zapíše informace z registru IY do schránky určené identifikátorem s čekáním, dokud je ve schránce stará zpráva.
Po dobu čekání není procesu přidělován procesor
REDQ – čtení ze schránky bez čekání
Čte zprávu ze schránky.
Je-li schránka prázdná, vrací zprávu 0000H a kód chyby EQEM
RDWQ - čtení s čekání na zprávu
Čte zprávu ze schránky.
Pokud je schránka prázdná, čeká až bude naplněna některým z procesů.
DELQ – zrušení schránky
Symbolicky zruší schránku.
Musí být zajištěno, že v okamžiku rušení již schránka není používána žádným procesem.
Přehled služeb (1)ZKRATKA NÁZEV PARAMETRY
CRTP Založení procesu
A=1, B=prioritaIX=adresa počátku procesuIY= velikost zásobníkuVrací: A = chyba, B = číslo procesu (identifikátor)
STRP Spouštění procesu
A=2, B=číslo procesuIX=počet tiků systému do startu procesu (0=bez čekání) IY= perioda spouštění procesu (0=není periodicky spouštěn)Vrací: A = chyba
Přehled služeb (2)ZKRATKA NÁZEV PARAMETRY
DLYP pozastavení A=3, B = číslo procesuIX = počet tiků pozastavení procesu ( 0 = neomezeně)Vrací: A = chyba
CONP Pokračování procesu
A=4, B = číslo procesuVrací: A = chyba
CHPP Změna periody spouštění
A=5, B = číslo procesuIX = nová perioda spouštěníVrací: A = chyba
Přehled služeb (3)ZKRATKA NÁZEV PARAMETRY
STOP Zakončení procesu
A = 6, B = číslo procesuVrací: A = chyba
ABRP Abort procesu
A = 7, B = číslo procesuVrací: A = chyba
CRTQ Založení schránky
A = 8Vrací: A = chyba, IX = adresa schránky
Přehled služeb (3)ZKRATKA NÁZEV PARAMETRY
WRTQ Zápis do schránky
A=10IX = adresa schránkyIY = obsah zprávyVrací: A = chyba
WRWQ Zápis s čekáním na volnou schr.
A=10IX = adresa schránkyIY = obsah zprávyVrací: A = chyba
Přehled služeb (4)ZKRATKA NÁZEV PARAMETRY
REDQ Čtení ze schránky
A = 11IX = adresa schránkyIY = obsah zprávyvrací: A = chyba
RDWQ Čtení s čekáním na příchod zprávy
A = 12IX = adresa schránkyIY = obsah zprávyvrací: A = chyba
Seznam systémových proměnných (1)
AKTHED Adresa hlavičky právě běžícího procesu
AKTPRIO Priorita právě běžícího procesu
AKTNUM Číslo aktivního procesu
MEMADR Adresa 1 byte volné paměti pro alokaci schránek
TIMRTM Počet tiků od startu jádra RTMONu
MSN Maximální přípustné číslo služby
Seznam systémových proměnných (2)
NUMHED Další volné číslo procesu
NUMQUE Další volní číslo schránky
TPNX Adresa dalšího volného záznamu v tabulce hlaviček
TQNX Adresa dalšího volného záznamu v tabulce schránek
TSNX Adresa volné adresy v oblasti zásobníků pro alokaci
Seznam systémových proměnných (3)
TPSRC Velikost jednoho záznamu v tabulce hlaviček
CYKNX Ukazatel na další volný byte v CYKL
TPLS Adresa poslední hlavičky procesu v tabulce hlaviček
Systémové tabulky
TABHED Tabulka hlaviček procesů (max.20)
TABQUE Tabulka schránek (ma.20)
TABSRV Tabulka adresa služeb (zatím 13)
STACK Prostor pro zásobníky (20 zásobníků po 32 bytech – lze dynamicky měnit velikost jednotlivých zásobníků, ale nesmí se překročit průměr 32 na jeden).
Mapa paměti (1)
NÁVĚŠTÍ POPIS
TABHED Tabulka 20 uživatelských vektorů procesů
TABQUE Tabulka 20 uživatelských schránek
TABSRV Tabulka adres služeb (pro manažer služeb)
STACKS Oblast pro 20 zásobníků uživatelských procesů
Mapa paměti (2)
NÁVĚŠTÍ POPIS
TABCYK Tabulka pro vyhodnocení cyklického přepínání procesů
AKTHED Počátek bloku systémových proměnných
RTSTRT Startovací rutina systému
RTEND Ukončovací rutina systému
DUMMY Vytěžovací proces systému
Mapa paměti (3)
NÁVĚŠTÍ POPIS
TIK Podprogram obsluhy přerušení od obvodu reálného času
JADRO Rutina zajišťující přepínání a řízení procesů
SERV Manažer služeb
FNDTPH Rutina pro hledání adresy vektoru procesu podle čísla procesu
Mapa paměti (4)
NÁVĚŠTÍ POPIS
CRTP Služba založení procesu
STRP Služba nastartování procesu
DLYP Služba pozastavení procesu
CONP Služba ukončující pozastavení pro.
CHPP Služba změny periody spouštění pro.
STOP Služba zastavení procesu
ABRP Služba zrušení procesu
Mapa paměti (5)
NÁVĚŠTÍ POPIS
CRTQ Služba založení schránky
WRTQ Služba zápisu dat do schránky bez čekání
WRWQ Služba zápisu dat do schránky s čekáním
REDQ Služba čtení dat ze schránky bez čekání
RDWQ Služba čtení dat ze schránky s čekáním
Mapa paměti (6)
NÁVĚŠTÍ POPIS
DELQ Služba zrušení schránky
QSERV Rutina zajišťující synchronizaci schr.
DINIT Ovladače displeje (Mesit)
RTCINIT Ovladače obvodu reálného času (Mesit)
MAIN Blok uživatelských procesů
NEMADR Ukazatel na první volný byte paměti
MAIN JSR RTSTRT Inicializace RTMONu a jeho spuštění
LDAA #$01 Vyplnění hlavičky procesu 1
LDAB #05 priorita
LDX #PROC1 Adresa začátku zásobníku
LDY #32 Velikost zásobníku
JSR SERV
STAB IDE1 Uschová čísla procesu
Hlavní program (1)
LDAA #$01 Vyplnění hlavičky procesu 2
LDAB #05 Priorita
LDX #PROC2 Adresa začátku procesu
LDY #32 Velikost zásobníku
JSR SERV
STAB IDE2 Uschová čísla procesu
Hlavní program (2)
Hlavní program (3)
LDAA #$02 Spuštění procesu 1
LDAB IDE1 Identifikátor
LDX #$0000 Tiků do startu
LDY #$0004 Perioda spuštění
JSR SERV Start procesu
Hlavní program (4)
LDAA #$02 Spuštění procesu 2
LDAB IDE2 Identifikátor
LDX #$0000 Tiků do startu
LDY #$0008 Perioda spuštění
JSR SERV Start procesu
Hlavní program (5)
LDAA #$03 Služba DLYP
LDAB #$00 Pozastavení hlavního programu
LDX #$0000 neomezeně
JSR SERV Za touto instrukcí bude pokračovat
JSR RTEND Ukončení práce jádra RTMONu
RTS
Procesy (1)
Kód procesu P1, používá lokální proměnnou PROM1
PROC1 JSR dline1 Na řádek 1 vypisuje proměnnou PROM1
LDAA #’1’
JSR douta
LDAA PROM1
JSR douta
Procesy (3)
L1 LDAA #’A’
BRA L2
PROM1 FCB ‘A’ Lokální proměnná
* Kód procesu P2, používá lokální proměnnou PROM1
Procesy (4)
PROC2 JSR dline2 Na řádek 2 vypisuje proměnnou PROM1
LDAA #’2’
JSR douta
LDAA PROM2
CMPA #’Z’
BEQ L3
INCA
Procesy (5)
L4 STAA PROM2
LDAA #$06 Služba STOP
LDAB IDE2
JSR SERV
L3 LDAA #’A’
BRA L4
PROM2 FCB ‘A’ Lokální proměnná
Programový systém DEMORTM(1)
Systém pracuje s pěti procesy: PROCES 1:
Je periodicky spuštěn, vypisuje na obrazovku vzestupnou posloupnost čísel od 1 do 5. Po dosažení čísla 5 se čítá znovu od 1. V případě lichého čísla pošle zprávu Z1 pro PROCES 3. V případě sudého čísla posílá zprávu Z2 pro PROCES 4.Perioda spouštění: 5 s = 91 tikůPriorita procesu: 20
PROCES 2: Jednorázově spouštěn. Po spuštění vypisuje na obrazovku znak „ G “ a pozastaví se na 3 s. Po znovuspuštění znak vymaže.Perioda spouštění: jednorázové spouštěníPriorita procesu: 3
Programový systém DEMORTM(2)
PROCES 3: Čeká na zprávu od PROCESu 1, když ji obdrží vypisuje znak „ 3 “ a spustí jednorázově PROCES 2.
Perioda spouštění: jednorázové spouštění
Priorita procesu: 3
Programový systém DEMORTM(3)
PROCES 4: Čeká na zprávu od PROCESu 1, když ji obdrží vypisuje znak „ 4 „ a spustí jednorázově PROCES 2.
Perioda spouštění: jednorázové spouštění
Priorita procesu: 15
Programový systém DEMORTM(4)
PROCES 5: Proces pro obsluhu spouštění a zastavování procesů 1, 2, 3, 4. Spouštění se děje zadáním znaku „ G „ a čísla procesu, zastavování je obdobné, zadáním znaku „ S “ a čísla procesu. Pro ukončení programu se zadá znak „ E „ a počítač se vrátí zpět do prostředí MS DOSu.
Programový systém DEMORTM(5)
PROCES 5 - pokračování
Při spuštění procesu se vypisuje na spodním řádku „PROCES i“ což signalizuje, že příslušný proces byl spuštěn, po jeho zastavení signalizace zmizí.Perioda spouštění: jednorázové spouštěníPriorita procesu : 29
Program (1)
# include <rtm.h># include <conio.h># include <stdarg.h>IDPROC *proces_1_id,
*proces_2_id,*proces_3_id,*proces_4_id,*proces_5_id,*init_id;
IDQUEUE *S1, *S2;
Program (2)
void proces_1 ( void );void proces_2 ( void );void proces_3 ( void );void proces_4 ( void );void proces_5 ( void );int print ( int x, int y, char *str,...);void main ( void ){rtm_init (&init_id);
Program (3)
rtm_create_p ("PROCES1", 20, proces_1, 1000, &proces_1_id);rtm_create_p ("PROCES2", 3, proces_2, 1000, &proces_2_id);rtm_create_p ("PROCES3", 23, proces_3, 1000, &proces_3_id);rtm_create_p ("PROCES4", 15, proces_4, 1000, &proces_4_id);rtm_create_p ("PROCES5", 29, proces_5, 1000, &proces_5_id);
rtm_create_q ("S1", 1, 1, &S1);rtm_create_q ("S2", 1, 1, &S2);
rtm_start_p (proces_5_id, 0L, 0L);
rtm_delay_p (init_id, 0L);
Program (4)
rtm_ch_period_p(proces_1_id,0);
rtm_stop_p (proces_1_id);
rtm_stop_p (proces_2_id);
rtm_stop_p (proces_3_id);
rtm_stop_p (proces_4_id);
rtm_stop_p (proces_5_id);
Program (5)
rtm_abort_p (proces_1_id);
rtm_abort_p (proces_2_id);
rtm_abort_p (proces_3_id);
rtm_abort_p (proces_4_id);
rtm_abort_p (proces_5_id);
Program (6)
rtm_end (init_id);
clrscr();printf(" Porgram DEMORTM ukoncen \n");} void proces_1 ( void ){static int i=1;char sprava1='3';char sprava2='4';
Program (7)
print(1,7,"Proces 1 : %d",i);
if(i%2)
{
rtm_write_q(S1,&sprava1);
}
else {
rtm_write_q(S2,&sprava2);
}
Program (8)
i++;if(i==6) i=1;rtm_stop_p(proces_1_id);}void proces_2 ( void ){print(1,8,"Proces 2 : G");
rtm_delay_p( proces_2_id, 54L);
print(1,8," ");
Program (9)
rtm_stop_p(proces_2_id);}
void proces_3 ( void ){static int i=0;char sprava;print(1,9,"Proces 3 : ");
rtm_read_q_w ( S1, &sprava );
Program (10)if(i)
print(1,9,"Proces 3 : 3 ");else
print(1,9,"Proces 3 : 33");i=!i;rtm_start_p(proces_2_id, 0L, 0L );print(1,9," ");rtm_stop_p ( proces_3_id );}void proces_4 ( void ){static int i=0;char sprava;
Program (11)print(1,10,"Proces 4 : ");rtm_read_q_w ( S2, &sprava );if(i)
print(1,10,"Proces 4 : 4 ");else
print(1,10,"Proces 4 : 44");i=!i;rtm_start_p(proces_2_id, 0L, 0L );print(1,10," ");rtm_stop_p(proces_4_id);}
Program (12)void proces_5 ( void )
{
int sluzba;
int proces;
clrscr();
printf("Demonstracni program pro RTMON");
while(1)
{
Program (13)while(1)
{gotoxy(1,3);printf("Zadej sluzbu : ");clreol();sluzba=getche();switch(sluzba)
{case 'G' :case 'g' :
Program (14)case 'G' :case 'g' :
gotoxy(1,4);printf("Spusti proces : ");clreol();proces=getche();gotoxy(1,4);clreol();switch(proces)
{
Program (15){case '1' :
rtm_start_p(proces_1_id,0L,91L);break;
case '2' :rtm_start_p(proces_2_id,0L,0L);break;
case '3' :rtm_start_p(proces_3_id,0L,0L);break;
Program (17)case 'S' :case 's' :
gotoxy(1,4);printf("Zastav proces : ");clreol();proces=getche();gotoxy(1,4);clreol();switch(proces)
{
Program (18)case '1' :
rtm_ch_period_p(proces_1_id,0);rtm_stop_p(proces_1_id);print(1,7," ");break;
case '2' :rtm_stop_p(proces_2_id);print(1,8," ");break;
Program (19)case '3' :
rtm_stop_p(proces_3_id);print(1,9," ");break;
case '4' :rtm_stop_p(proces_4_id);print(1,10," ");break;
default :putch(7);}
break;
Program (21)int print ( int x, int y, char *str,...){int _x,_y;va_list argptr;int cnt;// uchovam kurzor_x=wherex();_y=wherey();// nastavym kurzorgotoxy(x,y);