LAB1. Upravljačka petlja


Mnogi sustavi za rad u stvarnom vremenu svoje upravljanje ostvaruju jednostavnom petljom u kojoj provjeravaju sve komponente sustava. Zadatak ove vježbe je napraviti simulaciju takva sustava, ali korištenjem operacijska sustava opće namjene. Zbog simulacije koriste se milisekunde i sekunde za trajanje obrade i duljine periode. U stvarnim sustavima bi bile manje jedinice (mikrosekunde). Problem s manjim vremenima jest u rezoluciji sata OS-a. Npr. nanosleep u Linuxu radi u rezoluciji 1 ms.

Osnovna skica upravljača kojeg se simulira je prikazana kodom:

ponavljaj {
	za svaki ulaz-i {
		provjeri treba li nešto napraviti i ako da napravi to
	}
}

Upravljač simulirati jednom dretvom te svaki ulaz simulirati zasebnom dretvom koja mijenja stanje ulaza i čeka na odgovor upravljačke dretve.

Tablica 1. Skica simulatora
upravljačka dretva stanje-1dretva za simulaciju rada ulaza-1
stanje-2dretva za simulaciju rada ulaza-2
......
stanje-Ndretva za simulaciju rada ulaza-N

Za svaki ulaz treba definirati:

  1. za simulator ulaza:
    • trenutak t0 prve pojave događaja na ovom ulazu (relativno u odnosu na pokretanje simulacije ulaza)
    • periodu T u kojoj se promjena događa
  2. za upravljača:
    • trajanje obrade C.

U simulaciji treba pratiti statistiku vremena potrebnog od promjene stanja do započinjanja obrade, ali samo za obrade koje su dovršene do kraja periode. Obrade koje su završile prekasno dodati u statistiku neobrađenih promjena ulaza.


Skica rješenja

Pseudokod dretvi

dretva upravljač
{
	dok nije označen kraj simulacije {
		za i=0 do br_ulaza-1 {
			ako je promjena na ulazu "i" {
				zabilježi trenutak reakcije
				simuliraj obradu ulaza "i" (sleep)
				označi da je obrada gotova
			}
		}
	}
}

dretva simulator_ulaza (i)
{
	ako je ovaj ulaz popuna //samo za LAB2
		završi ovu dretvu

	t = t0 //trenutak prve pojave

	dok nije označen kraj simulacije {
		odgodi_do(t)
		promijeni stanje na ulazu
		zabilježi trenutak promjene stanja

		//čekaj promjenu ili istek periode
		dok obrada nije gotova I t + T > dohvati_sat()
			spavaj(10 ms)

		ako je obrada gotova {
			ažuriraj statistiku vremenom reakcije
		}
		inače {
			ažuriraj statistiku "bez odgovora"
		}
		t += T
	}
	//na kraju
	ispiši statistiku
}

Primjer statički zadanih ulaza

Slijedeći primjer je uzet iz skripte, iz primjera 4.21. Sva su vremena pomnožena s 1000 (1ms => 1s). Trajanje obrade je zadano, ali nije ispitana rasporedivost.
ulaz[] = { //{.T, .t0, .C, .x} x=1 stvarni ulaz, x=0 popuna (LAB2)
//ovaj redak svake sekunde
{ 1000, 0, 30, 1}, {1000, 400, 30, 1}, {1000, 700, 30, 1}, //a1-a3

//samo jedan od ovih pet redaka svake sekunde
{ 5000,  100, 50, 1}, {5000,  500, 50, 1}, {5000,  800, 50, 1}, //b1-b3
{ 5000, 1100, 50, 1}, {5000, 1500, 50, 1}, {5000, 1800, 50, 1}, //b4-b6
{ 5000, 2100, 50, 1}, {5000, 2500, 50, 1}, {5000, 2800, 50, 1}, //b7-b9
{ 5000, 3100, 50, 1}, {5000, 3500, 50, 1}, {5000, 3800, 50, 1}, //b9-b12
{ 5000, 4100, 50, 1}, {5000, 4500, 50, 1}, {5000, 4800, 50, 1}, //b13-b15

//samo jedan od ovih 20 redaka svake sekunde
{20000,   900,  50, 1},  //c1
{20000,  1900, 150, 1},  //c2
{20000,  2900,  50, 1},  //c3
{20000,  3900, 150, 1},  //c4
{20000,  4900,  50, 1},  //c5
{20000,  5900, 150, 1},  //c6
{20000,  6900,  50, 1},  //c7
{20000,  7900, 150, 1},  //c8
{20000,  8900,  50, 1},  //c9
{20000,  9900, 150, 1},  //c10
{20000, 10900,  50, 1},  //c11
{20000, 11900, 150, 1},  //c12
{20000, 12900,  50, 1},  //c13
{20000, 13900, 150, 1},  //c14
{20000, 14900,  50, 1},  //c15
{20000, 15900, 150, 1},  //c16
{20000, 16900,  50, 1},  //c17
{20000, 17900, 150, 0},  //c18-samo popunjavanje tablice
{20000, 18900, 150, 0},  //c19-samo popunjavanje tablice
{20000, 19900, 150, 0}   //c20-samo popunjavanje tablice
}
Trajanja obrada (.C) prilagoditi tako da ne bude previše problema s odgovorima, ali opet da ih bude po nekoliko (da se vidi gdje je granica).

Kraj simulacije zadati statički, npr. nekoliko najduljih perioda i/ili na signal (npr. na Ctrl+C postaviti oznaku kraja na koju će sve dretve završiti).

Na kraju simulacije ispisati statistiku (po zadacima te zajedničku). Npr.:

Simulacija prekinuta na signal SIGINT

U intervalu [0-37.012] statistika po ulazima:

Ulaz-1: broj promjena stanja: 38
Ulaz-1: prosječno vrijeme reakcije na promjenu stanja: 5 ms
Ulaz-1: maksimalno vrijeme reakcije na promjenu stanja: 150 ms
Ulaz-1: broj neobrađenih događaja: 0
...
Ulaz-11: broj promjena stanja: 7
Ulaz-11: prosječno vrijeme reakcije na promjenu stanja: 15 ms
Ulaz-11: maksimalno vrijeme reakcije na promjenu stanja: 250 ms
Ulaz-11: broj neobrađenih događaja: 1
...

Zajednička statistika:

Broj promjena stanja: 341
Prosječno vrijeme reakcije na promjenu stanja: 15 ms
Maksimalno vrijeme reakcije na promjenu stanja: 450 ms
Broj neobrađenih događaja: 8

Tijekom rada također se može ispisivati događaje, npr.:

t	događaj
----------------
0	Ulaz-1: promjena ulaza
1	Upr: započinjem obradu ulaza-1
31	Upr: gotova obrada ulaza-1
40	Ulaz-1: gotova obrada: reakcija: 1 ms
100	Ulaz-4: promjena ulaza
101	Upr: započinjem obradu ulaza-4
151	Upr: gotova obrada ulaza-4
160	Ulaz-4: gotova obrada: reakcija: 1 ms
...