Alcune domande sull'implementazione di uno scheduler di prelazione in C: Cambio di contesto e tempo di esecuzione del dispatcher

2

Sto cercando di implementare uno scheduler di prelazione in C, ma ho alcuni problemi di comprensione:

Quando lo scheduler viene chiamato da un interrupt, può verificarsi un cambio di contesto. L'interruttore di contesto può essere programmato solo nell'assembler. Nel mio programma C un compito è una funzione. Se lo scheduler viene chiamato da un interrupt e si verifica un interruttore di contesto, non riesco ad avviare una nuova attività nell'interrupt. Nell'interrupt memorizzo il contesto dell'attività corrente (non ne sono sicuro). Ma dopo l'interruzione il programma tornerà alla funzione. Allora, dove posso iniziare una nuova attività? Dovrei tornare al loop principale in assembler dopo aver salvato il contesto?

    
posta MajinFoo 22.01.2018 - 13:03
fonte

1 risposta

4

Un programma di pianificazione preventiva non può essere scritto interamente in C. La logica necessaria per passare da un'attività all'altra deve essere scritta nel codice assembly, poiché è necessario un accesso di basso livello ai registri del processore.

Il modo in cui un programma di pianificazione preventiva normalmente funziona è il seguente:

  • Usando un interrupt del timer, il codice dello schedulatore viene chiamato ogni X microsecondi
  • Quando chiamato
    • lo scheduler controlla quale attività ha la priorità più alta per eseguire
    • se è l'attività attualmente in esecuzione, quindi lo scheduler restituisce
    • in caso contrario, al codice di commutazione attività viene richiesto di modificare i registri del processore in modo tale che il processore continui con la nuova attività dopo che l'interrupt ha restituito
    • lo scheduler ricorda quale attività è attualmente in esecuzione
    • lo scheduler ritorna dall'interrupt
risposta data 22.01.2018 - 13:29
fonte

Leggi altre domande sui tag