Esame di Sistemi in Tempo Reale, Corso di Laurea Specialistica in Ingegneria dell'Automazione
Compito scritto (24 novembre 2008)
Esercizio 1
Un sistema di controllo del sistema di inizione di un motore funziona nella seguente maniera. Un task Task1 viene attivato da un interrupt esterno che scatta una volta ogni mezzo giro dell'albero motore. La struttura del task Task1 è la seguente:
void *Task1(void *arg) {
...
while (1) {
sem_wait(&s);
<body>
} }
Dove il semaforo s viene usato anche dall'interrupt esterno per svegliare Task1.
Poiché l'albero motore può girare a varie velocità, l'intervallo fra due attivazioni successive di Task1 è variabile, sia esso T1(k). Assumiamo che T1(k) possa variare tra un minimo di 500 RPM e un massimo di 6000 RPM. Nel sistema girano anche altri 2 task, Task2 e Task3, periodici, di periodo rispettivamente T2(k) e T3(k).
1) Supponendo che il tempo di calcolo di Task1 sia di 5 millisecondi, e che il tempo di calcolo di Task2 e Task3 sia di 20 e 40 millisecondi, rispettivamente, trovare una formula che calcoli il valore di T2(k) e T3(k) in funzione del tempo di interarrivo T1(k), in modo che
a) T3 sia sempre il doppio di T2, b) che T2 sia sempre maggiore di T1
c) e che il sistema risulti schedulabile con ratemonotonic.
2) Supponiamo ora di dividere l'intervallo dei possibili valori di T1(k) in 2 parti, cioè valori minori di 3000 RPM e valori superiori. Scrivere il codice che
a) riconosce il valore attuale di T1(k)
b) se necessario, cambia opportunamente il periodo di T2(k) e T3(k) a seconda dell'intervallo di appartenenza
c) scrivere inoltre parte del codice di Task2 e Task3 che realizza il cambio di periodo.