Domanda

Abbiamo due attività (T1 e T2) nel nostro sistema embedded vxWorks che hanno la stessa priorità (110).
Come si comporta il normale scheduler di vxWorks se entrambe le attività sono pronte per essere eseguite?
Quale attività viene eseguita per prima?

È stato utile?

Soluzione

L'attività che verrà eseguita per prima è l'attività che viene generata per prima come realizzato dall'attività di pianificazione VxWorks.VxWorks utilizza pianificazione basata sulle priorità per impostazione predefinita.Quindi nel tuo caso, poiché T1 e T2 hanno la stessa priorità, quello che ottiene per primo la CPU continuerà a funzionare indefinitamente fino a quando non verrà esplicitamente bloccato (usando taskSuspend O taskDelay), a quel punto l'altra attività READY verrà eseguita finché non verrà bloccata e così via.Questo dovrebbe essere controllato da semafori o mutex (mutices?)

Il problema principale con la pianificazione basata sulle priorità è evidenziato proprio da questo problema.Come determiniamo per quanto tempo eseguire queste attività?Il fatto che abbiano la stessa priorità complica le cose.Un'altra preoccupazione è che le attività VxWorks che hanno una priorità elevata (un numero più basso significa una priorità più alta) possono anticipare l'applicazione per la quale è necessario essere preparati nel codice.Questi problemi possono essere risolti utilizzando pianificazione del girone.Vengono descritti gli ulteriori problemi posti dalla pianificazione round-robin e le relative soluzioni Qui.

Altri suggerimenti

VxWorks ha 256 livelli di priorità (0 è il massimo, 255 il minimo).In qualsiasi momento, sulla CPU viene eseguita l'attività con la priorità più alta.Ogni livello di priorità ha concettualmente una coda in cui più attività si mettono in coda per l'esecuzione.

Abbiamo 3 attività con la stessa priorità A, B, C.Supponiamo che A stia eseguendo.
Quando A blocca (taskDelay, SemTake, msgQReceive), B inizierà l'esecuzione.
Quando A si sblocca viene messo alla fine della coda.Ora abbiamo B, C, A.
Quando B blocca, C prende il sopravvento, ecc...

Se la pianificazione Round Robin (Time Slicing) è abilitata, si applica lo stesso concetto, ma l'attività viene inserita alla fine della coda quando il suo intervallo di tempo è terminato.

Tieni presente che un'attività anticipata da un'attività con priorità più elevata NON influirà sull'ordine della coda.Se A era in esecuzione e viene interrotto, continuerà l'esecuzione una volta completata l'attività con priorità più alta.Non viene messo alla fine della coda.

Per impostazione predefinita, quello generato per primo verrà eseguito e, a meno che non rinunci alla CPU, l'altro non verrà mai eseguito.

Puoi abilitare esplicitamente il round robin, in modo che suddividano i tempi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top