You are on page 1of 82

Elektrotehniki fakultet Univerziteta u Beogradu

Katedra za raunarsku tehniku i informatiku


Programiranje u realnom vremenu (TE5PRV)

PROJEKAT ZA
DOMAI ZADATAK

Autor: Nastavnik:
Ivan Ivanov, 430/2001 doc. dr Dragan Miliev
ivan.ivanov@elsys-design.com

U Beogradu,
maj 2006. godine
S ADR AJ
1 UVOD .................................................................................................................1
2 ZADATAK 1 Test rasporedivosti zasnovan na vremenu odziva.....................2
2.1 Postavka problema.....................................................................................2
2.2 Reenje problema.......................................................................................2
2.3 Test-primeri................................................................................................7
3 ZADATAK 2 Sistem za nadzor rudnika ..........................................................9
3.1 Postavka problema.....................................................................................9
3.2 Reenje problema.......................................................................................9
3.3 Izmene u kolskom Jezgru.......................................................................41
3.4 Primer izlaznog fajla arhive..................................................................42
4 ZADATAK 3 Proraun rasporedivosti...........................................................44
4.1 Postavka problema...................................................................................44
4.2 Reenje problema.....................................................................................44
5 ZADATAK 4 Jezgro sa preuzimanjem i FPS ................................................46
5.1 Postavka problema...................................................................................46
5.2 Reenje problema.....................................................................................46
6 LITERATURA..................................................................................................80

1 UVOD
Projektni zadatak sastoji se u realizaciji sledeih delova:
Zadatak 1 Test rasporedivosti zasnovan na vremenu odziva,
Zadatak 2 Sistem za nadzor rudnika,
Zadatak 3 Proraun rasporedivosti, i
Zadatak 4 Jezgro sa preuzimanjem i FPS.
Projektni zadatak je raen na jeziku C++, korienjem kolskog jezgra i okruenja Borland
C++ 3.1, po preporuci.
Radi lakeg korienja i razumevanja izvornog koda, pri pisanju koda potovana su
odreena pravila, tako da se svaki fajl sastoji iz sledeih delova:
zaglavlje sadri podatke: naziv, namenu, autore i kratak opis fajla sa spiskom
deklarisanih, odnosno definisanih klasa, tipova i funkcija,
deklaracije, odnosno definicije klasa, i
definicije pomonih globalnih funkcija.
Za merenje proteklog vremena korien je hardverski prekid personalnog raunara na
adresi 0x1Ch, to dozvoljava merenje vremena sa rezolucijom od priblino 55 ms. Korienje
ovog periodinog prekida implementirano je odgovarajuim klasama.


1
2 ZADATAK 1 Test rasporedivosti zasnovan na vremenu odziva
2.1 Postavka problema
Potrebno je implementirati test rasporedivosti za FPS zasnovan na vremenu odziva (engl.
response time) za skup nezavisnih, periodinih procesa sa fiksnim prioritetima poznatim u vreme
prevoenja.
Potrebno je implementirati program koji e za ulazne podatke zadate u ulaznoj datoteci dati
izvetaj sa rezultatima testa rasporedivosti u izlaznoj datoteci. Obe datoteke su u tekstualnom
(ASCII) formatu.
Program treba da se izvrava kao konzolna aplikacija (poziva se iz komandne linije). Prvi i
drugi argument komandne linije su opcioni i zadaju nazive ulazne i izlazne datoteke,
respektivno. Ako se drugi argument komandne linije izostavi, podrazumeva se naziv izlazne
datoteke out put . t xt . Ako se oba argumenta izostave, podrazumeva se naziv ulazne datoteke
i nput . t xt i izlazne out put . t xt .
Ulazna datoteka sadri podatke o skupu procesa ija se rasporedivost ispituje. Svaka
neprazna linija ove datoteke sadri informacije o jednom procesu iz skupa procesa. Maksimalan
broj procesa je 256. Svaka linija sadri redom tri racionalna broja: prvi broj oznaava periodu T,
drugi vremenski rok D, a trei vreme izvravanja u najgorem sluaju C datog procesa. Sve
veliine su izraene u istim jedinicama vremena.
Za dati skup procesa program treba da sprovede test rasporedivosti po DMPO FPS i da
generie izvetaj u izlaznoj datoteci.
2.2 Reenje problema
U nastavku teksta dat je kompletan izvorni kod na jeziku C++ kojim je implementiran
pomenuti test rasporedivosti.
Datoteka par ams. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Fi xed- Pr i or i t y Schedul i ng based on Response Ti me
/ / Modul e: Test schedul er
/ / Fi l e: par ams. h
/ / Cr eat ed: December 2005
/ / Revi sed: Mar ch 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Var i ous syst empar amet er s
/ / Types: Type

#i f ndef _PARAMS_H_
#def i ne _PARAMS_H_

t ypedef doubl e Type;

char * const I N_FI LE_NAME = " i nput . t xt " ;
char * const OUT_FI LE_NAME = " out put . t xt " ;

2
const i nt maxNum= 256;
const i nt PRECI SI ON = 4;

#endi f
Datoteka pr ocess. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Fi xed- Pr i or i t y Schedul i ng based on Response Ti me
/ / Modul e: Test schedul er
/ / Fi l e: pr ocess. h
/ / Cr eat ed: December 2005
/ / Revi sed: Mar ch 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Pr ocess
/ / Cl asses: Pr ocess

#i f ndef _PROCESS_H_
#def i ne _PROCESS_H_

#i ncl ude " par ams. h"

cl ass Pr ocess {
publ i c:

Pr ocess ( i nt or d = 0, Type t = 0, Type d = 0, Type c = 0) :
Or d( or d) , T( t ) , D( d) , C( c) , U( c/ t ) { };

Type get Val ueT ( ) ;
Type get Val ueD ( ) ;
Type get Val ueC ( ) ;
Type get Val ueU ( ) ;
Type get Val ueR ( ) ;
i nt get Val ueOr d ( ) ;
i nt get Val ueOK ( ) ;

voi d set Val ueR ( Type) ;
voi d set Val ueOK ( i nt ) ;

pr i vat e:

i nt Or d; / / or di nal number
Type T; / / per i od
Type D; / / deadl i ne
Type C; / / wor st - case execut i on t i me
Type R; / / r esponse t i me
Type U; / / ut i l i zat i on
i nt OK;

};

i nl i ne i nt Pr ocess: : get Val ueOr d( ) {
r et ur n Or d;
}

i nl i ne Type Pr ocess: : get Val ueT( ) {
r et ur n T;
}

i nl i ne Type Pr ocess: : get Val ueD( ) {
r et ur n D;
}

i nl i ne Type Pr ocess: : get Val ueC( ) {
r et ur n C;
}

i nl i ne Type Pr ocess: : get Val ueU( ) {
3
r et ur n U;
}

i nl i ne Type Pr ocess: : get Val ueR( ) {
r et ur n R;
}

i nl i ne i nt Pr ocess: : get Val ueOK( ) {
r et ur n OK;
}

i nl i ne voi d Pr ocess: : set Val ueR( Type r ) {
R = r ;
}

i nl i ne voi d Pr ocess: : set Val ueOK( i nt ok) {
OK = ok;
}

#endi f
Datoteka schedul . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Fi xed- Pr i or i t y Schedul i ng based on Response Ti me
/ / Modul e: Test schedul er
/ / Fi l e: schedul . h
/ / Cr eat ed: December 2005
/ / Revi sed: Mar ch 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Test schedul er
/ / Cl asses: Test Schedul er

#i f ndef _SCHEDUL_H_
#def i ne _SCHEDUL_H_

#i ncl ude <i ost r eam. h>
#i ncl ude <f st r eam. h>
#i ncl ude " pr ocess. h"

cl ass Test Schedul er {
publ i c:

Test Schedul er ( char *, char *) ;
~Test Schedul er ( ) ;

voi d Test ( ) ;

pr ot ect ed:

voi d r ead ( ) ;
voi d wr i t e ( ) ;

voi d sor t ByPr i or i t y ( ) ;
voi d sor t ByOr d ( ) ;
voi d sol veRandU ( ) ;

voi d r epor t Er r or ( ) ;

pr i vat e:

voi d swap ( Pr ocess&, Pr ocess&) ;

char * i nFi l eName;
char * out Fi l eName;

Pr ocess* pr oc[ maxNum] ;
i nt Num;
4
Type U;
i nt f l ag;

i nt er r or ;

};

#endi f
Datoteka schedul . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Fi xed- Pr i or i t y Schedul i ng based on Response Ti me
/ / Modul e: Test schedul er
/ / Fi l e: schedul . cpp
/ / Cr eat ed: December 2005
/ / Revi sed: Mar ch 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Test schedul er
/ / Cl asses: Test Schedul er

#i ncl ude " schedul . h"
#i ncl ude <i ost r eam. h>
#i ncl ude <f st r eam. h>
#i ncl ude <i omani p. h>
#i ncl ude <mat h. h>

Test Schedul er : : Test Schedul er ( char * i n, char * out ) {
i nFi l eName = i n;
out Fi l eName = out ;
Num= 0;
U = 0;
f l ag = 1;
er r or = 0;
}

Test Schedul er : : ~Test Schedul er ( ) {
f or ( i nt i =Num- 1; i >=0; i - - ) {
Pr ocess* cur = pr oc[ i ] ;
del et e cur ;
}
}

voi d Test Schedul er : : r ead ( ) {
i f st r eami nFi l e;
i nFi l e. open ( i nFi l eName) ;
i f ( ! i nFi l e) er r or = 1;
el se {
f or ( i nt i =0; ; i ++) {
i nFi l e >> ws; / / ski p whi t e spaces
i f ( i nFi l e. eof ( ) ) {
Num= i ;
br eak;
}
Type t , d, c;
i nFi l e >> t >> d >> c;
pr oc[ i ] = new Pr ocess( i +1, t , d, c) ;
}
i nFi l e. cl ose ( ) ;
}
}

voi d Test Schedul er : : wr i t e ( ) {
of st r eamout Fi l e;
out Fi l e. open ( out Fi l eName) ;
i f ( ! out Fi l e) er r or = 2;
el se {
f or ( i nt i =0; i <Num; i ++) {
5
out Fi l e << " Pr ocess" << pr oc[ i ] - >get Val ueOr d( ) << " \ t " ;
out Fi l e << " T=" << pr oc[ i ] - >get Val ueT( ) << " \ t " ;
out Fi l e << " D=" << pr oc[ i ] - >get Val ueD( ) << " \ t " ;
out Fi l e << " R=" << set pr eci si on( PRECI SI ON) << pr oc[ i ] - >get Val ueR( ) << " \ t " ;
out Fi l e << ( ( pr oc[ i ] - >get Val ueOK( ) ) ? " OK" : " Mi ssed" ) << endl ;
}
out Fi l e << " U=" << set pr eci si on( PRECI SI ON) << U << endl ;
out Fi l e << ( f l ag ? " Schedul abl e" : " Not schedul abl e" ) ;
out Fi l e. cl ose ( ) ;
}
}

voi d Test Schedul er : : sor t ByPr i or i t y ( ) {
f or ( i nt i =0; i <Num- 1; i ++)
f or ( i nt j =i +1; j <Num; j ++)
i f ( ( pr oc[ j ] - >get Val ueD( ) <pr oc[ i ] - >get Val ueD( ) ) | |
( pr oc[ j ] - >get Val ueD( ) ==pr oc[ i ] - >get Val ueD( ) &&
pr oc[ j ] - >get Val ueT( ) <pr oc[ i ] - >get Val ueT( ) ) )
swap( *pr oc[ j ] , *pr oc[ i ] ) ;
}

voi d Test Schedul er : : sor t ByOr d ( ) {
f or ( i nt i =0; i <Num- 1; i ++)
f or ( i nt j =i +1; j <Num; j ++)
i f ( pr oc[ j ] - >get Val ueOr d( ) < pr oc[ i ] - >get Val ueOr d( ) )
swap( *pr oc[ j ] , *pr oc[ i ] ) ;
}

voi d Test Schedul er : : swap ( Pr ocess& pr oc1, Pr ocess& pr oc2) {
Pr ocess t emp = pr oc1;
pr oc1 = pr oc2;
pr oc2 = t emp;
}

voi d Test Schedul er : : sol veRandU ( ) {
Type u = 0;
i nt f l g = 1;
f or ( i nt i =0; i <Num; i ++) {
Type W_ol d = pr oc[ i ] - >get Val ueC( ) ;
whi l e ( 1) {
Type W_new = pr oc[ i ] - >get Val ueC( ) ;
f or ( i nt j =0 ; j <=i - 1; j ++)
W_new += cei l ( W_ol d/ pr oc[ j ] - >get Val ueT( ) ) *pr oc[ j ] - >get Val ueC( ) ;
i f ( W_new == W_ol d) {
i f ( W_new <= pr oc[ i ] - >get Val ueD( ) )
pr oc[ i ] - >set Val ueOK( 1) ;
el se {
pr oc[ i ] - >set Val ueOK( 0) ;
f l g = 0;
}
br eak;
}
i f ( W_new > pr oc[ i ] - >get Val ueD( ) ) {
pr oc[ i ] - >set Val ueOK( 0) ;
f l g = 0;
W_ol d = W_new;
br eak;
}
W_ol d = W_new;
}
pr oc[ i ] - >set Val ueR( W_ol d) ;
u += pr oc[ i ] - >get Val ueU( ) ;
}
U = u;
f l ag = ( U<=1) && f l g;
}

voi d Test Schedul er : : r epor t Er r or ( ) {
6
cer r << endl << " *** ERROR: " ;
swi t ch ( er r or ) {
case 1: cer r << " Can' t open i nput f i l e! ***" << endl ;
br eak;
case 2: cer r << " Can' t open out put f i l e! ***" << endl ;
br eak;
def aul t : br eak;
}
}

voi d Test Schedul er : : Test ( ) {
r ead ( ) ;
i f ( er r or ! = 1) {
sor t ByPr i or i t y ( ) ;
sol veRandU ( ) ;
sor t ByOr d ( ) ;
wr i t e ( ) ;
}
i f ( er r or ! = 0) r epor t Er r or ( ) ;
}
Datoteka mai n. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Fi xed- Pr i or i t y Schedul i ng based on Response Ti me
/ / Modul e: Test schedul er
/ / Fi l e: mai n. cpp
/ / Cr eat ed: December 2005
/ / Revi sed: Mar ch 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Test schedul er mai n modul e
/ / Funct i ons: mai n

#i ncl ude " schedul . h"
#i ncl ude " par ams. h"

voi d mai n ( i nt ar gc, char *ar gv[ ] ) {
char *i nFi l eName = I N_FI LE_NAME, *out Fi l eName = OUT_FI LE_NAME;

swi t ch ( ar gc) {
case 1: br eak;
case 2: i nFi l eName = ar gv[ 1] ;
br eak;
case 3: i nFi l eName = ar gv[ 1] ;
out Fi l eName = ar gv[ 2] ;
br eak;
def aul t : cer r << endl << " *** ERROR: So many i nput par amet er s! ***" << endl ;
br eak;
}
Test Schedul er t est Sch( i nFi l eName, out Fi l eName) ;
t est Sch. Test ( ) ;
}
2.3 Test-primeri
U nastavku su dati test-primeri kojima je ilustovan ispravan rad testa rasporedivosti.
Ulaz prvog test-primera Izlaz prvog test-primera
80 30 20
100 100 10
100 60 15
Pr ocess1 T=80 D=30 R=20 OK
Pr ocess2 T=100 D=100 R=45 OK
Pr ocess3 T=100 D=60 R=35 OK
U=0. 5
Schedul abl e

7
Ulaz drugog test-primera Izlaz drugog test-primera
18 18 2
12 12 1
5 5 1
24 24 4
6 6 1
Pr ocess1 T=18 D=18 R=5 OK
Pr ocess2 T=12 D=12 R=3 OK
Pr ocess3 T=5 D=5 R=1 OK
Pr ocess4 T=24 D=24 R=12 OK
Pr ocess5 T=6 D=6 R=2 OK
U=0. 7278
Schedul abl e

Ulaz treeg test-primera Izlaz treeg test-primera
9053 5234 528
9496 1694 605
6151 2121 938
6524 6346 478
8459 2641 913
4797 4595 964
7913 3468 761
1700 700 148
5593 200 125
5939 3647 295
Pr ocess1 T=9053 D=5234 R=5277 Mi ssed
Pr ocess2 T=9496 D=1694 R=878 OK
Pr ocess3 T=6151 D=2121 R=1964 OK
Pr ocess4 T=6524 D=6346 R=7288 Mi ssed
Pr ocess5 T=8459 D=2641 R=2729 Mi ssed
Pr ocess6 T=4797 D=4595 R=4749 Mi ssed
Pr ocess7 T=7913 D=3468 R=3490 Mi ssed
Pr ocess8 T=1700 D=700 R=273 OK
Pr ocess9 T=5593 D=200 R=125 OK
Pr ocess10 T=5939 D=3647 R=3785 Mi ssed
U=0. 9119
Not schedul abl e


8
3 ZADATAK 2 Sistem za nadzor rudnika
3.1 Postavka problema
Potrebno je u potpunosti implementirati jednostavan softverski sistem za nadzor ureaja u
rudniku detaljno opisan u poglavlju Projektovanje prema vremenskim zahtevima u skriptama
za predavanja.
Sistem treba da bude u potpunosti realizovan prema zahtevima i preporukama koje su date
u skriptama. Sve parametre sistema (npr. kritine vrednosti veliina koje se mere) izabrati i
definisati kao simbolike konstante i lokalizovati ih u programu. Slino, sve interakcije sa
ulazno/izlaznim ureajima treba lokalizovati u posebne procedure koje e simulirati rad sa
stvarnim hardverskim ureajima realnog sistema.
Izgled korisnikog interfejsa i nivo njegove informativnosti i intuitivnosti treba da odredi
student. U svakom sluaju, korisniki interfejs mora da bude interaktivan, tako da obezbedi:
runo upravljanje aktuatorima (npr. ukljuivanje i iskljuivanje pumpe), i
interaktivnu simulaciju vanrednih situacija.
3.2 Reenje problema
U nastavku teksta dat je kompletan izvorni kod na jeziku C++ kojim je implementiran
pomenuti sistem za nadzor rudnika.
Datoteka adc. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: A/ D conver t er
/ / Fi l e: adc. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of A/ D conver t er
/ / Cl asses: ADC

#i f ndef _ADC_
#def i ne _ADC_

#i ncl ude " env. h"
#i ncl ude " par ams. h"

cl ass ADC {
publ i c:

ADC ( i nt ) ;
~ADC ( ) ;

voi d st ar t Conver si on ( ) ;
Val ue get Val ue ( ) ;
voi d r eadVal ue ( ) ;

9
pr i vat e:

i nt myI D;
Val ue val ue;

};

#endi f
Datoteka adc. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: A/ D conver t er
/ / Fi l e: adc. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of A/ D conver t er
/ / Cl asses: ADC

#i ncl ude " adc. h"

ADC: : ADC ( i nt I D) : myI D( I D) { }

ADC: : ~ADC ( ) { }

voi d ADC: : st ar t Conver si on ( ) { }

Val ue ADC: : get Val ue ( ) {
r et ur n val ue;
}

voi d ADC: : r eadVal ue ( ) {
val ue = Envi r onment : : I nst ance( ) - >Measur e( myI D) ;
}
Datoteka al ar m. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Al ar m
/ / Fi l e: al ar m. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of al ar m
/ / Cl asses: Al ar m

#i f ndef _ALARM_
#def i ne _ALARM_

#i ncl ude " semaphor . h"
#i ncl ude " par ams. h"

cl ass Al ar m{
publ i c:

st at i c Al ar m* I nst ance( ) ;

voi d al ar mOn ( i nt ) ;
voi d al ar mOf f ( i nt ) ;
char al ar mSt at e ( i nt ) ;

pr i vat e:

Al ar m( ) ;
st at i c Al ar m* i nst ance;

10
Semaphor e mut ex;

char anyAl ar m;

char CH4Al ar m;
char COAl ar m;
char ai r Al ar m;
char wat er l vAl ar m;
char pumpAl ar m;

};

#endi f
Datoteka al ar m. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Al ar m
/ / Fi l e: al ar m. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of al ar m
/ / Cl asses: Al ar m

#i ncl ude " al ar m. h"

Al ar m: : Al ar m( ) {
anyAl ar m= 0;
}

Al ar m* Al ar m: : I nst ance( ) {
r et ur n i nst ance;
}

Al ar m* Al ar m: : i nst ance = new Al ar m;

voi d Al ar m: : al ar mOn ( i nt I D) {
Mut ex dummy( &mut ex) ;
swi t ch ( I D) {
case CH4_I D: CH4Al ar m= 1;
anyAl ar m= 1;
br eak;
case CO_I D: COAl ar m= 1;
anyAl ar m= 1;
br eak;
case ai r _I D: ai r Al ar m= 1;
anyAl ar m= 1;
br eak;
case wat er l v_I D: wat er l vAl ar m= 1;
anyAl ar m= 1;
br eak;
case pump_I D: pumpAl ar m= 1;
anyAl ar m= 1;
br eak;
def aul t : br eak;
}
}

voi d Al ar m: : al ar mOf f ( i nt I D) {
Mut ex dummy( &mut ex) ;
swi t ch ( I D) {
case CH4_I D: CH4Al ar m= 0;
br eak;
case CO_I D: COAl ar m= 0;
br eak;
case ai r _I D: ai r Al ar m= 0;
11
br eak;
case wat er l v_I D: wat er l vAl ar m= 0;
br eak;
case pump_I D: pumpAl ar m= 0;
br eak;
def aul t : br eak;
}
i f ( CH4Al ar m+ COAl ar m+ ai r Al ar m+ wat er l vAl ar m+ pumpAl ar m== 0) anyAl ar m= 0;
}

char Al ar m: : al ar mSt at e ( i nt I D) {
Mut ex dummy( &mut ex) ;
swi t ch ( I D) {
case ANY_I D: r et ur n anyAl ar m;
case CH4_I D: r et ur n CH4Al ar m;
case CO_I D: r et ur n COAl ar m;
case ai r _I D: r et ur n ai r Al ar m;
case wat er l v_I D: r et ur n wat er l vAl ar m;
case pump_I D: r et ur n pumpAl ar m;
def aul t : r et ur n - 1;
}
}
Datoteka ar chi ve. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Ar chi ve
/ / Fi l e: ar chi ve. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of ar chi ve
/ / Cl asses: Ar chi ve

#i f ndef _ARCHI VE_
#def i ne _ARCHI VE_

#i ncl ude <f st r eam. h>
#i ncl ude <i omani p. h>
#i ncl ude " syst i me. h"
#i ncl ude " env. h"
#i ncl ude " par ams. h"

cl ass Ar chi ve {
publ i c:

st at i c Ar chi ve* I nst ance( ) ;
~Ar chi ve( ) ;

voi d ar chEvent ( char *) ;
voi d ar chVal ues ( ) ;
voi d ar chAl ar m ( char , char *) ;
voi d ar chMessage ( char *) ;

pr i vat e:

Ar chi ve( ) ;

of st r eamout put Fi l e;

};

#endi f
Datoteka ar chi ve. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
12
/ / Modul e: Ar chi ve
/ / Fi l e: ar chi ve. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of ar chi ve
/ / Cl asses: Ar chi ve

#i ncl ude " ar chi ve. h"

Ar chi ve* Ar chi ve: : I nst ance( ) {
st at i c Ar chi ve i nst ance;
r et ur n &i nst ance;
}

Ar chi ve: : Ar chi ve( ) {
SysTi me* cl ock = SysTi me: : I nst ance( ) ;
out put Fi l e. open( out put Fi l eName, of st r eam: : out | of st r eam: : app) ;
out put Fi l e << " *****************************************************" << endl ;
out put Fi l e << " C O N T R O L S Y S T E M F O R M I N E " << endl ;
out put Fi l e << " ****** ******" << endl ;
out put Fi l e << " St ar t dat e & t i me: " <<
set w( WI DTH) << set f i l l ( ' 0' ) <<
( i nt ) cl ock- >get St ar t Dat e( ) . da_day <<
" . " << set w( WI DTH) << ( i nt ) cl ock- >get St ar t Dat e( ) . da_mon <<
" . " << set w( WI DTH) << ( i nt ) cl ock- >get St ar t Dat e( ) . da_year <<
" . " << set w( WI DTH) << ( i nt ) cl ock- >get St ar t Ti me( ) . t i _hour <<
" : " << set w( WI DTH) << ( i nt ) cl ock- >get St ar t Ti me( ) . t i _mi n <<
" : " << set w( WI DTH) << ( i nt ) cl ock- >get St ar t Ti me( ) . t i _sec <<
" . " << set w( WI DTH+1) << ( i nt ) cl ock- >get St ar t Ti me( ) . t i _hund << endl ;
out put Fi l e << " *****************************************************" << endl ;
}

Ar chi ve: : ~Ar chi ve( ) { }

voi d Ar chi ve: : ar chEvent ( char * message) {
t ypeTi me hour s, mi nut es, seconds, mi l i seconds;
SysTi me* cl ock = SysTi me: : I nst ance( ) ;
hour s = cl ock- >get Cur r ent Ti me( H) ;
mi nut es = cl ock- >get Cur r ent Ti me( M) ;
seconds = cl ock- >get Cur r ent Ti me( S) ;
mi l i seconds = cl ock- >get Cur r ent Ti me( MS) ;
out put Fi l e << set w( WI DTH) << set f i l l ( ' 0' ) << ( i nt ) hour s << " : " <<
set w( WI DTH) << ( i nt ) mi nut es << " : " <<
set w( WI DTH) << ( i nt ) seconds << " . " <<
set w( WI DTH+1) << ( i nt ) mi l i seconds << " " << message;
}

voi d Ar chi ve: : ar chVal ues ( ) {
Envi r onment * env = Envi r onment : : I nst ance( ) ;
ar chEvent ( " Sensor s r ead f ol l owi ng val ues: \ n" ) ;
out put Fi l e << " CH4 l evel : " << set w( WI DTH+1) << set f i l l ( ' ' ) <<
env- >Measur e( CH4_I D) << endl ;
out put Fi l e << " CO l evel : " << set w( WI DTH+1) <<
env- >Measur e( CO_I D) << endl ;
out put Fi l e << " Ai r f l ow : " << set w( WI DTH+1) <<
env- >Measur e( ai r _I D) << endl ;
out put Fi l e << " Wat er l evel : " << set w( WI DTH+1) <<
env- >Measur e( wat er l v_I D) << endl ;
out put Fi l e << " Wat er f l ow : " << set w( WI DTH+1) <<
( i nt ) env- >Wat er Fl ow( ) << endl ;
out put Fi l e << " Pump st at e : " << set w( WI DTH+1) <<
( i nt ) env- >PumpSt at e( ) << endl ;
out put Fi l e << " Pump st at us: " << set w( WI DTH+1) <<
( i nt ) env- >PumpSt at us( ) << endl ;
}

voi d Ar chi ve: : ar chAl ar m( char i d, char * message) {
13
swi t ch ( i d) {
case ON: ar chEvent ( " ALARM ON : " ) ;
br eak;
case OFF: ar chEvent ( " ALARM OFF: " ) ;
br eak;
def aul t : br eak;
}
out put Fi l e << message << endl ;
}

voi d Ar chi ve: : ar chMessage ( char * message) {
out put Fi l e << message << endl ;
out put Fi l e. cl ose( ) ;
}
Datoteka env. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Envi r onment
/ / Fi l e: env. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Envi r onment si mul at i on
/ / Cl asses: Envi r onment

#i f ndef _ENV_
#def i ne _ENV_

#i ncl ude " semaphor . h"
#i ncl ude " pump. h"
#i ncl ude " par ams. h"

cl ass Envi r onment {
publ i c:

st at i c Envi r onment * I nst ance ( ) ;

Val ue Measur e ( i nt ) ;
voi d Change ( i nt , char ) ;

voi d PumpOn ( ) ;
voi d PumpOf f ( ) ;
voi d PumpOk ( ) ;
voi d PumpFai l ( ) ;
char PumpSt at us ( ) ;
char PumpSt at e ( ) ;
char Wat er Fl ow ( ) ;


pr i vat e:

Envi r onment ( ) ;
st at i c Envi r onment * i nst ance;

Semaphor e mut ex;

Val ue CH4Level ;
Val ue COLevel ;
Val ue ai r Fl ow;
Val ue wat er Level ;
char wat er Fl ow;

char pumpSt at us;
char pumpSt at e;

};
14

#endi f
Datoteka env. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Envi r onment
/ / Fi l e: env. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Envi r onment si mul at i on
/ / Cl asses: Envi r onment

#i ncl ude " env. h"

Envi r onment * Envi r onment : : I nst ance ( ) {
r et ur n i nst ance;
}

Envi r onment * Envi r onment : : i nst ance = new Envi r onment ;

Envi r onment : : Envi r onment ( ) :
CH4Level ( CH4_I ni t i al ) , COLevel ( CO_I ni t i al ) , ai r Fl ow( ai r _I ni t i al ) ,
wat er Level ( wat er l v_I ni t i al ) , wat er Fl ow( wat er f w_I ni t i al ) ,
pumpSt at us( pumpst s_I ni t i al ) , pumpSt at e( pumpst e_I ni t i al ) { }

Val ue Envi r onment : : Measur e ( i nt I D) {
swi t ch ( I D) {
case CH4_I D: r et ur n CH4Level ;
case CO_I D: r et ur n COLevel ;
case ai r _I D: r et ur n ai r Fl ow;
case wat er l v_I D: r et ur n wat er Level ;
def aul t : r et ur n - 1;
}
}

voi d Envi r onment : : Change ( i nt I D, char Act i on) {
swi t ch ( I D) {
case CH4_I D:
i f ( Act i on==I nc) {
i f ( CH4Level + CH4_I nc <= CH4_Max) CH4Level += CH4_I nc;
}
el se i f ( Act i on==Dec) {
i f ( CH4Level >= CH4_Dec + CH4_Mi n) CH4Level - = CH4_Dec;
}
br eak;
case CO_I D:
i f ( Act i on==I nc) {
i f ( COLevel + CO_I nc <= CO_Max) COLevel += CO_I nc;
}
el se i f ( Act i on==Dec) {
i f ( COLevel >= CO_Dec + CO_Mi n) COLevel - = CO_Dec;
}
br eak;
case ai r _I D:
i f ( Act i on==I nc) {
i f ( ai r Fl ow + ai r _I nc <= ai r _Max) ai r Fl ow += ai r _I nc;
}
el se i f ( Act i on==Dec) {
i f ( ai r Fl ow >= ai r _Dec + ai r _Mi n) ai r Fl ow - = ai r _Dec;
}
br eak;
case wat er l v_I D:
i f ( Act i on==I nc) {
i f ( wat er Level + wat er l v_I nc <= wat er l v_Max) wat er Level += wat er l v_I nc;
}
15
el se i f ( Act i on==Dec) {
i f ( wat er Level >= wat er l v_Dec + wat er l v_Mi n) wat er Level - = wat er l v_Dec;
}
br eak;
case wat er f w_I D:
i f ( Act i on==I nc) {
i f ( wat er Fl ow + wat er f w_I nc <= wat er f w_Max) wat er Fl ow += wat er f w_I nc;
}
el se i f ( Act i on==Dec) {
i f ( wat er Fl ow >= wat er f w_Dec + wat er f w_Mi n) wat er Fl ow - = wat er f w_Dec;
}
br eak;
def aul t :
br eak;
}
}

voi d Envi r onment : : PumpOn ( ) {
Mut ex dummy( &mut ex) ;
pumpSt at e = pump_ON;
Pump: : I nst ance( ) - >PumpOn( ) ;
}

voi d Envi r onment : : PumpOf f ( ) {
Mut ex dummy( &mut ex) ;
pumpSt at e = pump_OFF;
Pump: : I nst ance( ) - >PumpOf f ( ) ;
}

voi d Envi r onment : : PumpOk ( ) {
Mut ex dummy( &mut ex) ;
pumpSt at us = pump_OK;
Pump: : I nst ance( ) - >PumpOk( ) ;
}

voi d Envi r onment : : PumpFai l ( ) {
Mut ex dummy( &mut ex) ;
pumpSt at us = pump_FAI LURE;
Pump: : I nst ance( ) - >PumpFai l ( ) ;
}

char Envi r onment : : PumpSt at e ( ) {
r et ur n pumpSt at e;
}

char Envi r onment : : PumpSt at us ( ) {
r et ur n pumpSt at us;
}

char Envi r onment : : Wat er Fl ow ( ) {
r et ur n wat er Fl ow;
}
Datoteka gui . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Gr aphi cal user i nt er f ace
/ / Fi l e: gui . h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Gr aphi cal user i nt er f ace
/ / Cl asses: GUI

#i f ndef _GUI _
#def i ne _GUI _

16
#i ncl ude <coni o. h>
#i ncl ude " t hr ead. h"
#i ncl ude " semaphor e. h"
#i ncl ude " t i mer . h"
#i ncl ude " al ar m. h"
#i ncl ude " env. h"
#i ncl ude " syst i me. h"
#i ncl ude " par ams. h"

cl ass GUI : publ i c Thr ead {
publ i c:

st at i c GUI * I nst ance ( ) ;
vi r t ual voi d r un ( ) ;

voi d r ef r esh ( ) ;

pr i vat e:

GUI ( ) ;
st at i c GUI * i nst ance;

voi d di spl ayGUI ( ) ;

Event ev;

};

#endi f
Datoteka gui . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Gr aphi cal user i nt er f ace
/ / Fi l e: gui . cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Gr aphi cal user i nt er f ace
/ / Cl asses: GUI

#i ncl ude " gui . h"

GUI : : GUI ( ) {
di r ect vi deo = 1;
_set cur sor t ype( _NOCURSOR) ;
st ar t ( ) ;
}

GUI * GUI : : I nst ance ( ) {
r et ur n i nst ance;
}

GUI * GUI : : i nst ance = new GUI ;

voi d GUI : : r un ( ) {
cl r scr ( ) ;
f or ( ; ; ) {
ev. wai t ( ) ;
di spl ayGUI ( ) ;
}
}

voi d GUI : : r ef r esh ( ) {
ev. si gnal ( ) ;
}

17
voi d GUI : : di spl ayGUI ( ) {
t ypeTi me hour s, mi nut es, seconds, mi l i seconds;
SysTi me* cl ock = SysTi me: : I nst ance( ) ;
Al ar m* al ar m= Al ar m: : I nst ance( ) ;

hour s = cl ock- >get Cur r ent Ti me( H) ;
mi nut es = cl ock- >get Cur r ent Ti me( M) ;
seconds = cl ock- >get Cur r ent Ti me( S) ;
mi l i seconds = cl ock- >get Cur r ent Ti me( MS) ;

wi ndow( 1, 1, 80, 6) ;
t ext backgr ound( BLACK) ;
t ext col or ( LI GHTGREEN) ;
got oxy( 5, 1) ;
cpr i nt f ( " **********************************************************************" ) ;
got oxy( 5, 2) ;
cpr i nt f ( " ****** C O N T R O L S Y S T E M F O R M I N E ******" ) ;
got oxy( 5, 3) ;
cpr i nt f ( " ****** Aut hor : I van I vanov ******" ) ;
got oxy( 5, 4) ;
cpr i nt f ( " ****** Mar ch 2006. ******" ) ;
got oxy( 5, 5) ;
cpr i nt f ( " **********************************************************************" ) ;

wi ndow( 5, 7, 40, 10) ;
t ext backgr ound( BLACK) ;
t ext col or ( LI GHTCYAN) ;
cpr i nt f ( " St ar t t i me: %02d. %02d. %d. " ,
cl ock- >get St ar t Dat e( ) . da_day, cl ock- >get St ar t Dat e( ) . da_mon,
cl ock- >get St ar t Dat e( ) . da_year ) ;
got oxy( 1, 2) ;
cpr i nt f ( " %02d: %02d: %02d. %03d" ,
cl ock- >get St ar t Ti me( ) . t i _hour , cl ock- >get St ar t Ti me( ) . t i _mi n,
cl ock- >get St ar t Ti me( ) . t i _sec, cl ock- >get St ar t Ti me( ) . t i _hund) ;
got oxy( 1, 3) ;
cpr i nt f ( " Rel at i ve t i me: %02d: %02d: %02d. %03d" ,
hour s, mi nut es, seconds, mi l i seconds) ;

wi ndow( 1, 12, 40, 20) ;
t ext backgr ound( BLACK) ;
t ext col or ( LI GHTGREEN) ;
cpr i nt f ( " Cr i t i cal val ues ( %) : " ) ;
t ext col or ( CYAN) ;
got oxy( 1, 2) ;
cpr i nt f ( " - CH4 upper l i mi t : %3d" , CH4_Upper Li mi t ) ;
got oxy( 1, 3) ;
cpr i nt f ( " - CO upper l i mi t : %3d" , CO_Upper Li mi t ) ;
got oxy( 1, 4) ;
cpr i nt f ( " - Ai r f l ow l ower l i mi t : %3d" , ai r _Lower Li mi t ) ;
got oxy( 1, 5) ;
cpr i nt f ( " - Hi gh wat er l evel : %3d" , wat er l v_Upper Li mi t ) ;
got oxy( 1, 6) ;
cpr i nt f ( " - Low wat er l evel : %3d" , wat er l v_Lower Li mi t ) ;

wi ndow( 40, 7, 80, 10) ;
i f ( al ar m- >al ar mSt at e( ANY_I D) ==0) {
t ext backgr ound( BLACK) ;
t ext col or ( WHI TE) ;
cpr i nt f ( " ***********************************" ) ;
got oxy( 1, 2) ;
cpr i nt f ( " ****** MI NE STATE : OK ******" ) ;
got oxy( 1, 3) ;
cpr i nt f ( " ***********************************" ) ;
}
el se {
t ext backgr ound( RED) ;
t ext col or ( WHI TE + BLI NK) ;
cpr i nt f ( " ***********************************" ) ;
18
got oxy( 1, 2) ;
cpr i nt f ( " ***** ALARM *** ALARM *****" ) ;
got oxy( 1, 3) ;
cpr i nt f ( " ***********************************" ) ;
}

wi ndow( 35, 12, 60, 21) ;
t ext backgr ound( BLACK) ;
t ext col or ( LI GHTGREEN) ;
cpr i nt f ( " Envi r onment val ues ( %) : " ) ;
t ext col or ( LI GHTCYAN) ;
got oxy( 1, 2) ;
cpr i nt f ( " - CH4 l evel : " ) ;
got oxy( 1, 3) ;
cpr i nt f ( " - CO l evel : " ) ;
got oxy( 1, 4) ;
cpr i nt f ( " - Ai r f l ow l evel : " ) ;
got oxy( 1, 5) ;
cpr i nt f ( " - Wat er l evel : " ) ;
got oxy( 1, 6) ;
cpr i nt f ( " - Wat er f l ow : " ) ;
got oxy( 1, 7) ;
cpr i nt f ( " - Pump st at e : " ) ;
got oxy( 1, 8) ;
cpr i nt f ( " - Pump st at us : " ) ;

wi ndow( 54, 13, 59, 21) ;
cl r scr ( ) ;
t ext backgr ound( BLACK) ;
t ext col or ( LI GHTCYAN) ;
cpr i nt f ( " %3d" , Envi r onment : : I nst ance( ) - >Measur e( CH4_I D) ) ;
got oxy( 1, 2) ;
cpr i nt f ( " %3d" , Envi r onment : : I nst ance( ) - >Measur e( CO_I D) ) ;
got oxy( 1, 3) ;
cpr i nt f ( " %3d" , Envi r onment : : I nst ance( ) - >Measur e( ai r _I D) ) ;
got oxy( 1, 4) ;
cpr i nt f ( " %3d" , Envi r onment : : I nst ance( ) - >Measur e( wat er l v_I D) ) ;
got oxy( 1, 5) ;
cpr i nt f ( " %3d" , Envi r onment : : I nst ance( ) - >Wat er Fl ow( ) ) ;
got oxy( 1, 6) ;
cpr i nt f ( " %3d" , Envi r onment : : I nst ance( ) - >PumpSt at e( ) ) ;
got oxy( 1, 7) ;
cpr i nt f ( " %3d" , Pump: : I nst ance( ) - >PumpSt at us( ) ) ;

wi ndow( 59, 13, 64, 21) ;
cl r scr ( ) ;
i f ( al ar m- >al ar mSt at e( CH4_I D) ==0) {
t ext backgr ound( BLACK) ;
t ext col or ( WHI TE) ;
cpr i nt f ( " OK " ) ;
}
el se {
t ext backgr ound( RED) ;
t ext col or ( WHI TE + BLI NK) ;
cpr i nt f ( " ALARM" ) ;
}
got oxy( 1, 2) ;
i f ( al ar m- >al ar mSt at e( CO_I D) ==0) {
t ext backgr ound( BLACK) ;
t ext col or ( WHI TE) ;
cpr i nt f ( " OK " ) ;
}
el se {
t ext backgr ound( RED) ;
t ext col or ( WHI TE + BLI NK) ;
cpr i nt f ( " ALARM" ) ;
}
got oxy( 1, 3) ;
19
i f ( al ar m- >al ar mSt at e( ai r _I D) ==0) {
t ext backgr ound( BLACK) ;
t ext col or ( WHI TE) ;
cpr i nt f ( " OK " ) ;
}
el se {
t ext backgr ound( RED) ;
t ext col or ( WHI TE + BLI NK) ;
cpr i nt f ( " ALARM" ) ;
}
got oxy( 1, 4) ;
i f ( al ar m- >al ar mSt at e( wat er l v_I D) ==0) {
t ext backgr ound( BLACK) ;
t ext col or ( WHI TE) ;
cpr i nt f ( " OK " ) ;
}
el se {
t ext backgr ound( RED) ;
t ext col or ( WHI TE + BLI NK) ;
cpr i nt f ( " ALARM" ) ;
}
got oxy( 1, 7) ;
i f ( al ar m- >al ar mSt at e( pump_I D) ==0) {
t ext backgr ound( BLACK) ;
t ext col or ( WHI TE) ;
cpr i nt f ( " OK " ) ;
}
el se {
t ext backgr ound( RED) ;
t ext col or ( WHI TE + BLI NK) ;
cpr i nt f ( " ALARM" ) ;
}

wi ndow( 65, 12, 80, 21) ;
t ext backgr ound( BLACK) ;
t ext col or ( LI GHTCYAN) ;
cpr i nt f ( " i nc dec" ) ;
t ext col or ( CYAN) ;
got oxy( 1, 2) ;
cpr i nt f ( " %c %c " , CH4_KeyUp, CH4_KeyDown) ;
got oxy( 1, 3) ;
cpr i nt f ( " %c %c " , CO_KeyUp, CO_KeyDown) ;
got oxy( 1, 4) ;
cpr i nt f ( " %c %c " , ai r _KeyUp, ai r _KeyDown) ;
got oxy( 1, 5) ;
cpr i nt f ( " %c %c " , wat er l v_KeyUp, wat er l v_KeyDown) ;
got oxy( 1, 7) ;
cpr i nt f ( " %c %c " , pumpst e_KeyUp, pumpst e_KeyDown) ;
got oxy( 1, 8) ;
cpr i nt f ( " %c " , pumpst s_Key) ;

wi ndow( 35, 21, 80, 25) ;
t ext backgr ound( BLACK) ;
t ext col or ( LI GHTGREEN) ;
cpr i nt f ( " Keys: " ) ;
got oxy( 1, 2) ;
t ext col or ( LI GHTCYAN) ;
cpr i nt f ( " Ar chi ve : " ) ;
t ext col or ( CYAN) ;
cpr i nt f ( " Ent er " ) ;
got oxy( 1, 3) ;
t ext col or ( LI GHTCYAN) ;
cpr i nt f ( " Power of f : " ) ;
t ext col or ( CYAN) ;
cpr i nt f ( " Esc" ) ;
}
20
Datoteka keyboar d. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Keyboar d
/ / Fi l e: keyboar d. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Keyboar d
/ / Cl asses: Keyboar d

#i f ndef _KEYBOARD_
#def i ne _KEYBOARD_

#i ncl ude <coni o. h>
#i ncl ude " t hr ead. h"
#i ncl ude " env. h"
#i ncl ude " power . h"

cl ass Keyboar d : publ i c Thr ead {
publ i c:

vi r t ual voi d r un ( ) ;

pr i vat e:

char char act er ;

};

#endi f
Datoteka keyboar d. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Keyboar d
/ / Fi l e: keyboar d. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Keyboar d
/ / Cl asses: Keyboar d

#i ncl ude " keyboar d. h"

voi d Keyboar d: : r un ( ) {
Power * pwr = Power : : I nst ance( ) ;

whi l e ( pwr - >i sRunni ng( ) ) {
i f ( kbhi t ( ) ) {
char act er = get ch ( ) ;
swi t ch ( char act er ) {
case CH4_KeyUp: Envi r onment : : I nst ance( ) - >Change( CH4_I D, I nc) ;
br eak;
case CH4_KeyDown: Envi r onment : : I nst ance( ) - >Change( CH4_I D, Dec) ;
br eak;
case CO_KeyUp: Envi r onment : : I nst ance( ) - >Change( CO_I D, I nc) ;
br eak;
case CO_KeyDown: Envi r onment : : I nst ance( ) - >Change( CO_I D, Dec) ;
br eak;
case ai r _KeyUp: Envi r onment : : I nst ance( ) - >Change( ai r _I D, I nc) ;
br eak;
case ai r _KeyDown: Envi r onment : : I nst ance( ) - >Change( ai r _I D, Dec) ;
br eak;
case wat er l v_KeyUp: Envi r onment : : I nst ance( ) - >Change( wat er l v_I D, I nc) ;
br eak;
21
case wat er l v_KeyDown: Envi r onment : : I nst ance( ) - >Change( wat er l v_I D, Dec) ;
br eak;
case pumpst e_KeyUp: Envi r onment : : I nst ance( ) - >PumpOn( ) ;
br eak;
case pumpst e_KeyDown: Envi r onment : : I nst ance( ) - >PumpOf f ( ) ;
br eak;
case pumpst s_Key: i f ( Envi r onment : : I nst ance( ) - >PumpSt at us( ) ==pump_OK)
Envi r onment : : I nst ance( ) - >PumpFai l ( ) ;
el se Envi r onment : : I nst ance( ) - >PumpOk( ) ;
br eak;
case ARCHI VE_Key: Ar chi ve: : I nst ance( ) - >ar chVal ues( ) ;
br eak;
case POWEROFF_Key: pwr - >Power Of f ( ) ;
br eak;
def aul t : br eak;
}
}
di spat ch ( ) ;
}
}
Datoteka power . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Syst empower
/ / Fi l e: power . h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Syst empower si mul at i on
/ / Cl asses: Power

#i f ndef _POWER_
#def i ne _POWER_

#i ncl ude " semaphor . h"
#i ncl ude " syst i me. h"
#i ncl ude " vi r t oper . h"

cl ass Power {
publ i c:

st at i c Power * I nst ance( ) ;

voi d Power On ( ) ;
voi d Power Of f ( ) ;
char i sRunni ng ( ) ;

pr i vat e:

Power ( ) ;
st at i c Power * i nst ance;

Semaphor e mut ex;

char Runni ng;

};

#endi f
Datoteka power . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Syst empower
/ / Fi l e: power . cpp
/ / Cr eat ed: Mar ch 2006
22
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Syst empower si mul at i on
/ / Cl asses: Power

#i ncl ude " power . h"

Power : : Power ( ) {
Runni ng = 0;
}

Power * Power : : I nst ance( ) {
r et ur n i nst ance;
}

Power * Power : : i nst ance = new Power ;

voi d Power : : Power On( ) {
Mut ex dummy( &mut ex) ;
Runni ng = 1;
Ar chi ve: : I nst ance( ) - >ar chEvent ( " Power on - > Syst emi s r unni ng! \ n" ) ;
}

voi d Power : : Power Of f ( ) {
Mut ex dummy( &mut ex) ;
Runni ng = 0;
Ar chi ve: : I nst ance( ) - >ar chEvent ( " Power of f \ n" ) ;
Ar chi ve: : I nst ance( ) - >
ar chMessage( " *****************************************************\ n\ n\ n" ) ;
}

char Power : : i sRunni ng( ) {
Mut ex dummy( &mut ex) ;
r et ur n Runni ng;
}
Datoteka pump. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Pump
/ / Fi l e: pump. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Pump si mul at i on
/ / Cl asses: Pump

#i f ndef _PUMP_
#def i ne _PUMP_

#i ncl ude " al ar m. h"
#i ncl ude " ar chi ve. h"
#i ncl ude " env. h"
#i ncl ude " keyboar d. h"
#i ncl ude " par ams. h"

cl ass Pump {
publ i c:

st at i c Pump* I nst ance( ) ;

voi d PumpOn ( ) ;
voi d PumpOf f ( ) ;
voi d PumpOk ( ) ;
voi d PumpFai l ( ) ;
char PumpSt at e ( ) ;
char PumpSt at us ( ) ;
23

pr i vat e:

Pump( ) ;
st at i c Pump* i nst ance;

Semaphor e mut ex;

char pumpSt at us; / / pump_OK | pump_FAI LURE
char pumpSt at e; / / pump_ON | pump_OFF

char f i r st Ti meSt at us;
char f i r st Ti meSt at e;
};

#endi f
Datoteka pump. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Pump
/ / Fi l e: pump. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Pump si mul at i on
/ / Cl asses: Pump

#i ncl ude " pump. h"

Pump: : Pump( ) {
pumpSt at us = pumpst s_I ni t i al ;
pumpSt at e = pumpst e_I ni t i al ;
f i r st Ti meSt at us = 0;
f i r st Ti meSt at e = 0;
}

Pump* Pump: : I nst ance( ) {
r et ur n i nst ance;
}

Pump* Pump: : i nst ance = new Pump;

voi d Pump: : PumpOn ( ) {
Mut ex dummy( &mut ex) ;
i f ( pumpSt at us == pump_OK) {
pumpSt at e = pump_ON;
i f ( ! f i r st Ti meSt at e) {
f i r st Ti meSt at e = 1;
Ar chi ve: : I nst ance( ) - >ar chEvent ( pump_MsgOn) ;
}
}
i f ( pumpSt at us == pump_FAI LURE)
Envi r onment : : I nst ance( ) - >Change( wat er f w_I D, ( pumpSt at e==pump_ON) ?I nc: Dec) ;
}

voi d Pump: : PumpOf f ( ) {
Mut ex dummy( &mut ex) ;
i f ( pumpSt at us == pump_OK) {
pumpSt at e = pump_OFF;
i f ( f i r st Ti meSt at e) {
f i r st Ti meSt at e = 0;
Ar chi ve: : I nst ance( ) - >ar chEvent ( pump_MsgOf f ) ;
}
}
i f ( pumpSt at us == pump_FAI LURE)
Envi r onment : : I nst ance( ) - >Change( wat er f w_I D, ( pumpSt at e==pump_ON) ?I nc: Dec) ;
24
}

voi d Pump: : PumpFai l ( ) {
Mut ex dummy( &mut ex) ;
pumpSt at us = pump_FAI LURE;
Al ar m: : I nst ance( ) - >al ar mOn( pump_I D) ;
i f ( ! f i r st Ti meSt at us) {
f i r st Ti meSt at us = 1;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( ON, pump_MsgFai l ) ;
}
}

voi d Pump: : PumpOk( ) {
Mut ex dummy( &mut ex) ;
pumpSt at us = pump_OK;
Al ar m: : I nst ance( ) - >al ar mOf f ( pump_I D) ;
i f ( f i r st Ti meSt at us) {
f i r st Ti meSt at us = 0;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( OFF, pump_MsgOk) ;
}
Envi r onment : : I nst ance( ) - >Change( wat er f w_I D, ( pumpSt at e==pump_ON) ?I nc: Dec) ;
}

char Pump: : PumpSt at e ( ) {
r et ur n pumpSt at e;
}

char Pump: : PumpSt at us ( ) {
r et ur n pumpSt at us;
}
Datoteka syst i me. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Syst emt i me
/ / Fi l e: syst i me. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Syst emt i me measur ement
/ / Cl asses: SysTi me

#i f ndef _SYSTI ME_
#def i ne _SYSTI ME_

#i ncl ude <dos. h>
#i ncl ude " t i mer . h"
#i ncl ude " semaphor . h"
#i ncl ude " par ams. h"

cl ass SysTi me : publ i c Ti mer {
publ i c:

st at i c SysTi me* I nst ance ( ) ;
st r uct t i me get St ar t Ti me ( ) ;
t ypeTi me get Cur r ent Ti me ( char ) ;
st r uct dat e get St ar t Dat e ( ) ;

pr i vat e:

SysTi me ( ) ;
st at i c SysTi me* i nst ance;

Semaphor e mut ex;

st r uct t i me st ar t Ti me;
st r uct dat e st ar t Dat e;
25

};

#endi f
Datoteka syst i me. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Syst emt i me
/ / Fi l e: syst i me. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Syst emt i me measur ement
/ / Cl asses: SysTi me

#i ncl ude " syst i me. h"

SysTi me: : SysTi me ( ) {
get t i me( &st ar t Ti me) ;
get dat e( &st ar t Dat e) ;
}

SysTi me* SysTi me: : I nst ance( ) {
r et ur n i nst ance;
}

SysTi me* SysTi me: : i nst ance = new SysTi me;

st r uct t i me SysTi me: : get St ar t Ti me ( ) {
r et ur n st ar t Ti me;
}

st r uct dat e SysTi me: : get St ar t Dat e ( ) {
r et ur n st ar t Dat e;
}

t ypeTi me SysTi me: : get Cur r ent Ti me ( char I D) {
Mut ex dummy( &mut ex) ;
t ypeTi me val ue;
swi t ch ( I D) {
case H: val ue = el apsed( ) * t i meTi ck / 1000 / 3600;
br eak;
case M: val ue = ( el apsed( ) * t i meTi ck / 1000 %3600) / 60;
br eak;
case S: val ue = ( el apsed( ) * t i meTi ck / 1000 %3600) %60;
br eak;
case MS: val ue = el apsed( ) * t i meTi ck %1000;
br eak;
def aul t : br eak;
}
r et ur n val ue;
}
Datoteka ai r . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Ai r f l ow
/ / Fi l e: ai r . h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Ai r f l ow t hr ead
/ / Cl asses: Ai r Thr ead

#i f ndef _AI R_
#def i ne _AI R_
26

#i ncl ude " t hr ead. h"
#i ncl ude " t i mer . h"
#i ncl ude " adc. h"
#i ncl ude " al ar m. h"
#i ncl ude " ar chi ve. h"
#i ncl ude " par ams. h"

cl ass Ai r Thr ead : publ i c Thr ead, publ i c Ti meabl e {
publ i c:

Ai r Thr ead ( ) ;
vi r t ual voi d r un ( ) ;

pr ot ect ed:

vi r t ual voi d t i meout ( ) ;

pr i vat e:

Ti mer myTi mer ;
Event ev;
ADC myADC;

char f i r st Ti me;

};

#endi f
Datoteka ai r . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Ai r f l ow
/ / Fi l e: ai r . cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Ai r f l ow t hr ead
/ / Cl asses: Ai r Thr ead

#i ncl ude " ai r . h"

Ai r Thr ead: : Ai r Thr ead ( ) : myTi mer ( ai r _T, t hi s) , myADC( ai r _I D) , f i r st Ti me( 0) {
myTi mer . st ar t ( ai r _T) ;
}

voi d Ai r Thr ead: : t i meout ( ) {
myTi mer . r est ar t ( ) ;
ev. si gnal ( ) ;
}

voi d Ai r Thr ead: : r un( ) {
whi l e ( Power : : I nst ance( ) - >i sRunni ng( ) ) {
myADC. st ar t Conver si on( ) ;
ev. wai t ( ) ;
myADC. r eadVal ue( ) ;
i f ( myADC. get Val ue( ) <= ai r _Lower Li mi t ) {
Al ar m: : I nst ance( ) - >al ar mOn( ai r _I D) ;
i f ( ! f i r st Ti me) {
f i r st Ti me = 1;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( ON, ai r _MsgAl ar mOn) ;
}
}
el se {
Al ar m: : I nst ance( ) - >al ar mOf f ( ai r _I D) ;
i f ( f i r st Ti me) {
27
Ar chi ve: : I nst ance( ) - >ar chAl ar m( OFF, ai r _MsgAl ar mOf f ) ;
f i r st Ti me = 0;
}
}
}
}
Datoteka ch4. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: CH4
/ / Fi l e: ch4. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: CH4 t hr ead
/ / Cl asses: CH4Thr ead

#i f ndef _CH4_
#def i ne _CH4_

#i ncl ude " t hr ead. h"
#i ncl ude " t i mer . h"
#i ncl ude " adc. h"
#i ncl ude " al ar m. h"
#i ncl ude " ar chi ve. h"
#i ncl ude " par ams. h"

cl ass CH4Thr ead : publ i c Thr ead, publ i c Ti meabl e {
publ i c:

CH4Thr ead ( ) ;
vi r t ual voi d r un ( ) ;

pr ot ect ed:

vi r t ual voi d t i meout ( ) ;

pr i vat e:

Ti mer myTi mer ;
Event ev;
ADC myADC;

char f i r st Ti me;

};

#endi f
Datoteka ch4. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: CH4
/ / Fi l e: ch4. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: CH4 t hr ead
/ / Cl asses: CH4Thr ead

#i ncl ude " ch4. h"

CH4Thr ead: : CH4Thr ead ( ) : myTi mer ( CH4_T, t hi s) , myADC( CH4_I D) , f i r st Ti me( 0) {
myTi mer . st ar t ( CH4_T) ;
}

28
voi d CH4Thr ead: : t i meout ( ) {
myTi mer . r est ar t ( ) ;
ev. si gnal ( ) ;
}

voi d CH4Thr ead: : r un( ) {
whi l e ( Power : : I nst ance( ) - >i sRunni ng( ) ) {
myADC. st ar t Conver si on( ) ;
ev. wai t ( ) ;
myADC. r eadVal ue( ) ;
i f ( myADC. get Val ue( ) >= CH4_Upper Li mi t ) {
Al ar m: : I nst ance( ) - >al ar mOn( CH4_I D) ;
i f ( ! f i r st Ti me) {
f i r st Ti me = 1;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( ON, CH4_MsgAl ar mOn) ;
}
Envi r onment : : I nst ance( ) - >PumpOf f ( ) ;
}
el se {
Al ar m: : I nst ance( ) - >al ar mOf f ( CH4_I D) ;
i f ( f i r st Ti me) {
Ar chi ve: : I nst ance( ) - >ar chAl ar m( OFF, CH4_MsgAl ar mOf f ) ;
f i r st Ti me = 0;
}
}
}
}
Datoteka co. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: CO
/ / Fi l e: co. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: CO t hr ead
/ / Cl asses: COThr ead

#i f ndef _CO_
#def i ne _CO_

#i ncl ude " t hr ead. h"
#i ncl ude " t i mer . h"
#i ncl ude " adc. h"
#i ncl ude " al ar m. h"
#i ncl ude " ar chi ve. h"
#i ncl ude " par ams. h"

cl ass COThr ead : publ i c Thr ead, publ i c Ti meabl e {
publ i c:

COThr ead ( ) ;
vi r t ual voi d r un ( ) ;

pr ot ect ed:

vi r t ual voi d t i meout ( ) ;

pr i vat e:

Ti mer myTi mer ;
Event ev;
ADC myADC;

char f i r st Ti me;

29
};

#endi f
Datoteka co. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: CO
/ / Fi l e: co. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: CO t hr ead
/ / Cl asses: COThr ead

#i ncl ude " co. h"

COThr ead: : COThr ead ( ) : myTi mer ( CO_T, t hi s) , myADC( CO_I D) , f i r st Ti me( 0) {
myTi mer . st ar t ( CO_T) ;
}

voi d COThr ead: : t i meout ( ) {
myTi mer . r est ar t ( ) ;
ev. si gnal ( ) ;
}

voi d COThr ead: : r un( ) {
whi l e ( Power : : I nst ance( ) - >i sRunni ng( ) ) {
myADC. st ar t Conver si on( ) ;
ev. wai t ( ) ;
myADC. r eadVal ue( ) ;
i f ( myADC. get Val ue( ) >= CO_Upper Li mi t ) {
Al ar m: : I nst ance( ) - >al ar mOn( CO_I D) ;
i f ( ! f i r st Ti me) {
f i r st Ti me = 1;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( ON, CO_MsgAl ar mOn) ;
}
}
el se {
Al ar m: : I nst ance( ) - >al ar mOf f ( CO_I D) ;
i f ( f i r st Ti me) {
Ar chi ve: : I nst ance( ) - >ar chAl ar m( OFF, CO_MsgAl ar mOf f ) ;
f i r st Ti me = 0;
}
}
}
}
Datoteka vi r t oper . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Vi r t ual oper at or
/ / Fi l e: vi r t oper . h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Vi r t ual oper at or t hr ead
/ / Cl asses: Vi r t ual Oper at or

#i f ndef _VI RTOPER_
#def i ne _VI RTOPER_

#i ncl ude " t hr ead. h"
#i ncl ude " t i mer . h"
#i ncl ude " ar chi ve. h"
#i ncl ude " power . h"
#i ncl ude " semaphor . h"
30
#i ncl ude " par ams. h"

cl ass Vi r t ual Oper at or : publ i c Thr ead, publ i c Ti meabl e {
publ i c:

st at i c Vi r t ual Oper at or * I nst ance( ) ;
vi r t ual voi d r un ( ) ;

pr ot ect ed:

Vi r t ual Oper at or ( ) ;

vi r t ual voi d t i meout ( ) ;

pr i vat e:

Ti mer myTi mer ;
Event ev;

};

#endi f
Datoteka vi r t oper . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Vi r t ual oper at or
/ / Fi l e: vi r t oper . cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Vi r t ual oper at or t hr ead
/ / Cl asses: Vi r t ual Oper at or

#i ncl ude " vi r t oper . h"

Vi r t ual Oper at or : : Vi r t ual Oper at or ( ) : myTi mer ( vi r t oper _T, t hi s) {
myTi mer . st ar t ( vi r t oper _T) ;
}

Vi r t ual Oper at or * Vi r t ual Oper at or : : I nst ance( ) {
st at i c Vi r t ual Oper at or i nst ance;
r et ur n &i nst ance;
}

voi d Vi r t ual Oper at or : : t i meout ( ) {
myTi mer . r est ar t ( ) ;
ev. si gnal ( ) ;
}

voi d Vi r t ual Oper at or : : r un( ) {
whi l e( Power : : I nst ance( ) - >i sRunni ng( ) ) {
Ar chi ve: : I nst ance( ) - >ar chVal ues( ) ;
ev. wai t ( ) ;
}
}
Datoteka wat er f w. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Wat er f l ow
/ / Fi l e: wat er f w. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Wat er f l ow t hr ead
/ / Cl asses: Wat er f wThr ead
31

#i f ndef _WATERFW_
#def i ne _WATERFW_

#i ncl ude " t hr ead. h"
#i ncl ude " t i mer . h"
#i ncl ude " al ar m. h"
#i ncl ude " ar chi ve. h"
#i ncl ude " env. h"
#i ncl ude " pump. h"
#i ncl ude " power . h"
#i ncl ude " par ams. h"

cl ass Wat er f wThr ead : publ i c Thr ead, publ i c Ti meabl e {
publ i c:

Wat er f wThr ead ( ) ;
vi r t ual voi d r un ( ) ;

pr ot ect ed:

vi r t ual voi d t i meout ( ) ;

pr i vat e:

Ti mer myTi mer ;
Event ev;

char f l ow;
char f i r st Ti me;

};

#endi f
Datoteka wat er f w. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Wat er f l ow
/ / Fi l e: wat er f w. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Wat er f l ow t hr ead
/ / Cl asses: Wat er f wThr ead

#i ncl ude " wat er f w. h"

Wat er f wThr ead: : Wat er f wThr ead ( ) : myTi mer ( wat er f w_T, t hi s) {
myTi mer . st ar t ( wat er f w_T) ;
}

voi d Wat er f wThr ead: : t i meout ( ) {
myTi mer . r est ar t ( ) ;
ev. si gnal ( ) ;
}

voi d Wat er f wThr ead: : r un ( ) {
i nt r eadTi mes = 1, wat er f w1, wat er f w2;
whi l e ( Power : : I nst ance( ) - >i sRunni ng( ) ) {
ev. wai t ( ) ;
i f ( r eadTi mes==2) {
wat er f w2 = Envi r onment : : I nst ance( ) - >PumpSt at e( ) ;
i f ( Envi r onment : : I nst ance( ) - >PumpSt at us( ) ==pump_OK) {
i f ( ! ( wat er f w1| | wat er f w2) )
Envi r onment : : I nst ance( ) - >Change( wat er f w_I D, Dec) ;
el se
32
i f ( wat er f w1&&wat er f w2 )
Envi r onment : : I nst ance( ) - >Change( wat er f w_I D, I nc) ;
r eadTi mes = 1;
}
}
el se {
wat er f w1 = Envi r onment : : I nst ance( ) - >PumpSt at e( ) ;
r eadTi mes++;
}
}
}
Datoteka wat er l v. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Wat er l evel
/ / Fi l e: wat er l v. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Wat er l evel t hr ead
/ / Cl asses: Wat er l vThr ead
/ / Wat er l vHi ghI nt Handl er
/ / Wat er l vLowI nt Handl er

#i f ndef _WATERLV_
#def i ne _WATERLV_

#i ncl ude " t hr ead. h"
#i ncl ude " t i mer . h"
#i ncl ude " semaphor . h"
#i ncl ude " i nt r r eq. h"
#i ncl ude " adc. h"
#i ncl ude " al ar m. h"
#i ncl ude " ar chi ve. h"
#i ncl ude " pump. h"
#i ncl ude " par ams. h"

cl ass Wat er l vThr ead : publ i c Thr ead, publ i c Ti meabl e {
publ i c:

st at i c Wat er l vThr ead* I nst ance( ) ;
vi r t ual voi d r un ( ) ;

pr ot ect ed:

Wat er l vThr ead ( ) ;

vi r t ual voi d t i meout ( ) ;

pr i vat e:

st at i c Wat er l vThr ead* i nst ance;

Ti mer myTi mer ;
Event ev;
ADC myADC;

char l evel ;
char f i r st Ti me;

f r i end cl ass Wat er l vHi ghI nt Handl er ;
f r i end cl ass Wat er l vLowI nt Handl er ;

};

cl ass Wat er l vHi ghI nt Handl er : publ i c I nt er r upt Handl er {
33
pr ot ect ed:

Wat er l vHi ghI nt Handl er ( ) ;

st at i c voi d wat er l vI nt er r upt ( ) ;
vi r t ual i nt handl e ( ) ;

pr i vat e:

st at i c Wat er l vHi ghI nt Handl er * i nst ance;

Wat er l vThr ead* wat er l vHi gh;

};

cl ass Wat er l vLowI nt Handl er : publ i c I nt er r upt Handl er {
pr ot ect ed:

Wat er l vLowI nt Handl er ( ) ;

st at i c voi d wat er l vI nt er r upt ( ) ;
vi r t ual i nt handl e ( ) ;

pr i vat e:

st at i c Wat er l vLowI nt Handl er * i nst ance;

Wat er l vThr ead* wat er l vLow;

};

#endi f
Datoteka wat er l v. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Wat er l evel
/ / Fi l e: wat er l v. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Wat er l evel t hr ead
/ / Cl asses: Wat er l vThr ead
/ / Wat er l vHi ghI nt Handl er
/ / Wat er l vLowI nt Handl er

#i ncl ude " wat er l v. h"

Wat er l vThr ead: : Wat er l vThr ead ( ) : myTi mer ( wat er l v_T, t hi s) , myADC( wat er l v_I D) ,
l evel ( wat er l v_I ni t i al Level ) , f i r st Ti me( 0) {
myTi mer . st ar t ( wat er l v_T) ;
}

Wat er l vThr ead* Wat er l vThr ead: : I nst ance( ) {
r et ur n i nst ance;
}

Wat er l vThr ead* Wat er l vThr ead: : i nst ance = new Wat er l vThr ead;

voi d Wat er l vThr ead: : t i meout ( ) {
myTi mer . r est ar t ( ) ;
ev. si gnal ( ) ;
}

voi d Wat er l vThr ead: : r un( ) {
whi l e ( Power : : I nst ance( ) - >i sRunni ng( ) ) {
myADC. st ar t Conver si on( ) ;
34
ev. wai t ( ) ;
myADC. r eadVal ue( ) ;
Val ue val ue = myADC. get Val ue( ) ;
i f ( val ue >= wat er l v_Upper Li mi t ) {
i nt er r upt Request ( wat er l v_Hi ghI nt No) ;
Al ar m: : I nst ance( ) - >al ar mOn( wat er l v_I D) ;
i f ( ! f i r st Ti me) {
f i r st Ti me = 1;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( ON, wat er l v_MsgUpper Al ar mOn) ;
}
i f ( ! Al ar m: : I nst ance( ) - >al ar mSt at e( CH4_I D) )
Envi r onment : : I nst ance( ) - >PumpOn( ) ;
}
el se
i f ( val ue <= wat er l v_Lower Li mi t ) {
i nt er r upt Request ( wat er l v_LowI nt No) ;
Al ar m: : I nst ance( ) - >al ar mOn( wat er l v_I D) ;
i f ( ! f i r st Ti me) {
f i r st Ti me = 1;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( ON, wat er l v_MsgLower Al ar mOn) ;
}
Envi r onment : : I nst ance( ) - >PumpOf f ( ) ;
}
el se {
l evel = 1;
Al ar m: : I nst ance( ) - >al ar mOf f ( wat er l v_I D) ;
i f ( f i r st Ti me) {
Ar chi ve: : I nst ance( ) - >ar chAl ar m( OFF, wat er l v_MsgAl ar mOf f ) ;
f i r st Ti me = 0;
}
}
}
}

Wat er l vHi ghI nt Handl er : : Wat er l vHi ghI nt Handl er ( ) :
I nt er r upt Handl er ( wat er l v_Hi ghI nt No, wat er l vI nt er r upt ) {
wat er l vHi gh = Wat er l vThr ead: : I nst ance( ) ;
}

Wat er l vHi ghI nt Handl er * Wat er l vHi ghI nt Handl er : : i nst ance = new Wat er l vHi ghI nt Handl er ;

voi d Wat er l vHi ghI nt Handl er : : wat er l vI nt er r upt ( ) {
i nst ance- >i nt er r upt Handl er ( ) ;
}

i nt Wat er l vHi ghI nt Handl er : : handl e ( ) {
wat er l vHi gh- >l evel = 2;
r et ur n 0;
}

Wat er l vLowI nt Handl er : : Wat er l vLowI nt Handl er ( ) :
I nt er r upt Handl er ( wat er l v_LowI nt No, wat er l vI nt er r upt ) {
wat er l vLow = Wat er l vThr ead: : I nst ance( ) ;
}

Wat er l vLowI nt Handl er * Wat er l vLowI nt Handl er : : i nst ance = new Wat er l vLowI nt Handl er ;

voi d Wat er l vLowI nt Handl er : : wat er l vI nt er r upt ( ) {
i nst ance- >i nt er r upt Handl er ( ) ;
}

i nt Wat er l vLowI nt Handl er : : handl e ( ) {
wat er l vLow- >l evel = 0;
r et ur n 0;
}
35
Datoteka i nt r r eq. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: I nt er r upt r equest
/ / Fi l e: i nt r r eq. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: I nt er r upt r equest
/ / Funct i ons: i nt er r upt Request

#i f ndef _I NTERREQ_
#def i ne _I NTERREQ_

#i ncl ude " t i mer . h"
#i ncl ude " gui . h"

ext er n voi d ( *I VT[ ] ) ( ) ;

st at i c voi d i nt er r upt Request ( unsi gned char i nt No) {
swi t ch ( i nt No) {
case 0: ( *I VT[ i nt No] ) ( ) ;
GUI : : I nst ance( ) - >r ef r esh( ) ;
br eak;
case 1: ( *I VT[ i nt No] ) ( ) ;
br eak;
case 2: ( *I VT[ i nt No] ) ( ) ;
br eak;
def aul t : br eak;
}
}

#endi f
Datoteka per i nt . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Per i odi c i nt er r upt
/ / Fi l e: per i nt . h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Per i odi c i nt er r upt
/ / Cl asses: Per I nt

#i f ndef _PERI NT_
#def i ne _PERI NT_

#i ncl ude <dos. h>
#i ncl ude " i nt r r eq. h"
#i ncl ude " ker nel . h"

cl ass Per I nt {
publ i c:

st at i c Per I nt * I nst ance( ) ;

voi d Enabl e ( ) ;
voi d Di sabl e ( ) ;
i nt i sEnabl ed ( ) ;

pr i vat e:

Per I nt ( ) ;
st at i c Per I nt * i nst ance;

36
unsi gned char st at us;

};

#endi f
Datoteka per i nt . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Per i odi c i nt er r upt
/ / Fi l e: per i nt . cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Per i odi c i nt er r upt
/ / Cl asses: Per I nt

#i ncl ude " per i nt . h"

#i f def __cpl uspl us
#def i ne __CPPARGS . . .
#el se
#def i ne __CPPARGS
#endi f

voi d i nt er r upt ( *ol dhandl er ) ( __CPPARGS) ;

voi d i nt er r upt handl er ( __CPPARGS) / / i f C++, need t he t he el l i psi s
{
/ / di sabl e i nt er r upt s dur i ng t he handl i ng of t he i nt er r upt
di sabl e( ) ;
/ / i ncr ease t he gl obal count er
i nt er r upt Request ( 0) ;
/ / r eenabl e i nt er r upt s at t he end of t he handl er
enabl e( ) ;
/ / cal l t he ol d r out i ne
ol dhandl er ( ) ;
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Per I nt
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

Per I nt : : Per I nt ( ) {
/ / save t he ol d i nt er r upt vect or
ol dhandl er = get vect ( I NTR) ;
st at us = 0;
}

Per I nt * Per I nt : : I nst ance ( ) {
r et ur n i nst ance;
}

Per I nt * Per I nt : : i nst ance = new Per I nt ;

voi d Per I nt : : Di sabl e ( ) {
/ / r eset t he ol d i nt er r upt handl er
set vect ( I NTR, ol dhandl er ) ;
st at us = 0;
}

voi d Per I nt : : Enabl e ( ) {
/ / i nst al l t he new i nt er r upt handl er
set vect ( I NTR, handl er ) ;
st at us = 1;
}

37
i nt Per I nt : : i sEnabl ed ( ) {
r et ur n st at us==1;
}
Datoteka par ams. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Par amet er s
/ / Fi l e: par ams. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Var i ous syst empar amet er s
/ / Types: Val ue
/ / t ypeTi me

#i f ndef _PARAMS_
#def i ne _PARAMS_

t ypedef unsi gned i nt Val ue;
t ypedef unsi gned i nt t ypeTi me;

const i nt br Pr oc = 5;
const unsi gned i nt t i meTi ck = 55; / / i n mi l i seconds
const i nt I NTR = 0X1C; / / t he cl ock t i ck i nt er r upt

const i nt wat er l v_LowI nt No = 1;
const i nt wat er l v_Hi ghI nt No = 2;

const i nt vi r t oper _T = 500;

const char * const out put Fi l eName = " zad2. t xt " ;
const i nt WI DTH = 2;

const char H = 1;
const char M = 2;
const char S = 3;
const char MS = 4;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Keys assi gned t o envi r onment act i ons
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const char CH4_KeyUp = ' q' ;
const char CO_KeyUp = ' w' ;
const char ai r _KeyUp = ' e' ;
const char wat er l v_KeyUp = ' r ' ;
const char pumpst e_KeyUp = ' t ' ;

const char CH4_KeyDown = ' a' ;
const char CO_KeyDown = ' s' ;
const char ai r _KeyDown = ' d' ;
const char wat er l v_KeyDown = ' f ' ;
const char pumpst e_KeyDown = ' g' ;

const char pumpst s_Key = ' p' ;

const char ARCHI VE_Key = 13; / / Ent er
const char POWEROFF_Key = 27; / / Esc

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Envi r onment cl ass par amet er s
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const char I nc = 1;
const char Dec = 0;

const char ON = 1;
const char OFF = 0;
38

const Val ue CH4_I nc = 1;
const Val ue CO_I nc = 1;
const Val ue ai r _I nc = 1;
const Val ue wat er l v_I nc = 1;
const Val ue wat er f w_I nc = 1;

const Val ue CH4_Dec = 1;
const Val ue CO_Dec = 1;
const Val ue ai r _Dec = 1;
const Val ue wat er l v_Dec = 1;
const Val ue wat er f w_Dec = 1;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Pump
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const i nt pump_I D = 6;
const char pump_OK = 1;
const char pump_FAI LURE = 0;
const char pump_ON = 1;
const char pump_OFF = 0;
char *const pump_MsgOn = " Pump i s on! \ n" ;
char *const pump_MsgOf f = " Pump i s of f ! \ n" ;
char *const pump_MsgFai l = " Pump f ai l ur e! " ;
char *const pump_MsgOk = " Pump back t o nor mal st at e! " ;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Envi r onment cl ass par amet er s
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const Val ue CH4_I ni t i al = 10;
const Val ue CO_I ni t i al = 10;
const Val ue ai r _I ni t i al = 90;
const Val ue wat er l v_I ni t i al = 20;
const char wat er l v_I ni t i al Level = 1;
const char pumpst e_I ni t i al = pump_OFF;
const char wat er f w_I ni t i al = pumpst e_I ni t i al ;
const char pumpst s_I ni t i al = pump_OK;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Maxi mal and mi ni mal val ues
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const Val ue CH4_Max = 100;
const Val ue CO_Max = 100;
const Val ue ai r _Max = 100;
const Val ue wat er l v_Max = 100;
const Val ue wat er f w_Max = 1;

const Val ue CH4_Mi n = 0;
const Val ue CO_Mi n = 0;
const Val ue ai r _Mi n = 0;
const Val ue wat er l v_Mi n = 0;
const Val ue wat er f w_Mi n = 0;

const i nt ANY_I D = 0;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / CH4
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const i nt CH4_I D = 1;
const i nt CH4_T = 8;
const Val ue CH4_Upper Li mi t = 30;
char * const CH4_MsgAl ar mOn = " CH4 l evel i s t oo hi gh! " ;
char * const CH4_MsgAl ar mOf f = " CH4 l evel back t o nor mal ! " ;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / CO
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const i nt CO_I D = 2;
39
const i nt CO_T = 10;
const Val ue CO_Upper Li mi t = 45;
char * const CO_MsgAl ar mOn = " CO l evel i s t oo hi gh! " ;
char * const CO_MsgAl ar mOf f = " CO l evel back t o nor mal ! " ;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Ai r
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const i nt ai r _I D = 3;
const i nt ai r _T = 10;
const Val ue ai r _Lower Li mi t = 75;
char * const ai r _MsgAl ar mOn = " Ai r f l ow i s t oo l ow! " ;
char * const ai r _MsgAl ar mOf f = " Ai r f l ow back t o nor mal ! " ;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Wat er Level
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const i nt wat er l v_I D = 4;
const i nt wat er l v_T = 10;
const i nt wat er l v_Upper Li mi t = 80;
const i nt wat er l v_Lower Li mi t = 10;
char *const wat er l v_MsgUpper Al ar mOn = " Wat er l evel i s t oo hi gh! " ;
char *const wat er l v_MsgAl ar mOf f = " Wat er l evel back t o nor mal ! " ;
char *const wat er l v_MsgLower Al ar mOn = " Wat er l evel i s t oo l ow! " ;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Wat er f l ow
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
const i nt wat er f w_I D = 5;
const i nt wat er f w_T = 10;

#endi f
Datoteka mi ne. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Mi ne i nt er f ace
/ / Fi l e: mi ne. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Mi ne i nt er f ace

#i f ndef _MI NE_
#def i ne _MI NE_

#i ncl ude " ar chi ve. h"
#i ncl ude " env. h"
#i ncl ude " gui . h"
#i ncl ude " keyboar d. h"
#i ncl ude " power . h"
#i ncl ude " syst i me. h"

#i ncl ude " ch4. h"
#i ncl ude " co. h"
#i ncl ude " ai r . h"
#i ncl ude " wat er l v. h"
#i ncl ude " wat er f w. h"
#i ncl ude " pump. h"
#i ncl ude " vi r t oper . h"

#endi f
Datoteka user mai n. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: Mai n modul e
40
/ / Fi l e: user mai n. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Mai n modul e
/ / Funct i ons: user Mai n

#i ncl ude " per i nt . h"
#i ncl ude " mi ne. h"

voi d user Mai n( ) {
CH4Thr ead* ch4 = new CH4Thr ead;
COThr ead* co = new COThr ead;
Ai r Thr ead* ai r = new Ai r Thr ead;
Wat er l vThr ead* wat er l v = Wat er l vThr ead: : I nst ance( ) ;
Wat er f wThr ead* wat er f w = new Wat er f wThr ead;

Vi r t ual Oper at or * vi r t oper = Vi r t ual Oper at or : : I nst ance( ) ;

SysTi me* cl ock = SysTi me: : I nst ance( ) ;
Power * pwr = Power : : I nst ance( ) ;

Thr ead* key = new Keyboar d;
GUI : : I nst ance( ) ;

Ar chi ve: : I nst ance( ) ;

pwr - >Power On( ) ;
key- >st ar t ( ) ;

ch4- >st ar t ( ) ;
co- >st ar t ( ) ;
ai r - >st ar t ( ) ;
wat er l v- >st ar t ( ) ;
wat er f w- >st ar t ( ) ;

vi r t oper - >st ar t ( ) ;

Per I nt : : I nst ance( ) - >Enabl e( ) ;
cl ock- >st ar t ( ) ;
whi l e ( pwr - >i sRunni ng( ) ) di spat ch( ) ;
cl ock- >st op( ) ;
Per I nt : : I nst ance( ) - >Di sabl e( ) ;

di spat ch( ) ;
}
3.3 Izmene u kolskom Jezgru
Pri implementaciji softverskog sistema za nadzor rudnika unete su odreene modifikacije u
kolskom Jezgru. U nastavku teksta dat je izvorni kod sa modifikacijama.
Datoteka semaphor . cpp
#def i ne I VTl engt h 8

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / gl obal f unct i on voi d ( *I VT[ I VTl engt h] ( ) ) ;
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
voi d ( *I VT[ I VTl engt h] ) ( ) ; / / I VT f unct i on decl ar at i on

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass I nt er r upt Handl er
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
voi d i ni t I VT ( I nt No num, voi d ( *i nt Handl er ) ( ) ) {
41
I VT[ num] = i nt Handl er ; / / I VT f unct i on def i ni t i on
/ / I ni t I VT ent r y by t he gi ven vect or
}
Datoteka ker nel . cpp
#i ncl ude <dos. h> / / enabl e( ) & di sabl e( ) - har dwar e dependent f unct i ons

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Hel per f unct i ons l ock ( ) and unl ock ( )
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
voi d l ock ( ) { di sabl e( ) ; } / / swi t ch t o Ker nel mode
voi d unl ock ( ) { enabl e ( ) ; } / / swi t ch t o User mode
3.4 Primer izlaznog fajla arhive
U nastavku je dat izgled izlaznog fajla, tj. arhive, za neke ulazne podatke.
*****************************************************
C O N T R O L S Y S T E M F O R M I N E
****** ******
St ar t dat e & t i me: 25. 03. 2006. 17: 08: 27. 008
*****************************************************
00: 00: 00. 000 Power on - > Syst emi s r unni ng!
00: 00: 00. 000 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 10
CO l evel : 10
Ai r f l ow : 90
Wat er l evel : 20
Wat er f l ow : 0
Pump st at e : 0
Pump st at us: 1
00: 00: 07. 480 ALARM ON : CH4 l evel i s t oo hi gh!
00: 00: 15. 400 ALARM ON : CO l evel i s t oo hi gh!
00: 00: 20. 350 ALARM ON : Ai r f l ow i s t oo l ow!
00: 00: 25. 960 ALARM OFF: CH4 l evel back t o nor mal !
00: 00: 27. 500 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 29
CO l evel : 46
Ai r f l ow : 75
Wat er l evel : 20
Wat er f l ow : 0
Pump st at e : 0
Pump st at us: 1
00: 00: 31. 350 ALARM OFF: CO l evel back t o nor mal !
00: 00: 34. 650 ALARM OFF: Ai r f l ow back t o nor mal !
00: 00: 45. 100 ALARM ON : Wat er l evel i s t oo hi gh!
00: 00: 45. 100 Pump i s on!
00: 00: 51. 700 ALARM OFF: Wat er l evel back t o nor mal !
00: 00: 55. 000 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 29
CO l evel : 44
Ai r f l ow : 76
Wat er l evel : 14
Wat er f l ow : 1
Pump st at e : 1
Pump st at us: 1
00: 00: 56. 100 ALARM ON : Wat er l evel i s t oo l ow!
00: 00: 56. 100 Pump i s of f !
00: 01: 03. 250 ALARM OFF: Wat er l evel back t o nor mal !
00: 01: 14. 635 Pump i s on!
00: 01: 20. 080 Pump i s of f !
00: 01: 22. 500 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 29
CO l evel : 44
42
Ai r f l ow : 76
Wat er l evel : 57
Wat er f l ow : 0
Pump st at e : 0
Pump st at us: 1
00: 01: 22. 885 Pump i s on!
00: 01: 25. 360 ALARM ON : CH4 l evel i s t oo hi gh!
00: 01: 25. 360 Pump i s of f !
00: 01: 33. 720 ALARM OFF: CH4 l evel back t o nor mal !
00: 01: 36. 085 ALARM ON : Pump f ai l ur e!
00: 01: 43. 400 ALARM ON : Wat er l evel i s t oo hi gh!
00: 01: 48. 515 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 29
CO l evel : 44
Ai r f l ow : 76
Wat er l evel : 80
Wat er f l ow : 0
Pump st at e : 1
Pump st at us: 0
00: 01: 50. 000 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 29
CO l evel : 44
Ai r f l ow : 76
Wat er l evel : 80
Wat er f l ow : 0
Pump st at e : 1
Pump st at us: 0
00: 02: 01. 550 ALARM OFF: Wat er l evel back t o nor mal !
00: 02: 08. 095 ALARM OFF: Pump back t o nor mal st at e!
00: 02: 15. 355 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 29
CO l evel : 44
Ai r f l ow : 76
Wat er l evel : 69
Wat er f l ow : 1
Pump st at e : 1
Pump st at us: 1
00: 02: 17. 500 Sensor s r ead f ol l owi ng val ues:
CH4 l evel : 29
CO l evel : 44
Ai r f l ow : 76
Wat er l evel : 68
Wat er f l ow : 1
Pump st at e : 1
Pump st at us: 1
00: 02: 20. 800 ALARM ON : Wat er l evel i s t oo l ow!
00: 02: 23. 550 ALARM OFF: Wat er l evel back t o nor mal !
00: 02: 25. 860 Power of f
*****************************************************


43
4 ZADATAK 3 Proraun rasporedivosti
4.1 Postavka problema
Potrebno je izvriti procenu vremena izvravanja u najgorem sluaju za procese u sistemu
realizovanom u Zadatku 2 i primenom programa realizovanog u Zadatku 1 pokazati da li je taj
sistem rasporediv.
Vreme izvravanja u najgorem sluaju svakog od identifikovanih procesa treba to
preciznije izmeriti na realizovanoj platformi.
4.2 Reenje problema
U sistemu opisanom u Zadatku 2 realizovana su 8 procesa koji vre nadzor rudnika:
Periodini procesi: Sporadini procesi:
kontrola nivoa metana,
kontrola nivoa ugljen-monoksida,
kontrola protoka vazduha,
kontrola protoka vode,
virtuelni operator,
pritisak tastera, i
ispis na ekran.
kontrola nivoa vode.
Svi ovi procesi su periodini, ukljuujui i sporadian dogaaj dostizanja visokog, odnosno
niskog nivoa vode. On je po prirodi sporadian, ali je implementiran kao periodini proces za
potrebe simulacije sa periodom uzetom kao minimalno vreme izmeu dva susedna pojavljivanja.
Sistem je realizovan i simuliran na kunom raunaru sa AMD Sempron 2600+
procesorom. Iscrtavanje obavlja grafika karta NVIDIA GeForce FX 5200. Ostale komponente
nisu od znaaja za vreme izvravanja programa.
Pri merenju WCET-a nekog procesa, dozvoljeno je da se samo on izvrava, dok su svi
ostali procesi iskljueni. Traena vremena su izraunata tako to je kod modifikovan da se moe
samostalno izvravati samo kod od interesa, ali se pazilo da se ipak zadri autentinost zbog
informacije o vremenu potrebnom za njegovo izvravanje. Takav kod je ubaen u petlju sa jako
velikim brojem ponavljanja (reda milion) i mereno je vreme. Postupak je ponavljan nekoliko
puta, i iako su sva vremena bila vrlo bliska, uzeta je najgora vrednost, odnosno najdue vreme.
Ovo nije najpouzdanija metoda jer obuhvata i nepotrebno reijsko vreme same petlje, tako da su
rezultati malo pesimistini. Izmerene veliine su date u Tabeli 1.
U nastavku teksta prikazana je funkcija mai n( ) na jeziku C++ za proces kontrole nivoa
metana. Kod za ostale procese je analogan prikazanom kodu.
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Cont r ol Syst emf or Mi ne
/ / Modul e: CH4
/ / Fi l e: ch4. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
44
/ / Aut hor : I van I vanov
/ / Cont ent s: CH4
/ / Funct i ons: mai n

#i ncl ude <dos. h>
#i ncl ude <i ost r eam. h>
#i ncl ude <t i me. h>
#i ncl ude " adc. h"
#i ncl ude " al ar m. h"
#i ncl ude " ar chi ve. h"

const doubl e N = 1000000;

voi d mai n ( ) {
t i me_t t _ol d, t _new;
doubl e ch4WCET;
ADC myADC( CH4_I D) ;
char f i r st Ti me;

t _ol d = t i me( NULL) ;
f or ( doubl e i =0; i <N; i ++) {
myADC. st ar t Conver si on( ) ;
myADC. r eadVal ue( ) ;
myADC. get Val ue( ) ;
Al ar m: : I nst ance( ) - >al ar mOn( CH4_I D) ;
f i r st Ti me = 1;
Ar chi ve: : I nst ance( ) - >ar chAl ar m( ON, CH4_MsgAl ar mOn) ;
Envi r onment : : I nst ance( ) - >PumpOf f ( ) ;
}
t _new = t i me( NULL) ;
ch4WCET = ( t _new- t _ol d) / N;
cout << ch4WCET << endl ;
}
Rasporedivost ovog sistema proverena je uz pomo programa uraenog u Zadatku 1 i
dobijeni su rezultati koji su prikazani u Tabeli 1.
Tabela 1. Parametri periodinih i sporadinih procesa u sistemu
Proces
Period,
T [ms]
Vremenski rok,
D [ms]
Izmereno WCET,
C [s]
Vreme odziva,
R [s]
CH4 senzor 80 30 15 15
CO senzor 100 60 15 436
Protok vazduha 100 100 14 450
Protok vode 1000 40 1 355
Detektori nivoa vode 6000 200 15 465
Virtuelni operater 27500 200 64 529
Tastatura 50 50 66 421
Ekran 40 40 339 354
Test rasporedivosti iz Zadatka 1 je pokazao da je sistem rasporediv na datoj platformi sa
iskorienjem procesora od svega U = 0.0103. ak i kada bi WCET za pojedine procese bilo
vee, situacija bi izgledala isto. Poreenjem sa zadatim periodama procesa, moe se videti da bi
relaksiranje sistema bilo mogue i to vie redova veliine, pri emu bi sistem i dalje ostao
rasporediv. Kritino je jedino vreme ispisa na ekran, koje se u MS-DOS prozoru Windows XP
operativnog sistema izvrava jako sporo.
Ovakav zakljuak se mogao i oekivati, jer se zna da se za implementaciju ovakvih sistema
u industriji koriste mikrokontroleri, odnosno raunari posebne namene, koji su dosta sporiji, ali i
pouzdaniji od procesora opte namene.

45
5 ZADATAK 4 Jezgro sa preuzimanjem i FPS
5.1 Postavka problema
Potrebno je postojee kolsko Jezgro prepraviti tako da bude sa preuzimanjem i da
podrava FPS procesa koji se mogu suspendovati (blokirati) na zadato vreme.
Potrebno je podrati sledee mogunosti:
Suspenziju (blokiranje) niti na vremenski rok. Korisnika nit se moe suspendovati na
zadato vreme pozivom operacije t i meSuspendAbsol ut e( Ti me) ili operacije
t i meSuspendRel at i ve( Ti me) ; nit se reaktivira kada proe zadato vreme suspenzije.
Prva od ovih operacija zadaje vreme apsolutno, tj. zadaje vreme buenja relativno u
odnosu na neki poetni trenutak tokom inicijalizacije Jezgra; tekue vreme u odnosu
na taj poetni trenutak moe se dobiti pozivom operacije get Cur r ent Ti me( ) . Druga
operacija zadaje vreme buenja relativno u odnosu na trenutak poziva ove operacije.
Asinhrono preuzimanje u trenutku kada se neka nit aktivira jer je isteklo vreme njene
suspenzije.
Rasporeivanje niti sa fiksnim prioritetom (FPS).
Nije potrebno obezbediti asinhrono preuzimanje prilikom prekida.
Implementacija treba da bude to efikasnija, tako da sistem unosi to manje lokalno
plivanje (engl. local drift) prilikom aktivacije niti, to manje vreme promene konteksta i to
tanije merenje vremena. Dovoljno je podrati tanost merenja vremena koju obezbeuje sat
realnog vremena na PC raunarima koji generie prekid na priblino 55 ms.
Funkcionisanje ovakvog Jezgra treba ilustrovati primerom sistema sa N nezavisnih
periodinih procesa od kojih neki reaguju na sporadine spoljnje dogaaje u odreenom roku T
c
,
a neki uzimaju odbirke A/D konvertora sa pomeranjem periode (engl. period displacement).
5.2 Reenje problema
Postojee kolsko Jezgro je prepravljeno tako da bude sa preuzimanjem.
Modifikovana je klasa Thr ead tako da niti imaju mogunost blokiranja na nekom dogaaju
(binarni semafor, klasa Event ) na odreeno vreme, pa je pomenuta klasa izvedena iz klase
Ti meabl e. Operacije suspenzije (blokiranja) niti na vremenski rok obavljaju funkcije
t i meSuspendAbsol ut e( Ti me) i t i meSuspendRel at i ve( Ti me) koje su globalne funkcije.
Pozivom neke od ovih operacija suspendovae se tekua nit na zadato vreme koje odbrojava
objekat klase Ti mer koji je podatak lan klase Thr ead. Nakon to ovaj broja dobroji do 0, nit e
prei iz suspended stanja u stanje ready ili running to zavisi od njenog prioriteta i prioriteta niti
koja trai procesor.
Operacija t i meSuspendRel at i ve( Ti me) suspenduje nit na vreme koje se meri poev od
trenutka poziva ove operacije. To znai da e se pozivom ove operacije aktivirati tajmer niti koju
suspendujemo i drae je blokiranu zadato vreme.
Operacija t i meSuspendAbsol ut e( Ti me) suspenduje nit tako da se aktivira za neko zadato
apsolutno vreme. Apsolutno vreme meri klasa SysTi me. Ona sadri tajmer koji se aktivira odmah
46
nakon to Thr eadCol l ect or ubaci u svoju kolekciju nit user Mai n. Operacija
get Cur r ent Ti me( ) vraa vreme koje je proteklo od tog poetnog trenutka. Dakle, operacija
t i meSuspedAbsol ut e( Ti me) suspenduje nit na relativno vreme koje je jednako razlici
apsolutnog vremena zadatog kao formalni argument ove funkcije i trenutnog vremena koje vraa
operacija get Cur r ent Ti me( ) .
Asinhrono preuzimanje se vri kad se neka od niti deblokira. U tom sluaju potrebno je
proveriti da li je deblokirana nit veeg prioriteta od one koja se trenutno izvrava. Ako je ovaj
uslov ispunjen vri se promena konteksta, tj. nit koja se do sada izvravala se stavlja u red
spremnih, a nova nit kree da se izvrava. Ako uslov nije ispunjen onda se nit koja se deblokira
stavlja u red spremnih i eka narednu priliku da preuzme procesor.
Modifikacija kolskog Jezgra podrava rasporeivanje niti sa fiksnim prioritetom (FPS),
koje je realizovano dodelom prioriteta nitima u samom konstruktoru. Svaka korisnika nit kao
parametar u konstruktoru prima celobrojnu promenljivu koja oznaava prioritet. Kao
podrazumevani prioritet niti se dodeljuje 1, to predstavlja najnii prioritet. Vea celobrojna
vrednost odgovara veem prioritetu.
Rasporeivanje niti se vri pomou klase Pr i or i t yQueue, tako da klasa Schedul er uvek
iz reda spremnih vadi proces sa najveim prioritetom, jer poseduje pokaziva na element sa
najveim prioritetom u svojoj kolekciji. Zbog toga nije troeno dodatno vreme na promenu
konteksta, samim tim je i manje lokalno plivanje. Jedino je pri asinhronom preuzimanju unoeno
dodatno kanjenje zbog poreenja prioriteta.
Za merenje vremena korien je prekid sata realnog vremena kod PC raunara na priblino
55 ms, preko niti I nt er r upt Handl er .
Funkcionisanje ovakvog Jezgra ilustrovano je primerom sistema sa N nezavisnih
periodinih procesa od kojih N/2 reaguje na sporadine spoljnje dogaaje (pritisak na taster), a
ostalih N/2 uzima odbirke A/D konvertora sa pomeranjem periode.
U nastavku teksta dat je kompletan izvorni kod na jeziku C++ kojim je implementirano
jezgro sa preuzimanjem i FPS.
Datoteka adc. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: A/ D conver t er
/ / Fi l e: adc. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of A/ D conver t er
/ / Cl ass: ADC

#i f ndef _ADC_
#def i ne _ADC_

#i ncl ude <i ost r eam. h>
#i ncl ude " syst i me. h"

t ypedef doubl e Val ue;

cl ass ADC {
publ i c:

ADC ( i nt ) ;

voi d st ar t Conver si on ( ) ;
Val ue r eadVal ue ( ) ;

pr i vat e:

Val ue val ue;
47
i nt myI D;

};

#endi f
Datoteka adc. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: A/ D conver t er
/ / Fi l e: adc. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Si mul at i on of A/ D conver t er
/ / Cl ass: ADC

#i ncl ude " adc. h"

ADC: : ADC ( i nt I D) : myI D( I D) { }

voi d ADC: : st ar t Conver si on( ) {
cout << SysTi me: : i nst ance( ) - >get Cur r ent Ti me( ) << " \ t " <<
" ADC st ar t conver si on f or t hr ead " << myI D <<
" ( " << Thr ead: : r unni ng( ) - >get PEFor Schedul er ( ) - >get Pr i or i t y( ) << " ) " << endl ;
}

Val ue ADC: : r eadVal ue( ) {
cout << SysTi me: : i nst ance( ) - >get Cur r ent Ti me( ) << " \ t " <<
" ADC r ead val ue f or t hr ead " << myI D <<
" ( " << Thr ead: : r unni ng( ) - >get PEFor Schedul er ( ) - >get Pr i or i t y( ) << " ) " << endl ;
r et ur n val ue;
}
Datoteka key. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Key I nt er r upt
/ / Fi l e: key. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Key i nt er r upt
/ / Cl ass: KeyI nt er r upt

#i f ndef _KEY_
#def i ne _KEY_

#i ncl ude <dos. h>
#i ncl ude " i nt er pt . h"
#i ncl ude " spor adi c. h"

const i nt Ti mer I nt No = 0X09;

voi d i nt er r upt ( *ol dHandl er Key) ( . . . ) = get vect ( Ti mer I nt No) ;

cl ass KeyI nt er r upt : publ i c I nt er r upt Handl er {
pr ot ect ed:

KeyI nt er r upt ( ) : I nt er r upt Handl er ( Ti mer I nt No, keyI nt er r upt ) { }
~KeyI nt er r upt ( ) { set vect ( Ti mer I nt No, ol dHandl er Key) ; }

st at i c voi d i nt er r upt keyI nt er r upt ( . . . ) {
i nst ance- >i nt er r upt Handl er ( ) ;
ol dHandl er Key( ) ;
}
vi r t ual i nt handl e ( ) { Spor adi cThr ead: : ev- >si gnal ( ) ; r et ur n 1; };
48

pr i vat e:

st at i c KeyI nt er r upt * i nst ance;

};

KeyI nt er r upt * KeyI nt er r upt : : i nst ance = new KeyI nt er r upt ;

#endi f
Datoteka per i odi c. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Per i odi c Thr ead
/ / Fi l e: per i odi c. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Per i odi c t hr ead
/ / Cl ass: Per i odi cThr ead

#i f ndef _PERI ODI C_
#def i ne _PERI ODI C_

#i ncl ude " ker nel . h"
#i ncl ude " adc. h"
#i ncl ude " par ams. h"

cl ass Per i odi cThr ead : publ i c Thr ead {
publ i c:

Per i odi cThr ead ( i nt , i nt ) ;
~Per i odi cThr ead ( ) ;

vi r t ual voi d r un( ) ;

pr i vat e:

ADC* myADC;
i nt I D;

};

#endi f
Datoteka per i odi c. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Per i odi c Thr ead
/ / Fi l e: per i odi c. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Per i odi c t hr ead
/ / Cl ass: Per i odi cThr ead

#i ncl ude " per i odi c. h"

Per i odi cThr ead: : Per i odi cThr ead ( i nt I D, i nt pr i ) : Thr ead( pr i +1) {
myADC = new ADC( I D) ;
st ar t ( ) ;
}

Per i odi cThr ead: : ~Per i odi cThr ead( ) {
del et e myADC;
}
49

voi d Per i odi cThr ead: : r un( ) {
f or ( ; ; ) {
myADC- >st ar t Conver si on( ) ;
t i meSuspendRel at i ve( per i odi c_T) ;
myADC- >r eadVal ue( ) ;
}
}
Datoteka spor adi c. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Spor adi c Thr ead
/ / Fi l e: spor adi c. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Spor adi c t hr ead
/ / Cl ass: Spor adi cThr ead

#i f ndef _SPORADI C_
#def i ne _SPORADI C_

#i ncl ude " ker nel . h"

cl ass Spor adi cThr ead : publ i c Thr ead {
publ i c:

Spor adi cThr ead ( i nt , i nt ) ;

st at i c Semaphor e* ev;

pr ot ect ed:

vi r t ual voi d r un( ) ;

pr i vat e:

i nt myI D;

};

#endi f
Datoteka spor adi c. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Spor adi c Thr ead
/ / Fi l e: spor adi c. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Spor adi c t hr ead
/ / Cl ass: Spor adi cThr ead

#i ncl ude <coni o. h>
#i ncl ude <i ost r eam. h>
#i ncl ude " spor adi c. h"
#i ncl ude " key. h"

Spor adi cThr ead: : Spor adi cThr ead ( i nt I D, i nt pr i ) : Thr ead( pr i +1) , myI D( I D) {
st ar t ( ) ;
}

Semaphor e* Spor adi cThr ead: : ev = new Semaphor e( 0) ;

voi d Spor adi cThr ead: : r un( ) {
50
f or ( ; ; ) {
ev- >wai t ( ) ;
cout << SysTi me: : i nst ance( ) - >get Cur r ent Ti me( ) << " \ t " <<
" Spor adi c event f or t hr ead " << myI D <<
" ( " << Thr ead: : r unni ng( ) - >get PEFor Schedul er ( ) - >get Pr i or i t y( ) << " ) " << endl ;
}
}
Datoteka syst i me. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Syst emt i me
/ / Fi l e: syst i me. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Syst emt i me measur ement
/ / Cl ass: SysTi me

#i f ndef _SYSTI ME_
#def i ne _SYSTI ME_

#i ncl ude " t i mer . h"
#i ncl ude " ker nel . h"
#i ncl ude " par ams. h"

cl ass SysTi me : publ i c Ti meabl e {
publ i c:

st at i c SysTi me* i nst ance( ) ;

voi d st ar t ( ) ;
vi r t ual voi d t i meout ( ) ;

Ti me get Cur r ent Ti me( ) ;

pr ot ect ed:

SysTi me( ) ;

pr i vat e:

Ti mer sysTi mer ;
st at i c i nt count er ;

};

#endi f
Datoteka syst i me. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Syst emt i me
/ / Fi l e: syst i me. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Syst emt i me measur ement
/ / Cl ass: SysTi me

#i ncl ude " syst i me. h"

SysTi me: : SysTi me( ) : sysTi mer ( t i me_T, t hi s) { }

SysTi me* SysTi me: : i nst ance( ) {
st at i c SysTi me i nst ance;
r et ur n &i nst ance;
51
}

i nt SysTi me: : count er = 0;

voi d SysTi me: : st ar t ( ) {
sysTi mer . st ar t ( t i me_T) ;
}

voi d SysTi me: : t i meout ( ) {
sysTi mer . r est ar t ( ) ;
count er ++;
}

Ti me SysTi me: : get Cur r ent Ti me( ) {
r et ur n sysTi mer . el apsed( ) ;
}
Datoteka par ams. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Par amet er s
/ / Fi l e: par ams. h
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Var i ous syst empar amet er s

#i f ndef _PARAMS_
#def i ne _PARAMS_

const unsi gned i nt N = 12;

const i nt per i odi c_T = 50;

const i nt t i me_T = 65536;

#endi f
Datoteka user mai n. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Mai n modul e
/ / Fi l e: user mai n. cpp
/ / Cr eat ed: Mar ch 2006
/ / Revi sed: Apr i l 2006
/ / Aut hor : I van I vanov
/ / Cont ent s: Mai n modul e
/ / Funct i ons: user Mai n
/ / t i meSuspendRel at i ve
/ / t i meSuspendAbsol ut e

#i ncl ude <coni o. h>
#i ncl ude <i ost r eam. h>
#i ncl ude " ker nel . h"
#i ncl ude " per i odi c. h"
#i ncl ude " spor adi c. h"
#i ncl ude " par ams. h"

voi d t i meSuspendRel at i ve( Ti me t ) {
i f ( Thr ead: : r unni ng) {
i f ( Thr ead: : r unni ngThr ead- >i sTi mi ng) {
Thr ead: : r unni ngThr ead- >myTi mer . set MyTi meabl e( Thr ead: : r unni ngThr ead) ;
Thr ead: : r unni ngThr ead- >i sTi mi ng = 0;
}
Thr ead: : r unni ngThr ead- >myTi mer . st ar t ( t ) ;
Thr ead: : r unni ngThr ead- >t i meBl ocki ng. wai t ( ) ;
}
52
}

voi d t i meSuspendAbsol ut e( Ti me t ) {
i f ( Thr ead: : r unni ng) {
i f ( Thr ead: : r unni ngThr ead- >i sTi mi ng) {
Thr ead: : r unni ngThr ead- >myTi mer . set MyTi meabl e( Thr ead: : r unni ngThr ead) ;
Thr ead: : r unni ngThr ead- >i sTi mi ng=0;
}
Thr ead: : r unni ngThr ead- >myTi mer . st ar t ( t - SysTi me: : i nst ance( ) - >get Cur r ent Ti me( ) ) ;
Thr ead: : r unni ngThr ead- >t i meBl ocki ng. wai t ( ) ;
}
}

voi d user Mai n( ) {
Thr ead* t hr ead[ N] ;

cl r scr ( ) ;

f or ( i nt i =0; i <N/ 2; i ++) t hr ead[ i ] = new Per i odi cThr ead( i , i ) ;
f or ( ; i <N; i ++) t hr ead[ i ] = new Spor adi cThr ead( i , i ) ;

di spat ch( ) ;
}
Datoteka col l ect . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Dat a St r uct ur es
/ / Modul e: Col l ect i on
/ / Fi l e: col l ect . h
/ / Cr eat ed: Oct ober 2002
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl ass: Col l ect i onEl ement
/ / Col l ect i on
/ / Col l ect i onI t er at or

#i f ndef _COLLECTI ON_
#def i ne _COLLECTI ON_

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Col l ect i onEl ement
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Obj ect {};
cl ass Col l ect i on;

cl ass Col l ect i onEl ement {
publ i c:

Col l ect i onEl ement ( Obj ect * hol der ) ;

Obj ect * get Hol der ( ) { r et ur n hol der ; }
Col l ect i on* get Cont ai ner ( ) { r et ur n cont ai ner ; }

pr i vat e:

f r i end cl ass Col l ect i on;
f r i end cl ass Col l ect i onI t er at or ;
voi d set ( Col l ect i onEl ement * pr ev, Col l ect i onEl ement * next ) ;
voi d set Cont ai ner ( Col l ect i on* col ) { cont ai ner = col ; }

Col l ect i onEl ement *pr ev, *next ;

Col l ect i on* cont ai ner ;
Obj ect * hol der ;

53
};

i nl i ne Col l ect i onEl ement : : Col l ect i onEl ement ( Obj ect * h)
: cont ai ner ( 0) , hol der ( h) , pr ev( 0) , next ( 0) {}

i nl i ne voi d Col l ect i onEl ement : : set ( Col l ect i onEl ement * p, Col l ect i onEl ement * n) {
pr ev = p;
next = n;
i f ( n! =0) n- >pr ev=t hi s;
i f ( p! =0) p- >next =t hi s;
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Col l ect i on
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Col l ect i onI t er at or ;

cl ass Col l ect i on {
publ i c:

Col l ect i on ( ) ;
~Col l ect i on ( ) ;

voi d append ( Col l ect i onEl ement *) ;
voi d i nser t ( Col l ect i onEl ement *, i nt at =0) ;
voi d i nser t Bef or e ( Col l ect i onEl ement * newEl em, Col l ect i onEl ement * bef or eThi s) ;
voi d i nser t Af t er ( Col l ect i onEl ement * newEl em, Col l ect i onEl ement * af t er Thi s) ;

voi d r emove ( Col l ect i onEl ement *) ;
Obj ect * r emove ( i nt at =0) ;
Obj ect * r emoveFi r st ( ) { r et ur n r emove( 0) ; }
Obj ect * r emoveLast ( ) { r et ur n r emove( si ze( ) - 1) ; }

voi d cl ear ( ) ;

i nt i sEmpt y ( ) { r et ur n sz==0; }
i nt si ze ( ) { r et ur n sz; }

Obj ect * f i r st ( ) { r et ur n head- >get Hol der ( ) ; }
Obj ect * l ast ( ) { r et ur n t ai l - >get Hol der ( ) ; }
Obj ect * i t emAt ( i nt at ) ;

i nt l ocat i on( Col l ect i onEl ement *) ;

Col l ect i onI t er at or * cr eat eI t er at or ( ) ;
Col l ect i onI t er at or * get I t er at or ( ) { r et ur n i nt er nal I t er at or ; }

pr i vat e:

f r i end cl ass Col l ect i onI t er at or ;
Col l ect i onEl ement * head;
Col l ect i onEl ement * t ai l ;
i nt sz;

Col l ect i onI t er at or * i nt er nal I t er at or ;

};

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Col l ect i onI t er at or
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Col l ect i onI t er at or {
publ i c:

Col l ect i onI t er at or ( Col l ect i on* c) : col ( c) , cur ( 0) { r eset ( ) ; }

54
voi d r eset ( ) { i f ( col ! =0) cur =col - >head; }
i nt next ( ) { i f ( cur ! =0) cur =cur - >next ; r et ur n ! i sDone( ) ; }


i nt i sDone( ) { r et ur n cur ==0; }

Obj ect * cur r ent I t em( ) { r et ur n cur ?cur - >get Hol der ( ) : 0; }
Col l ect i onEl ement * cur r ent El ement ( ) { r et ur n cur ; }


pr i vat e:

Col l ect i on* col ;
Col l ect i onEl ement * cur ;

};

#endi f
Datoteka col l ect . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Dat a St r uct ur es
/ / Modul e: Col l ect i on
/ / Fi l e: col l ect . cpp
/ / Cr eat ed: Oct ober 2002
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl ass: Col l ect i onEl ement
/ / Col l ect i on
/ / Col l ect i onI t er at or

#i ncl ude " col l ect . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Col l ect i on
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

Col l ect i on: : Col l ect i on ( )
: head( 0) , t ai l ( 0) , sz( 0) ,
i nt er nal I t er at or ( new Col l ect i onI t er at or ( t hi s) )
{}

Col l ect i on: : ~Col l ect i on ( ) {
cl ear ( ) ;
del et e i nt er nal I t er at or ;
}

voi d Col l ect i on: : append ( Col l ect i onEl ement * e) {
i f ( e==0 | | e- >get Cont ai ner ( ) ! =0) r et ur n;
i f ( head==0) {
e- >set ( 0, 0) ;
head=t ai l =e;
}
el se {
e- >set ( t ai l , 0) ;
t ai l =e;
}
e- >set Cont ai ner ( t hi s) ;
sz++;
}

voi d Col l ect i on: : i nser t ( Col l ect i onEl ement * e, i nt at ) {
i f ( e==0 | | e- >get Cont ai ner ( ) ! =0 | | at <0 | | at >si ze( ) ) r et ur n;
i f ( at ==0) {
e- >set ( 0, head) ;
e- >set Cont ai ner ( t hi s) ;
55
head=e;
i f ( t ai l ==0) t ai l =head;
sz++;
r et ur n;
}
i f ( at ==si ze( ) ) {
append( e) ;
r et ur n;
}
i nt i =0;
f or ( Col l ect i onEl ement * cur =head; i <at ; cur =cur - >next , i ++) ;
e- >set ( cur - >pr ev, cur ) ;
e- >set Cont ai ner ( t hi s) ;
sz++;
}

voi d Col l ect i on: : i nser t Bef or e ( Col l ect i onEl ement * newEl em,
Col l ect i onEl ement * bef or eThi s) {
i f ( newEl em==0 | | newEl em- >get Cont ai ner ( ) ! =0) r et ur n;
i f ( bef or eThi s==0) { append( newEl em) ; r et ur n; }
i f ( bef or eThi s- >pr ev==0) { i nser t ( newEl em) ; r et ur n; }
newEl em- >set ( bef or eThi s- >pr ev, bef or eThi s) ;
newEl em- >set Cont ai ner ( t hi s) ;
sz++;
}

voi d Col l ect i on: : i nser t Af t er ( Col l ect i onEl ement * newEl em,
Col l ect i onEl ement * af t er Thi s) {
i f ( newEl em==0 | | newEl em- >get Cont ai ner ( ) ! =0) r et ur n;
i f ( af t er Thi s==0) { i nser t ( newEl em) ; r et ur n; }
i f ( af t er Thi s- >next ==0) { append( newEl em) ; r et ur n; }
newEl em- >set ( af t er Thi s, af t er Thi s- >next ) ;
newEl em- >set Cont ai ner ( t hi s) ;
sz++;
}

voi d Col l ect i on: : r emove ( Col l ect i onEl ement * e) {
i f ( e==0 | | e- >get Cont ai ner ( ) ! =t hi s) r et ur n;
i f ( e- >next ! =0) e- >next - >pr ev=e- >pr ev;
el se t ai l =e- >pr ev;
i f ( e- >pr ev! =0) e- >pr ev- >next =e- >next ;
el se head=e- >next ;
e- >set ( 0, 0) ;
e- >set Cont ai ner ( 0) ;
i f ( i nt er nal I t er at or && i nt er nal I t er at or - >cur r ent I t em( ) ==e- >get Hol der ( ) )
i nt er nal I t er at or - >next ( ) ;
sz- - ;
}

Obj ect * Col l ect i on: : r emove ( i nt at ) {
Col l ect i onEl ement * r et = 0;
i f ( at <0 | | at >=si ze( ) ) r et ur n 0;
i f ( at ==0) {
r et = head;
r emove( head) ;
r et ur n r et ?r et - >get Hol der ( ) : 0;
}
i f ( at ==si ze( ) - 1) {
r et = t ai l ;
r emove( t ai l ) ;
r et ur n r et ?r et - >get Hol der ( ) : 0;
}
i nt i =0;
f or ( Col l ect i onEl ement * cur =head; i <at ; cur =cur - >next , i ++) ;
r et = cur ;
r emove( cur ) ;
r et ur n r et ?r et - >get Hol der ( ) : 0;
}
56

voi d Col l ect i on: : cl ear ( ) {
f or ( Col l ect i onEl ement * cur =head, *t emp=0; cur ! =0; cur =t emp) {
t emp=cur - >next ;
cur - >set ( 0, 0) ;
cur - >set Cont ai ner ( 0) ;
}
head=0;
t ai l =0;
sz=0;
i f ( i nt er nal I t er at or ) i nt er nal I t er at or - >r eset ( ) ;
}

Obj ect * Col l ect i on: : i t emAt ( i nt at ) {
i f ( at <0 | | at >=si ze( ) ) r et ur n 0;
i nt i =0;
f or ( Col l ect i onEl ement * cur =head; i <at ; cur =cur - >next , i ++) ;
r et ur n cur ?cur - >get Hol der ( ) : 0;
}

i nt Col l ect i on: : l ocat i on ( Col l ect i onEl ement * e) {
i f ( e==0 | | e- >get Cont ai ner ( ) ! =t hi s) r et ur n - 1;
i nt i =0;
f or ( Col l ect i onEl ement * cur =head; cur ! =0; cur =cur - >next , i ++)
i f ( cur ==e) r et ur n i ;
r et ur n - 1;
}

Col l ect i onI t er at or * Col l ect i on: : cr eat eI t er at or ( ) {
r et ur n new Col l ect i onI t er at or ( t hi s) ;
}
Datoteka ker nel . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Ker nel
/ / Fi l e: ker nel . h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Ker nel I nt er f ace
/ / Hel per f unct i on: di spat ch

#i f ndef _KERNEL_
#def i ne _KERNEL_

#i ncl ude " t hr ead. h"
#i ncl ude " semaphor . h"
#i ncl ude " msgque. h"
#i ncl ude " t i mer . h"
#i ncl ude " syst i me. h"

/ / For compat i bi l i t y wi t h pr evi ous ver si ons:

i nl i ne voi d di spat ch ( ) { Thr ead: : di spat ch( ) ; }

#endi f
Datoteka ker nel . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Ker nel
/ / Fi l e: ker nel . cpp
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Ker nel mai n modul e
57
/ / Hel per f unct i ons: l ock
/ / unl ock
/ / Funct i on: mai n

#i ncl ude <dos. h>
#i ncl ude " kr nl . h"
#i ncl ude " t hr ead. h"
#i ncl ude " schedul . h"
#i ncl ude " t hr col . h"
#i ncl ude " syst i me. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Hel per f unct i ons l ock ( ) and unl ock ( )
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

voi d l ock ( ) { di sabl e( ) ; } / / swi t ch t o Ker nel mode
voi d unl ock ( ) { enabl e( ) ; } / / swi t ch t o User mode

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Funct i on: mai n ( )
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

j mp_buf mai nCont ext ; / / Cont ext of t he mai n t hr ead

voi d mai n ( ) {

Thr eadCol l ect or : : cr eat e( ) ;
Thr eadCol l ect or : : I nst ance( ) - >st ar t ( ) ;

Thr ead: : r unni ngThr ead = new Thr ead( user Mai n) ;
Thr eadCol l ect or : : I nst ance( ) - >put ( Thr ead: : r unni ng( ) ) ;

SysTi me: : i nst ance( ) - >st ar t ( ) ;

i f ( set j mp( mai nCont ext ) ==0) {
unl ock( ) ;
Thr ead: : r unni ng( ) - >r esume( ) ;
} el se {
Thr eadCol l ect or : : dest r oy( ) ;
r et ur n;
}
}
Datoteka kr nl . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Ker nel
/ / Fi l e: kr nl . h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Ker nel modul e i nt er f ace
/ / Hel per f unct i ons: l ock
/ / unl ock

#i f ndef _KRNL_
#def i ne _KRNL_

#i ncl ude <set j mp. h>

voi d l ock ( ) ; / / swi t ch t o ker nel mode
voi d unl ock ( ) ; / / swi t ch t o user mode

ext er n voi d user Mai n( ) ; / / User ' s mai n f unct i on

ext er n j mp_buf mai nCont ext ; / / Cont ext of t he mai n t hr ead

58
#endi f
Datoteka msgque. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: MessageQueue
/ / Fi l e: msgque. h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Communi cat i on concept : Message Queue
/ / Cl ass: MsgQueue

#i f ndef _MSGQUE_
#def i ne _MSGQUE_

#i ncl ude " queue. h"
#i ncl ude " semaphor . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Cl ass MsgQueue
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass MsgQueue {
publ i c:

MsgQueue ( ) : mut ex( 1) , not Empt y( 0) , not Ful l ( 0) {}
~MsgQueue ( ) { mut ex. wai t ( ) ; }

voi d send ( Col l ect i onEl ement *) ;
Obj ect * r ecei ve ( ) ; / / bl ocki ng
i nt r ecei ve ( Obj ect **) ; / / nonbl ocki ng
voi d cl ear ( ) ;

Obj ect * f i r st ( ) ;
i nt i sEmpt y ( ) ;
i nt i sFul l ( ) ;
i nt si ze ( ) ;

pr i vat e:

Queue r ep;
Semaphor e mut ex, not Empt y, not Ful l ;

};

#endi f
Datoteka msgque. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: MessageQueue
/ / Fi l e: msgque. cpp
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Communi cat i on concept : Message Queue
/ / Cl ass: MsgQueue

#i ncl ude " msgque. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Cl ass MsgQueue
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

voi d MsgQueue: : send ( Col l ect i onEl ement * ce) {
Mut ex dummy( &mut ex) ;
59
i f ( r ep. i sFul l ( ) ) {
si gnal Wai t ( &mut ex, &not Ful l ) ;
mut ex. wai t ( ) ;
}
r ep. put ( ce) ;
i f ( not Empt y. val ue( ) <0) not Empt y. si gnal ( ) ;
}

Obj ect * MsgQueue: : r ecei ve ( ) {
Mut ex dummy( &mut ex) ;
i f ( r ep. i sEmpt y( ) ) {
si gnal Wai t ( &mut ex, &not Empt y) ;
mut ex. wai t ( ) ;
}
Obj ect * t emp=r ep. get ( ) ;
i f ( not Ful l . val ue( ) <0) not Ful l . si gnal ( ) ;
r et ur n t emp;
}

i nt MsgQueue: : r ecei ve ( Obj ect ** t ) {
Mut ex dummy( &mut ex) ;
i f ( r ep. i sEmpt y( ) ) r et ur n 0;
i f ( t ) *t =r ep. get ( ) ;
i f ( not Ful l . val ue( ) <0) not Ful l . si gnal ( ) ;
r et ur n 1;
}

voi d MsgQueue: : cl ear ( ) {
Mut ex dummy( &mut ex) ;
r ep. cl ear ( ) ;
}

Obj ect * MsgQueue: : f i r st ( ) {
Mut ex dummy( &mut ex) ;
r et ur n r ep. f i r st ( ) ;
}

i nt MsgQueue: : i sEmpt y ( ) {
Mut ex dummy( &mut ex) ;
r et ur n r ep. i sEmpt y( ) ;
}

i nt MsgQueue: : i sFul l ( ) {
Mut ex dummy( &mut ex) ;
r et ur n r ep. i sFul l ( ) ;
}

i nt MsgQueue: : si ze ( ) {
Mut ex dummy( &mut ex) ;
r et ur n r ep. si ze( ) ;
}
Datoteka pqueue. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Dat a St r uct ur es
/ / Modul e: Pr i or i t y Queue
/ / Fi l e: pqueue. h
/ / Cr eat ed: Oct ober 2002
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl asses: Pr i or i t yEl ement
/ / Pr i or i t yQueue
/ / Col l ect i onI t er at or
/ / Type: Pr i or i t y

#i f ndef _PQUEUE_
60
#def i ne _PQUEUE_

#i ncl ude " col l ect . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Pr i or i t yEl ement
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

t ypedef unsi gned i nt Pr i or i t y;
const Pr i or i t y Mi nPr i = 0;

cl ass Pr i or i t yQueue;

cl ass Pr i or i t yEl ement : publ i c Col l ect i onEl ement {
publ i c:

Pr i or i t yEl ement ( Obj ect * hol der , Pr i or i t y p = 0)
: Col l ect i onEl ement ( hol der ) , pr i ( p) , cont ai ner ( 0) {}

Pr i or i t y get Pr i or i t y ( ) { r et ur n pr i ; }
voi d set Pr i or i t y ( Pr i or i t y newPr i ) ;

Pr i or i t yQueue* get Cont ai ner ( ) { r et ur n cont ai ner ; }

pr i vat e:

Pr i or i t y pr i ;

f r i end cl ass Pr i or i t yQueue;
voi d set Cont ai ner ( Pr i or i t yQueue* c) { cont ai ner = c; }
Pr i or i t yQueue* cont ai ner ;

};

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Pr i or i t yQueue
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Pr i or i t yQueue {
publ i c:

Pr i or i t yQueue ( ) : col ( ) , hi ghest ( 0) {}

Obj ect * f i r st ( ) { r et ur n hi ghest ?hi ghest - >get Hol der ( ) : 0; }

voi d add ( Pr i or i t yEl ement *) ;
voi d r emove ( Pr i or i t yEl ement *) ;
voi d cl ear ( ) ;

voi d not i f yPr i or i t yChange ( Pr i or i t yEl ement *) ;

i nt i sEmpt y ( ) { r et ur n col . i sEmpt y( ) ; }
i nt si ze ( ) { r et ur n col . si ze( ) ; }

Col l ect i onI t er at or * cr eat eI t er at or ( ) { r et ur n col . cr eat eI t er at or ( ) ; }
Col l ect i onI t er at or * get I t er at or ( ) { r et ur n col . get I t er at or ( ) ; }

pr i vat e:

Col l ect i on col ;
Pr i or i t yEl ement * hi ghest ;

};

#endi f
61
Datoteka pqueue. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Dat a St r uct ur es
/ / Modul e: Pr i or i t y Queue
/ / Fi l e: pqueue. cpp
/ / Cr eat ed: Oct ober 2002
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl asses: Pr i or i t yEl ement
/ / Pr i or i t yQueue
/ / Col l ect i onI t er at or

#i ncl ude " pqueue. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Pr i or i t yEl ement
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

voi d Pr i or i t yEl ement : : set Pr i or i t y( Pr i or i t y newPr i ) {
i f ( pr i ==newPr i ) r et ur n;
pr i = newPr i ;
i f ( cont ai ner ! =0) cont ai ner - >not i f yPr i or i t yChange( t hi s) ;
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Pr i or i t yQueue
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

voi d Pr i or i t yQueue: : add( Pr i or i t yEl ement * e) {
i f ( e==0 | | e- >get Cont ai ner ( ) ! =0) r et ur n;
col . append( e) ;
e- >set Cont ai ner ( t hi s) ;
not i f yPr i or i t yChange( e) ;
}

voi d Pr i or i t yQueue: : r emove( Pr i or i t yEl ement * e) {
i f ( e==0 | | e- >get Cont ai ner ( ) ! =t hi s) r et ur n;
col . r emove( e) ;
e- >set Cont ai ner ( 0) ;
i f ( hi ghest ! =e) r et ur n;

Pr i or i t y maxPr i = Mi nPr i ;
hi ghest = 0;
Col l ect i onI t er at or * i t = get I t er at or ( ) ;
f or ( i t - >r eset ( ) ; ! i t - >i sDone( ) ; i t - >next ( ) ) {
Pr i or i t yEl ement * pe = ( Pr i or i t yEl ement *) i t - >cur r ent El ement ( ) ;
i f ( pe- >get Pr i or i t y( ) >=maxPr i ) {
maxPr i = pe- >get Pr i or i t y( ) ;
hi ghest = pe;
}
}
}

voi d Pr i or i t yQueue: : cl ear ( ) {
Col l ect i onI t er at or * i t = get I t er at or ( ) ;
f or ( i t - >r eset ( ) ; ! i t - >i sDone( ) ; i t - >next ( ) ) {
Pr i or i t yEl ement * pe = ( Pr i or i t yEl ement *) i t - >cur r ent El ement ( ) ;
pe- >set Cont ai ner ( 0) ;
}
col . cl ear ( ) ;
hi ghest = 0;
}

voi d Pr i or i t yQueue: : not i f yPr i or i t yChange( Pr i or i t yEl ement * e) {
i f ( e==0 | | e- >get Cont ai ner ( ) ! =t hi s) r et ur n;
i f ( hi ghest ==0 | | hi ghest - >get Pr i or i t y( ) <e- >get Pr i or i t y( ) ) {
62
hi ghest = e;
r et ur n;
}
i f ( hi ghest ==e) {
Pr i or i t y maxPr i = e- >get Pr i or i t y( ) ;
Col l ect i onI t er at or * i t = get I t er at or ( ) ;
f or ( i t - >r eset ( ) ; ! i t - >i sDone( ) ; i t - >next ( ) ) {
Pr i or i t yEl ement * pe = ( Pr i or i t yEl ement *) i t - >cur r ent El ement ( ) ;
i f ( pe- >get Pr i or i t y( ) >maxPr i ) {
maxPr i = pe- >get Pr i or i t y( ) ;
hi ghest = pe;
}
}
r et ur n;
}
}
Datoteka queue. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Dat a St r uct ur es
/ / Modul e: FI FO Queue
/ / Fi l e: queue. h
/ / Cr eat ed: Oct ober 2002
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl ass: Queue

#i f ndef _QUEUE_
#def i ne _QUEUE_

#i ncl ude " col l ect . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Queue
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Queue {
publ i c:

voi d put ( Col l ect i onEl ement * e) { col . append( e) ; }
Obj ect * get ( ) { r et ur n col . r emoveFi r st ( ) ; }
voi d cl ear ( ) { col . cl ear ( ) ; }

i nt i sEmpt y ( ) { r et ur n col . i sEmpt y( ) ; }
i nt i sFul l ( ) { r et ur n 0; }
i nt si ze ( ) { r et ur n col . si ze( ) ; }

Obj ect * f i r st ( ) { r et ur n col . f i r st ( ) ; }
Obj ect * l ast ( ) { r et ur n col . l ast ( ) ; }
Obj ect * i t emAt ( i nt at ) { r et ur n col . i t emAt ( at ) ; }

i nt l ocat i on( Col l ect i onEl ement * e) { r et ur n col . l ocat i on( e) ; }

Col l ect i onI t er at or * cr eat eI t er at or ( ) { r et ur n col . cr eat eI t er at or ( ) ; }
Col l ect i onI t er at or * get I t er at or ( ) { r et ur n col . get I t er at or ( ) ; }

pr i vat e:

Col l ect i on col ;

};

#endi f
Datoteka r ecycl e. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
63
/ / Subj ect : Dat a St r uct ur es
/ / Modul e: Recycl e Bi n
/ / Fi l e: r ecycl e. h
/ / Cr eat ed: Oct ober 2002
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl ass: Recycl eBi n
/ / Macr os: RECYCLE_DEC( X)
/ / RECYCLE_DEF( X)
/ / RECYCLE_CON( X)

#i f ndef _RECYCLE_
#def i ne _RECYCLE_

#i ncl ude <st dl i b. h>
#i ncl ude " col l ect . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Recycl eBi n
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Recycl eBi n {
publ i c:

voi d r ecycl e ( Col l ect i onEl ement * e) { col . append( e) ; }
voi d* get New ( si ze_t si ze) ;

i nt i sEmpt y ( ) { r et ur n col . i sEmpt y( ) ; }
i nt si ze ( ) { r et ur n col . si ze( ) ; }

pr i vat e:

Col l ect i on col ;

};

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / macr o RECYCLE_DEC( X)
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

#def i ne RECYCLE_DEC( X) \
pr i vat e: st at i c Recycl eBi n myRecycl eBi n; \
publ i c: st at i c voi d* oper at or new ( si ze_t ) ; \
publ i c: st at i c voi d oper at or del et e ( voi d*) ; \
pr i vat e: Col l ect i onEl ement f or Recycl eBi n; \

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / macr o RECYCLE_CON
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

#def i ne RECYCLE_CON( X) \
f or Recycl eBi n( t hi s)

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / macr o RECYCLE_DEF( X)
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

#def i ne RECYCLE_DEF( X) \
Recycl eBi n X: : myRecycl eBi n; \
\
voi d* X: : oper at or new ( si ze_t sz) { \
r et ur n myRecycl eBi n. get New( sz) ; \
} \
\
voi d X: : oper at or del et e ( voi d* p) { \
myRecycl eBi n. r ecycl e( &( ( X*) p) - >f or Recycl eBi n) ; \
}
64

#endi f
Datoteka r ecycl e. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Dat a St r uct ur es
/ / Modul e: Recycl e Bi n
/ / Fi l e: r ecycl e. cpp
/ / Cr eat ed: Oct ober 2002
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl ass: Recycl eBi n

#i ncl ude " r ecycl e. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Recycl eBi n
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

voi d* Recycl eBi n: : get New ( si ze_t si ze) {
Obj ect * obj = col . r emoveFi r st ( ) ;
i f ( obj ! =0) r et ur n obj ;
r et ur n new char [ si ze] ;
}
Datoteka schedul . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Schedul er
/ / Fi l e: schedul . h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl ass: Schedul er

#i f ndef _SCHEDUL_
#def i ne _SCHEDUL_

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Schedul er
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Thr ead;

cl ass Schedul er {
publ i c:

st at i c Schedul er * I nst ance ( ) ;

vi r t ual voi d put ( Thr ead*) = 0;
vi r t ual Thr ead* get ( ) = 0;

pr ot ect ed:
Schedul er ( ) {}

};

#endi f
Datoteka schedul . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Schedul er
/ / Fi l e: schedul . cpp
65
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s:
/ / Cl asses: Schedul er
/ / RoundRobi nSchedul er

#def i ne _RoundRobi nSchedul er

#i ncl ude " schedul . h"
#i ncl ude " t hr ead. h"
#i ncl ude " pqueue. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass RoundRobi nSchedul er
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass RoundRobi nSchedul er : publ i c Schedul er {
publ i c:

vi r t ual voi d put ( Thr ead* t ) { i f ( t ) r ep. add( t - >get PEFor Schedul er ( ) ) ; }
vi r t ual Thr ead* get ( ) ;

pr i vat e:
Pr i or i t yQueue r ep;
};

Thr ead* RoundRobi nSchedul er : : get ( ) { / / added by I vanov
Thr ead* t hr ead = ( Thr ead*) r ep. f i r st ( ) ;
r ep. r emove( t hr ead- >get PEFor Schedul er ( ) ) ;
r et ur n t hr ead;
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Schedul er
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

Schedul er * Schedul er : : I nst ance ( ) {
#i f def _RoundRobi nSchedul er
st at i c RoundRobi nSchedul er i nst ance;
#endi f
r et ur n &i nst ance;
}
Datoteka semaphor . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Semaphor e
/ / Fi l e: semaphor . h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Synchr oni zat i on concept s: Semaphor e, Event , Mut ex,
/ / and I nt er r upt Handl er
/ / Cl asses: Semaphor e
/ / Event
/ / Mut ex

#i f ndef _SEMAPHOR_
#def i ne _SEMAPHOR_

#i ncl ude " queue. h"
#i ncl ude " r ecycl e. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Semaphor e
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
66

cl ass Semaphor e : publ i c Obj ect {
publ i c:

Semaphor e ( i nt i ni t Val ue=1) ;
~Semaphor e ( ) ;

voi d wai t ( ) ;
voi d si gnal ( ) ;

f r i end voi d si gnal Wai t ( Semaphor e* s, Semaphor e* w) ;

i nt val ue ( ) { r et ur n val ; }

pr ot ect ed:

voi d bl ock ( ) ;
voi d debl ock ( ) ;

i nt val ;

pr i vat e:

Queue bl ocked;

RECYCLE_DEC( Semaphor e)

};

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Event
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Event : publ i c Semaphor e {
publ i c:

Event ( ) ;

voi d wai t ( ) ;
voi d si gnal ( ) ;

RECYCLE_DEC( Event )

};

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Mut ex
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Mut ex {
publ i c:

Mut ex ( Semaphor e* s) : sem( s) { i f ( sem) sem- >wai t ( ) ; }
~Mut ex ( ) { i f ( sem) sem- >si gnal ( ) ; }

pr i vat e:
Semaphor e* sem;

};

#endi f
Datoteka semaphor . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Semaphor e
/ / Fi l e: semaphor . cpp
67
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Synchr oni zat i on concept s: Semaphor e, Event , Mut ex,
/ / and I nt er r upt Handl er
/ / Cl asses: Semaphor e
/ / Event
/ / Mut ex
/ / I nt er r upt Handl er

#i ncl ude <dos. h>
#i ncl ude " schedul . h"
#i ncl ude " i nt er pt . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Semaphor e
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

RECYCLE_DEF( Semaphor e) ;

Semaphor e: : Semaphor e ( i nt i ni t ) : RECYCLE_CON( Semaphor e) , val ( i ni t ) {}

Semaphor e: : ~Semaphor e ( ) {
l ock( ) ;
f or ( Col l ect i onI t er at or * i t =bl ocked. get I t er at or ( ) ; ! i t - >i sDone( ) ; i t - >next ( ) )
Schedul er : : I nst ance( ) - >put ( ( Thr ead*) i t - >cur r ent I t em( ) ) ;
unl ock( ) ;
}

voi d Semaphor e: : bl ock ( ) {
i f ( Thr ead: : r unni ngThr ead- >set Cont ext ( ) ==0) {
/ / Bl ocki ng:
bl ocked. put ( Thr ead: : r unni ngThr ead- >get CEFor Semaphor e( ) ) ;
Thr ead: : r unni ngThr ead = Schedul er : : I nst ance( ) - >get ( ) ;
Thr ead: : r unni ngThr ead- >r esume( ) ; / / cont ext swi t ch
} el se r et ur n;
}

voi d Semaphor e: : debl ock ( ) {
/ / Debl ocki ng:
Thr ead* t = ( Thr ead*) bl ocked. get ( ) ;
i f ( t )
i f ( t - >get Pr i or i t y( ) >Thr ead: : r unni ngThr ead- >get Pr i or i t y( ) ) {
Schedul er : : I nst ance( ) - >put ( Thr ead: : r unni ngThr ead) ;
Thr ead: : r unni ngThr ead=t ;
Thr ead: : r unni ngThr ead- >r esume( ) ;
}
el se Schedul er : : I nst ance( ) - >put ( t ) ;
}

voi d Semaphor e: : wai t ( ) {
l ock( ) ;
i f ( - - val <0)
bl ock( ) ;
unl ock( ) ;
}

voi d Semaphor e: : si gnal ( ) {
l ock( ) ;
i f ( val ++<0)
debl ock( ) ;
unl ock( ) ;
}

voi d si gnal Wai t ( Semaphor e* s, Semaphor e* w) {
l ock( ) ;
i f ( s && s- >val ++<0) s- >debl ock( ) ;
i f ( w && - - w- >val <0) w- >bl ock( ) ;
68
unl ock( ) ;
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Event
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

RECYCLE_DEF( Event ) ;

Event : : Event ( ) : RECYCLE_CON( Event ) , Semaphor e( 0) {}

voi d Event : : wai t ( ) {
l ock( ) ;
i f ( - - val <0)
bl ock( ) ;
unl ock( ) ;
}

voi d Event : : si gnal ( ) {
l ock( ) ;
i f ( ++val <=0)
debl ock( ) ;
el se
val =1;
unl ock( ) ;
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass I nt er r upt Handl er
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

voi d i ni t I VT ( I nt No br , voi d i nt er r upt ( *neki hendl er ) ( . . . ) ) {
/ / I ni t I VT ent r y by t he gi ven vect or
set vect ( br , neki hendl er ) ; / / added by I vanov
}

I nt er r upt Handl er : : I nt er r upt Handl er ( I nt No num, voi d i nt er r upt ( *i nt Handl er ) ( . . . ) ) {
/ / I ni t I VT ent r y numby i nt Handl er vect or :
i ni t I VT( num, i nt Handl er ) ;

/ / St ar t t he t hr ead:
st ar t ( ) ;
}

voi d I nt er r upt Handl er : : r un ( ) {
f or ( ; ; ) {
ev. wai t ( ) ;
i f ( handl e( ) ==0) r et ur n;
}
}

voi d I nt er r upt Handl er : : i nt er r upt Handl er ( ) {
ev. si gnal ( ) ;
}
Datoteka t hr col . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Thr ead Col l ect or
/ / Fi l e: t hr col . h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Thr ead Col l ect or r esponsi bl e f or t hr ead del et i on
/ / Cl ass: Thr eadCol l ect or

#i f ndef _THRCOL_
69
#def i ne _THRCOL_

#i ncl ude " col l ect . h"
#i ncl ude " t hr ead. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Thr eadCol l ect or
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Thr eadCol l ect or : publ i c Thr ead {
publ i c:

st at i c Thr eadCol l ect or * I nst ance ( ) ;

voi d put ( Thr ead*) ;
i nt count ( ) ;

pr ot ect ed:

f r i end voi d mai n ( ) ;
st at i c voi d cr eat e ( ) ;
st at i c voi d dest r oy ( ) ;

vi r t ual voi d r un ( ) ;

pr i vat e:

Thr eadCol l ect or ( ) {}
~Thr eadCol l ect or ( ) {}

Col l ect i on r ep;

st at i c Thr eadCol l ect or * i nst ance;

};

i nl i ne voi d Thr eadCol l ect or : : put ( Thr ead* t ) {
i f ( t ) r ep. append( t - >get CEFor Col l ect or ( ) ) ;
}

i nl i ne i nt Thr eadCol l ect or : : count ( ) {
r et ur n r ep. si ze( ) ;
}

#endi f
Datoteka t hr col . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Thr ead Col l ect or
/ / Fi l e: t hr col . cpp
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Thr ead Col l ect or r esponsi bl e f or t hr ead del et i on
/ / Cl ass: Thr eadCol l ect or

#i ncl ude " t hr col . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Thr eadCol l ect or
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

Thr eadCol l ect or * Thr eadCol l ect or : : i nst ance = 0;

Thr eadCol l ect or * Thr eadCol l ect or : : I nst ance ( ) {
i f ( i nst ance==0) cr eat e( ) ;
70
r et ur n i nst ance;
}

voi d Thr eadCol l ect or : : cr eat e ( ) {
i nst ance = new Thr eadCol l ect or ;
}

voi d Thr eadCol l ect or : : dest r oy ( ) {
del et e i nst ance;
}

voi d Thr eadCol l ect or : : r un ( ) {
whi l e ( 1) {
i nt i =0;
Col l ect i onI t er at or * i t = r ep. get I t er at or ( ) ;

f or ( i =0, i t - >r eset ( ) ; ! i t - >i sDone( ) ; i t - >next ( ) , i ++) {
Thr ead* cur = ( Thr ead*) i t - >cur r ent I t em( ) ;
i f ( cur - >i sOver ) {
r ep. r emove( i ) ;
del et e cur ;
i t - >r eset ( ) ; i =0;
di spat ch( ) ;
}
}

i f ( count ( ) ==1)
l ongj mp( mai nCont ext , 1) ; / / r et ur n t o mai n

di spat ch( ) ;
}
}
Datoteka t hr ead. h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Thr ead
/ / Fi l e: t hr ead. h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Thr eadi ng and cont ext swi t chi ng
/ / Cl ass: Thr ead

#i f ndef _THREAD_
#def i ne _THREAD_

#i ncl ude " kr nl . h"
#i ncl ude " r ecycl e. h"
#i ncl ude " semaphor . h"
#i ncl ude " t i mer . h"
#i ncl ude " pqueue. h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Thr ead
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Thr ead : publ i c Obj ect , publ i c Ti meabl e {
publ i c:

Thr ead ( Pr i or i t y=1) ;
Thr ead ( voi d ( *body) ( ) , Pr i or i t y=1) ;

voi d st ar t ( ) ;
st at i c voi d di spat ch ( ) ;

st at i c Thr ead* r unni ng ( ) ;
71

Pr i or i t yEl ement * get PEFor Schedul er ( ) ;
Col l ect i onEl ement * get CEFor Col l ect or ( ) ;
Col l ect i onEl ement * get CEFor Semaphor e ( ) ;

pr ot ect ed:

vi r t ual voi d r un ( ) ;

voi d mar kOver ( ) ;

vi r t ual voi d t i meout ( ) ;

Pr i or i t y get Pr i or i t y ( ) ;

f r i end cl ass Thr eadCol l ect or ;
vi r t ual ~Thr ead ( ) ;

f r i end cl ass Semaphor e;

i nl i ne i nt set Cont ext ( ) ;
voi d r esume ( ) ;
char * get St ackPoi nt er ( ) const ;

st at i c voi d wr apper ( ) ;
voi d f or k( ) ;

pr i vat e:

voi d ( *myBody) ( ) ;
char * mySt ack;

j mp_buf myCont ext ;

i nt i sBegi nni ng;
i nt i sOver ;
i nt i sTi mi ng;

Event t i meBl ocki ng;
Ti mer myTi mer ;

f r i end voi d mai n ( ) ;
f r i end voi d t i meSuspendRel at i ve( Ti me) ;
f r i end voi d t i meSuspendAbsol ut e( Ti me) ;

st at i c Thr ead* r unni ngThr ead;

Pr i or i t yEl ement peFor Schedul er ;
Col l ect i onEl ement ceFor Col l ect or ;
Col l ect i onEl ement ceFor Semaphor e;

RECYCLE_DEC( Thr ead)

};

/ / WARNI NG: Thi s f unct i on MUST be t r uel y i nl i ne!
i nl i ne i nt Thr ead: : set Cont ext ( ) {
r et ur n set j mp( myCont ext ) ;
}

i nl i ne voi d Thr ead: : mar kOver ( ) {
i sOver =1;
}

i nl i ne voi d Thr ead: : r un ( ) {
i f ( myBody! =0) myBody( ) ;
}

72
i nl i ne Thr ead* Thr ead: : r unni ng ( ) {
r et ur n r unni ngThr ead;
}

i nl i ne Thr ead: : ~Thr ead ( ) {
del et e [ ] mySt ack;
}

i nl i ne Pr i or i t yEl ement * Thr ead: : get PEFor Schedul er ( ) {
r et ur n &peFor Schedul er ;
}

i nl i ne Col l ect i onEl ement * Thr ead: : get CEFor Col l ect or ( ) {
r et ur n &ceFor Col l ect or ;
}

i nl i ne Col l ect i onEl ement * Thr ead: : get CEFor Semaphor e ( ) {
r et ur n &ceFor Semaphor e;
}

i nl i ne voi d Thr ead: : t i meout ( ) {
t i meBl ocki ng. si gnal ( ) ;
}

i nl i ne Pr i or i t y Thr ead: : get Pr i or i t y( ) {
r et ur n peFor Schedul er . get Pr i or i t y( ) ;
}

#endi f
Datoteka t hr ead. cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Thr ead
/ / Fi l e: t hr ead. cpp
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Thr eadi ng and cont ext swi t chi ng
/ / Cl ass: Thr ead

#i ncl ude <dos. h>
#i ncl ude " t hr ead. h"
#i ncl ude " t hr col . h"
#i ncl ude " schedul . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Thr ead
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

const i nt St ackSi ze = 4096;

RECYCLE_DEF( Thr ead) ;

Thr ead: : Thr ead ( Pr i or i t y p)
: RECYCLE_CON( Thr ead) , myBody( 0) , mySt ack( new char [ St ackSi ze] ) ,
i sBegi nni ng( 1) , i sOver ( 0) , i sTi mi ng( 1) ,
peFor Schedul er ( t hi s) , ceFor Col l ect or ( t hi s) , ceFor Semaphor e( t hi s) {
peFor Schedul er . set Pr i or i t y( p) ;
}


Thr ead: : Thr ead ( voi d ( *body) ( ) , Pr i or i t y p)
: RECYCLE_CON( Thr ead) , myBody( body) , mySt ack( new char [ St ackSi ze] ) ,
i sBegi nni ng( 1) , i sOver ( 0) , i sTi mi ng( 1) ,
peFor Schedul er ( t hi s) , ceFor Col l ect or ( t hi s) , ceFor Semaphor e( t hi s) {
peFor Schedul er . set Pr i or i t y( p) ;
73
}

voi d Thr ead: : r esume ( ) {
i f ( i sBegi nni ng) {
i sBegi nni ng=0;
wr apper ( ) ;
} el se
l ongj mp( myCont ext , 1) ;
}

Thr ead* Thr ead: : r unni ngThr ead = 0;

voi d Thr ead: : st ar t ( ) {
Thr eadCol l ect or : : I nst ance( ) - >put ( t hi s) ;
f or k( ) ;
}

voi d Thr ead: : di spat ch ( ) {
l ock ( ) ;
i f ( r unni ngThr ead && r unni ngThr ead- >set Cont ext ( ) ==0) {

Schedul er : : I nst ance( ) - >put ( r unni ngThr ead) ;
r unni ngThr ead = ( Thr ead*) Schedul er : : I nst ance( ) - >get ( ) ;
/ / Cont ext swi t ch:
r unni ngThr ead- >r esume( ) ;

} el se {
unl ock ( ) ;
r et ur n;
}
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / War ni ng: Har dwar e/ OS Dependent !
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

char * Thr ead: : get St ackPoi nt er ( ) const {
/ / WARNI NG: Har dwar e\ OS dependent !
/ / PC St ack gr ows downwar ds:
r et ur n mySt ack+St ackSi ze- 10;
}

/ / Bor l and C++: Compact , Lar ge, or Huge memor y Model needed!
#i f def i ned( __TI NY__) | | def i ned( __SMALL__) | | def i ned( __MEDI UM__)
#er r or Compact , Lar ge, or Huge memor y model needed
#endi f

#def i ne spl i t St ack( p) \
st at i c unsi gned i nt sss, ssp; \
sss=FP_SEG( p) ; ssp=FP_OFF( p) ; \
asm{ \
mov ss, sss; \
mov sp, ssp; \
mov bp, sp; \
add bp, 8 \
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / Enf of Dependenci es
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

voi d Thr ead: : f or k ( ) {
l ock( ) ;
Schedul er : : I nst ance( ) - >put ( t hi s) ;
unl ock( ) ;
}

voi d Thr ead: : wr apper ( ) {
74
voi d* p=r unni ngThr ead- >get St ackPoi nt er ( ) ;
spl i t St ack( p) ;

unl ock ( ) ;
r unni ngThr ead- >r un( ) ;
l ock ( ) ;

r unni ngThr ead- >mar kOver ( ) ;
r unni ngThr ead=( Thr ead*) Schedul er : : I nst ance( ) - >get ( ) ;
r unni ngThr ead- >r esume( ) ;
}
Datoteka t i mer . h
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Ti mer
/ / Fi l e: t i mer . h
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Ti mer s
/ / Type: Ti me
/ / Cl ass: Ti mer
/ / I nt er f ace: Ti meabl e

#i f ndef _TI MER_
#def i ne _TI MER_

#i ncl ude " col l ect . h"
#i ncl ude " semaphor . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / t ype Ti me
/ / const ant maxTi meI nt er val
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

t ypedef unsi gned l ong i nt Ti me;
const Ti me maxTi meI nt er val = ~0;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / i nt er f ace Ti meabl e
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Ti meabl e {
publ i c:
vi r t ual voi d t i meout ( ) = 0;
};

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Ti mer
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Ti mer Thr ead;
cl ass Semaphor e;

cl ass Ti mer : publ i c Obj ect {
publ i c:

Ti mer ( Ti me per i od = maxTi meI nt er val , Ti meabl e* t oNot i f y=0) ;
~Ti mer ( ) ;


voi d st ar t ( Ti me per i od = maxTi meI nt er val ) { r est ar t ( per i od) ; }
Ti me st op ( ) ;
voi d r est ar t ( Ti me = 0) ;

voi d set MyTi meabl e( Ti meabl e*) ;
75

Ti me el apsed ( ) { r et ur n i ni t i al - count er ; }
Ti me r emai ned( ) { r et ur n count er ; }

pr ot ect ed:

f r i end cl ass Ti mer Cont r ol l er ;
Col l ect i onEl ement * get CEFor Cont r ol l er ( ) { r et ur n &ceFor Cont r ol l er ; }
voi d t i ck ( ) ;

pr i vat e:

Ti meabl e* myTi meabl e;
Ti mer Thr ead* myThr ead;

Ti me count er ;
Ti me i ni t i al ;

i nt i sRunni ng;

Semaphor e mut ex;
Col l ect i onEl ement ceFor Cont r ol l er ;

RECYCLE_DEC( Ti mer )

};

#endi f
Datoteka t i mer . cpp
/ / Pr oj ect : Real - Ti me Pr ogr ammi ng
/ / Subj ect : Mul t i t hr eaded Ker nel
/ / Modul e: Ti mer
/ / Fi l e: t i mer . cpp
/ / Cr eat ed: November 1996
/ / Revi sed: Apr i l 2006 by I van I vanov
/ / Aut hor : Dr agan Mi l i cev
/ / Cont ent s: Ti mer s
/ / Cl asses: Ti mer
/ / Ti mer Thr ead
/ / Ti mer Cont r ol l er
/ / Ti mer I nt er r upt

#i ncl ude <dos. h>
#i ncl ude " t i mer . h"
#i ncl ude " i nt er pt . h"

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Ti mer Thr ead
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Ti mer Thr ead : publ i c Thr ead {
publ i c:

Ti mer Thr ead ( Ti meabl e*) ;

voi d si gnal ( ) ;
voi d dest r oy ( ) ;

pr ot ect ed:

vi r t ual voi d r un ( ) ;

pr i vat e:

Event ev;
Ti meabl e* myTi meabl e;
76
i nt i sOver ;

RECYCLE_DEC( Ti mer Thr ead)
};

RECYCLE_DEF( Ti mer Thr ead) ;

Ti mer Thr ead: : Ti mer Thr ead ( Ti meabl e* t ) : myTi meabl e( t ) , i sOver ( 0) ,
RECYCLE_CON( Ti mer Thr ead) { }

voi d Ti mer Thr ead: : si gnal ( ) {
ev. si gnal ( ) ;
}

voi d Ti mer Thr ead: : dest r oy ( ) {
i sOver =1;
ev. si gnal ( ) ;
}

voi d Ti mer Thr ead: : r un ( ) {
whi l e ( 1) {
ev. wai t ( ) ;
i f ( i sOver )
r et ur n;
el se
i f ( myTi meabl e) {
myTi meabl e- >t i meout ( ) ;
};
}
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Ti mer Cont r ol l er
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

cl ass Ti mer Cont r ol l er {
publ i c:

st at i c Ti mer Cont r ol l er * I nst ance( ) ;

voi d t i ck ( ) ;

voi d si gn ( Ti mer *) ;
voi d unsi gn ( Ti mer *) ;

pr i vat e:

Ti mer Cont r ol l er ( ) {}

Col l ect i on r ep;
Semaphor e mut ex;

};

Ti mer Cont r ol l er * Ti mer Cont r ol l er : : I nst ance ( ) {
st at i c Ti mer Cont r ol l er i nst ance;
r et ur n &i nst ance;
}

voi d Ti mer Cont r ol l er : : t i ck ( ) {
Mut ex dummy( &mut ex) ;
Col l ect i onI t er at or * i t = r ep. get I t er at or ( ) ;
f or ( i t - >r eset ( ) ; ! i t - >i sDone( ) ; i t - >next ( ) )
( ( Ti mer *) i t - >cur r ent I t em( ) ) - >t i ck( ) ;
}

voi d Ti mer Cont r ol l er : : si gn ( Ti mer * t ) {
Mut ex dummy( &mut ex) ;
77
i f ( t ) r ep. append( t - >get CEFor Cont r ol l er ( ) ) ;
}

voi d Ti mer Cont r ol l er : : unsi gn ( Ti mer * t ) {
Mut ex dummy( &mut ex) ;
i f ( t ) r ep. r emove( t - >get CEFor Cont r ol l er ( ) ) ;
}

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Ti mer I nt er r upt
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

const i nt Ti mer I nt No = 0X1C;
voi d i nt er r upt ( *ol dHandl er Ti mer ) ( . . . ) = get vect ( Ti mer I nt No) ;

cl ass Ti mer I nt er r upt : publ i c I nt er r upt Handl er {
pr ot ect ed:

Ti mer I nt er r upt ( ) : I nt er r upt Handl er ( Ti mer I nt No, t i mer I nt er r upt ) {}
~Ti mer I nt er r upt ( ) { set vect ( Ti mer I nt No, ol dHandl er Ti mer ) ; }

st at i c voi d i nt er r upt t i mer I nt er r upt ( . . . ) {
i nst ance- >i nt er r upt Handl er ( ) ;
ol dHandl er Ti mer ( ) ;
}
vi r t ual i nt handl e ( ) { Ti mer Cont r ol l er : : I nst ance( ) - >t i ck( ) ; r et ur n 1; }

pr i vat e:

st at i c Ti mer I nt er r upt * i nst ance;

};

Ti mer I nt er r upt * Ti mer I nt er r upt : : i nst ance = new Ti mer I nt er r upt ;

/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / cl ass Ti mer
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

RECYCLE_DEF( Ti mer ) ;

Ti mer : : Ti mer ( Ti me t , Ti meabl e* t mbl ) : RECYCLE_CON( Ti mer ) , myTi meabl e( t mbl ) ,
myThr ead( 0) , count er ( t ) , i ni t i al ( t ) , i sRunni ng( 0) ,
mut ex( 1) , ceFor Cont r ol l er ( t hi s) {
i f ( myTi meabl e! =0) {
myThr ead=new Ti mer Thr ead( myTi meabl e) ;
myThr ead- >st ar t ( ) ;
}
Ti mer Cont r ol l er : : I nst ance( ) - >si gn( t hi s) ;
}

Ti mer : : ~Ti mer ( ) {
mut ex. wai t ( ) ;
Ti mer Cont r ol l er : : I nst ance( ) - >unsi gn( t hi s) ;
i f ( myThr ead! =0) myThr ead- >dest r oy( ) ;
}

Ti me Ti mer : : st op ( ) {
Mut ex dummy( &mut ex) ;
i sRunni ng=0;
r et ur n i ni t i al - count er ;
}

voi d Ti mer : : r est ar t ( Ti me t ) {
Mut ex dummy( &mut ex) ;
i f ( t ! =0)
count er =i ni t i al =t ;
el se
78
count er =i ni t i al ;
i sRunni ng=1;
}

voi d Ti mer : : t i ck ( ) {
Mut ex dummy( &mut ex) ;
i f ( ! i sRunni ng) r et ur n;
i f ( - - count er ==0) {
i sRunni ng=0;
i f ( myThr ead! =0) myThr ead- >si gnal ( ) ;
}
}

voi d Ti mer : : set MyTi meabl e( Ti meabl e* t i meabl e) {
myTi meabl e = t i meabl e;
myThr ead = new Ti mer Thr ead( myTi meabl e) ;
myThr ead- >st ar t ( ) ;
}


79
6 LITERATURA
[1] Miliev, D., Programiranje u realnom vremenu Skripta, Beograd, 2002.
http://afrodita.rcub.bg.ac.yu/~dmilicev/teaching/prv/skripta.zip
http://afrodita.rcub.bg.ac.yu/~dmilicev/teaching/prv/kernel.zip
[2] Miliev, D., Programiranje u realnom vremenu Reenja zadataka iz skripti, Beograd,
2002.

80

You might also like