+ All Categories
Home > Documents > RTMON HC 11

RTMON HC 11

Date post: 30-Dec-2015
Category:
Upload: vielka-cline
View: 26 times
Download: 0 times
Share this document with a friend
Description:
RTMON HC 11. Prof. Ing. Vladimír Vašek, CSc. 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. - PowerPoint PPT Presentation
84
RTMON HC 11 Prof. Ing. Vladimír Vašek, CSc.
Transcript

RTMON HC 11

Prof. Ing. Vladimír Vašek, CSc.

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

Vektor schránky

Název Délka Význam

QSTAT 1 Stav schránky

QBOX 2 Obsah schránky

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á

POPIS SLUŽEB (1)

Služby pro práci s procesy

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.

POPIS SLUŽEB (2)

Služby pro práci se schránkami a zprávami

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

Demonstrační příklad programu v reálném čase

Hlavní program

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

Blok identifikátorů použitých procesů

IDE1FCB 0 číslo procesu 1 IDE2FCB 0 číslo procesu 2

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 (2)

LDAA PROM1

CMPA #’Z’

BEQ L1

INCA

L2 STAA PROM1

LDAA #$06 Služba STOP

LDAB IDE1

JSR SERV

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 (16)case '4' :

rtm_start_p(proces_4_id,0L,0L);

break;

default :

putch(7);

}

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 (20)

case 'E' :

case 'e' :

rtm_continue_p(init_id);

break;

default : putch(7);

}

}

}

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);

Program (22)

// poslu zasobnik do funkce vprintf

va_start(argptr, str);

cnt = vprintf(str, argptr);

va_end(argptr);

// vratim kurzor

gotoxy(_x,_y);

return(cnt);

}


Recommended