2010-06-08 14 views
9

Vorrei sapere come viene richiamato lo scheduler in modo che possa cambiare attività. Come nel caso della pianificazione preventiva o della programmazione round robin, lo schedulatore dovrebbe entrare in figura per eseguire qualsiasi tipo di cambio di attività. Supponendo che un'attività a bassa priorità abbia un ciclo infinito, quando interviene lo scheduler e passa a un'attività con priorità più alta?Come viene eseguito uno scheduler VxWorks?

Richiesta: 1. Chi chiama lo scheduler? [in VxWorks] 2. Se viene chiamato a intervalli regolari, come viene implementato tale meccanismo?

Grazie in anticipo.

--Ashwin

+0

Mentre non conosco VxWorks, in altri sistemi operativi lo scheduler viene in genere chiamato da un interrupt del timer, in modo che possa passare alle attività anche se un'attività è attualmente occupata. – Rudi

risposta

12

La risposta semplice è che vxWorks prende il controllo tramite un interrupt hardware dal timer di sistema che si verifica continuamente a intervalli fissi mentre il sistema è in esecuzione.

Ecco più in dettaglio:

Quando VxWorks si avvia, configura l'hardware per generare un timer interrupt ogni n millisecondi, dove n è spesso 10 ma del tutto dipende dal vostro hardware. L'intervallo del timer viene generalmente impostato da vxWorks nel proprio Board Support Package (BSP) all'avvio.

Ogni volta che il timer scatta un interrupt, il sistema inizia a eseguire il timer interrupt handler. Il gestore di interrupt del timer è parte di vxWorks, quindi ora vxWorks ha il controllo. La prima cosa che fa è salvare lo stato della CPU (come i registri) nello Task Control Block (TCB) dell'attività attualmente in esecuzione.

Quindi alla fine vxWorks esegue lo scheduler per determinare chi verrà eseguito successivamente. Per eseguire un'attività, vxWorks copia lo stato dell'attività dal suo TCB nei registri della macchina, e dopo di ciò l'attività ha il controllo della CPU.

informazioni Bonus:

VxWorks fornisce hooks nel compito di commutazione logica in modo da poter avere una funzione get chiamato ogni volta che il compito viene preempted.

+0

Grazie per la risposta dettagliata ... – Ashwin

+0

Si noti che questo è vero solo se si abilita la pianificazione round robin (chiamando kernelTimeSlice()), l'impostazione predefinita è la pianificazione preventiva basata su priorità. – nos

+0

@nos: l'interruzione del timer è sempre in esecuzione per tenere traccia del conteggio delle zecche, dei timer del watchdog e dei timeout del semaforo indipendentemente dalla politica di pianificazione. Accade semplicemente che per la pianificazione preventiva basata su priorità, lo scheduler vxWorks non scelga una nuova attività da eseguire a meno che alcune operazioni con il timer spostassero un'attività prioritaria più elevata nella coda pronta. Ma giusto punto. Ho sempre voluto aggiornare questa risposta per essere più precisa e includere le chiamate di sistema, che ho completamente dimenticato di menzionare al momento. – indiv

0

A meno che non si dispone di un accumulo di destinazione majorily-personalizzato, lo scheduler viene richiamato dal interrupt timer. I dettagli sono specifici della piattaforma, però.

0

Anche lo scheduler viene richiamato se l'attività corrente viene completata o bloccata.

5

indiv fornisce un'ottima risposta, ma è solo parzialmente accurata.
Il funzionamento effettivo del sistema è leggermente più complesso.

Lo scheduler può essere eseguito come risultato di operazioni sincrone o asincrone.

Synchronous fa riferimento alle operazioni causate dal codice nell'attività attualmente in esecuzione. Un primo esempio di questo sarebbe prendere un semaforo (semTake).
Se il semaforo non è disponibile, l'attività attualmente in esecuzione verrà sospesa e non sarà più disponibile per l'esecuzione. A questo punto, lo scheduler verrà richiamato e determinerà l'attività successiva che dovrebbe essere eseguita ed eseguirà un cambio di contesto.

Le operazioni asincrone si riferiscono essenzialmente agli interrupt.Gli interrupt del timer sono stati descritti molto bene da indiv. Tuttavia, un certo numero di elementi diversi potrebbe causare un interrupt da eseguire: traffico di rete, sensore, dati seriali, ecc ...

È anche opportuno ricordare che l'interruzione del timer non causa necessariamente un interruttore di contesto! Sì, l'interruzione si verificherà e l'attività ritardata e i contatori di intervalli di tempo verranno decrementati. Tuttavia, se la sezione temporale non è scaduta o non c'è più alta transizioni di attività prioritarie dallo stato sospeso allo stato pronto, quindi lo scheduler non verrà effettivamente richiamato e si tornerà all'attività originale, nel punto esatto in cui l'esecuzione è stata interrotta.

Si noti che lo scheduler non ha il proprio contesto; non è un compito. È semplicemente un codice che viene eseguito in qualunque contesto venga invocato. O dal contesto di interrupt (asincrono) o dal contesto dell'attività di richiamo (sincrono).

Problemi correlati