PRV Zadaci - Programiranje u Realnom Vremenu
PRV Zadaci - Programiranje u Realnom Vremenu
PRV Zadaci - Programiranje u Realnom Vremenu
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Konkurentno programiranje<br />
1. Zaštideni objekti na jeziku Ada<br />
Potrebno je projektovati sistem za kontrolu saobraćaja u nekom jednosmernom tunelu. U cilju<br />
bezbednosti, u tunelu se ne sme nalaziti više od približno N vozila u datom trenutku. Semafor na ulazu<br />
u tunel kontroliše priliv vozila, dok detektori vozila na ulazu i izlazu iz tunela prate tok vozila. Potrebno<br />
je napisati dva procesa i monitor kojima se kontroliše tok saobraćaja u tunelu. Prvi proces nadzire<br />
ulazni, a drugi izlazni detektor saobraćaja. Monitor kontroliše semafor na ulazu u tunel. Pretpostavlja se<br />
da su realizovane sledeće globalne funkcije:<br />
int carsExited (); // Vraća broj vozila koja su napustila tunel<br />
// od trenutka poslednjeg poziva ove funkcije<br />
int carsEntered (); // Vraća broj vozila koja su ušla u tunel<br />
// od trenutka poslednjeg poziva ove funkcije<br />
void setLights (Color); // Postavlja svetlo semafora na zadatu boju:<br />
// enum Color {Red, Green};<br />
void delay10Seconds (); // Blokira pozivajući proces na 10 sekundi<br />
Program treba da očitava senzore (preko funkcija carsExited() i carsEntered()) svakih 10 sekundi,<br />
sve dok tunel ne postane prazan ili pun. Kada tunel postane pun (i na semaforu se upali crveno svetlo),<br />
proces koji nadgleda ulaz u tunel ne treba više kontinualno da poziva funkciju carsEntered(). Slično,<br />
kada tunel postane prazan, proces koji nadgleda izlaz iz tunela ne treba više kontinualno da poziva<br />
funkciju carsExited(). Prikazati rešenje korišćenjem zaštićenih objekata u jeziku Ada.<br />
Rešenje:<br />
N : constant Integer := ...;<br />
protected type Tunel is<br />
entry carsIn();<br />
entry carsOut();<br />
private<br />
current : Integer := 0;<br />
end Tunel;<br />
protected body Tunel is<br />
entry carsIn when current < N is<br />
begin<br />
current := current + carsEntered();<br />
if current >= N then<br />
setLights(Red);<br />
end if<br />
end carsIn<br />
38