SCALETTA LEZIONE SERT E12 -- 20 dicembre 2012 *** Scheduler non interrompibile 1 Esame dello scheduler non interrombile 1.1 Ruolo della funzione schedule() 1.1.1 Attivata periodicamente 1.1.2 Rileva i rilasci dei job e aggiorna i task (campo f->released) 1.2 Ruolo della funzione run_periodic_tasks() 1.2.1 Cerca il task di priorita' piu' alta con job da eseguire 1.2.2 Esegue il job prescelto 1.2.3 Ripete all'infinito 1.3 Race condition: poiche' schedule() e' asincrona rispetto a run_periodic_tasks(), le modifiche ai campi released dei task possono avvenire in qualunque momento 1.3.1 In particolare run_periodic_tasks() potrebbe scegliere erroneamente un job di priorita' piu' bassa rispetto ad un altro se quest'ultimo viene rilasciato dopo che la funzione ha controllato il campo released nel ciclo for 1.3.2 La variabile globalreleases serve a mitigare questa race condition: run_periodic_tasks() esegue un job solo se dopo una intera scansione del vettore di task nessun nuovo job viene rilasciato 1.3.3 Esiste ancora una finestra temporale in cui e' possibile avere una race condition (tra il controllo che state == globalreleases e l'esecuzione del job), ma in questo caso e' piu' piccola ed i tempi di blocco aggiuntivi che comporta sono trascurabili rispetto ai tempi di esecuzione dei job *** Scheduler interrompibile 2 Problematiche dello scheduler interrompibile: 2.1 Un job deve poter essere interrotto durante la sua esecuzione e sostituito con un altro job 2.2 E' necessario implementare il cambio di contesto, ossia salvare tutte le informazioni sullo stato di avanzamento del job interrotto, e ripristinare le informazioni sullo stato di avanzamento del job che va in esecuzione 2.3 Si deve gestire anche il caso particolare in cui un job viene rilasciato: e' necessario creare le informazioni relative al suo primo cambio di contesto 2.4 Si deve gestire anche il caso particolare in cui un job termina l'esecuzione: si deve sostituire il suo contesto con quello del miglior job eseguibile nel sistema 2.5 E' necessario prevedere che il cambio di contesto possa avvenire sia in modalita' IRQ (a seguito della gestione di una interruzione) che in modalita' SYSTEM (normale esecuzione del processore) 2.5.1 L'interruzione di un job e' un evento che avviene in seguito ad una interruzione di tick, che avvia lo scheduler periodico, che riconosce che un job a priorita' piu' alta e' stato rilasciato 2.5.2 La terminazione di un job e' un evento che avviene in modalita' SYSTEM, ossia quando il processore *non* sta eseguendo il gestore di una interruzione 2.6 Per avere la massima flessibilita' nel meccanismo di esecuzione dei job scegliamo di associare a ciascun task un proprio stack 2.6.1 Job dello stesso task non hanno bisogno di stack diversi poiche' job dello stesso task sono sempre eseguiti in modalita' FIFO 2.6.2 La procedura che effettua il cambio di contesto dovra' anche sostituire il puntatore contenuto nel registro sp 2.6.3 Rimane valido il principio che non esistono stack per la modalita' d'esecuzione IRQ: il processore utilizza sempre e solo gli stack dei task utilizzati per la modalita' SYSTEM (normale esecuzione) *** Analisi del gestore di interruzione di basso livello 3 E' necessario capire a fondo il funzionamento del gestore di interruzioni contenuto nel file irqhandler.S, perche' 3.1 Per eseguire una procedura asincrona come il gestore di una interruzione si deve comunque salvare il "contesto d'esecuzione" della procedura (generalmente, il job di un task) interrotta 3.2 Si dovra' modificare il gestore di interruzioni per consentire, al termine di una interruzione, il ripristino di un job diverso da quello "corrente" al momento in cui l'interruzione si e' verificata 4 Operazioni effettuate dalla funzione Assembly _irq_handler() 4.1 mov r13,r0 4.1.1 L'interruzione si e' appena verificata 4.1.2 La CPU e' in esecuzione in modalita' IRQ (i registri r13/sp, r14/lr e spsr sono differenti da quelli utilizzati in modalita' SYSTEM) 4.1.3 Le interruzioni sono automaticamente disabilitate 4.1.4 L'istruzione "salva" il contenuto di r0 in r13 4.2 sub r0,lr,#4 4.2.1 Il registro r14/lr del modo IRQ contiene il valore del PC al momento in cui l'interruzione e' stata rilevata 4.2.2 Sottrarre 4 da questo indirizzo ottiene l'indirizzo dell'istruzione seguente a quella appena finita prima dell'interruzione 4.2.3 L'indirizzo di ritorno dall'interruzione e' scritto in r0 4.3 mov lr,r1 4.3.1 "Salva" il valore del registro r1 nel registro r14/lr del modo IRQ 4.4 mrs r1,spsr 4.4.1 Il registro spsr del modo IRQ contiene il valore del registro cpsr (PSW) subito prima dell'interruzione 4.4.2 Questo valore e' copiato nel registro r1 4.5 msr cpsr_c,#(SYS_MODE|NO_IRQ) 4.5.1 Si modificano i bit del registro cpsr relativi al modo di esecuzione ed alla abilitazione degli IRQ/FIQ 4.5.2 Si forza la CPU nel modo di esecuzione SYSTEM (i registri r13 e r14 tornano ad avere il valore "normale") 4.5.3 Si continuano ad avere gli IRQ disabilitati 4.5.4 Le interruzioni veloci ad alta priorita' FIQ sono abilitate (ma in questo progetto non vengono usate) 4.6 stmfd sp!,{r0,r1} 4.6.1 L'istruzione effettua una operazione di "push" di un insieme di registri sullo stack 4.6.2 Poiche' e' eseguita in modalita' SYSTEM, lo stack e' quello "corrente" al momento dell'interruzione 4.6.3 Vengono salvati i valori che erano contenuti nei registri della modalita' IRQ spsr e pc 4.7 stmfd sp!,{r2-r3,r12,lr} 4.7.1 Vengono salvati sullo stack il contenuto dei registri r2, r3, r12 e r14/lr 4.7.2 Questi sono tra i registri definiti "AAPCS-clobbered" che *non* devono essere preservati in una invocazione di funzione C 4.7.3 Gli altri registri che *non* sono preservati in una invocazione di funzione C sono r0 ed r1 (correntemente salvati nei registri r13 e r14 della modalita' IRQ) 4.8 mov r0,sp 4.8.1 Gli altri registri che *non* sono preservati in una invocazione di funzione C sono r0 e r1 4.8.2 In questo momento il contenuto di questi registri e' stato salvato nei registri r13 e r14 della modalita' IRQ 4.8.3 E' necessario quindi fare la "push" di due registri della modalita' IRQ sullo stack della modalita' SYSTEM 4.8.4 L'istruzione copia quindi sp (che si modifica cambiando modalita') in r0 (che non si modifica cambiando modalita') 4.9 sub sp,sp,#(2*4) 4.9.1 Estende lo stack della modalita' SYSTEM di due posizioni 4.10 msr cpsr_c,#(IRQ_MODE|NO_IRQ) 4.10.1 Cambia la modalita' del processore ad IRQ 4.10.2 Ora il registro r13 contiene il valore originale di r0 4.10.3 Ora il registro r14 contiene il valore originale di r1 4.11 stmfd r0!,{r13,r14} 4.11.1 Salva sullo stack il contenuto dei due registri 4.11.2 Questa "push" completa il salvataggio dei registri "AAPCS-clobbered" che *non* devono essere preservati in una invocazione di una funzione C 4.11.2 Sara' il gestore di interruzioni ad alto livello, scritto in C, a salvare i registri r4-r11 sullo stack se dovra' utilizzarli, quindi _irq_handler() non li considera 4.12 msr cpsr_c,#(SYS_MODE|NO_IRQ) 4.12.1 Torna in modalita' SYSTEM 4.12.2 Interruzioni IRQ ancora disabilitate 4.13 ldr r12,=_bsp_irq 4.13.1 Carica nel registro r12 l'indirizzo della funzione C _bsp_irq() 4.13.2 Questa funzione e' il gestore dell'interruzione di "medio livello", comune a tutte le interruzioni 4.14 mov lr,pc 4.14.1 Carica l'indirizzo di ritorno da _bsp_irq() nel link register r14/lr 4.14.2 La CPU e' in modalita' SYSTEM, ma r13 e' tra i registri "salvati" sullo stack 4.15 bx r12 4.15.1 Salta alla funzione _bsp_irq() 4.15.2 La forma "x" dell'istruzione "branch" consente di saltare eventualmente anche a procedure in formato compatto "Thumb" 4.15.3 La funzione _bsp_irq() 4.15.3.1 attiva il meccanismo di priorita'... 4.15.3.2 ...leggendo l'indirizzo del gestore ad alto livello dell'interruzione 4.15.3.3 esegue il gestore ad alto livello della interruzione 4.15.3.4 disattiva il meccanismo di priorita' e termina 4.16 msr cpsr_c,#(SYS_MODE|NO_INT) 4.16.1 Questo e' il punto di ritorno da _bsp_irq() 4.16.2 Forza la modalita' SYSTEM sulla CPU 4.16.3 Disabilita sia gli IRQ che i FIQ 4.17 mov r0,sp 4.17.1 E' necessario ripristinare il contenuto dei registri originale compiendo le operazioni fatte all'inizio in ordine inverso 4.17.2 Copia il puntatore alla cima dello stack in r0 4.18 add sp,sp,#(8*4) 4.18.1 Aggiorna sp per togliere due elementi dallo stack 4.18.2 In realta' il contenuto dello stack non e' modificato 4.19 msr cpsr_c,#(IRQ_MODE|NO_INT) 4.19.1 Forza la CPU in modalita' IRQ 4.19.2 IRQ e FIQ sono ancora disabilitati 4.20 mov sp,r0 4.20.1 Copia il puntatore alla cima dello stack della modalita' SYSTEM nel registro sp (relativo alla modalita' IRQ) 4.21 ldr r0,[sp,#(7*4)] 4.21.1 Carica in r0 il valore che era stato salvato per il registro spsr 4.22 msr spsr_cxsf,r0 4.22.1 Ripristina il valore del registro spsr della modalita' IRQ 4.23 ldmfd sp,{r0-r3,r12,lr}^ 4.23.1 Compie l'operazione di "pop" per tutti i valori salvati sullo stack 4.23.2 Il simbolo "^" alla fine dell'istruzione significa, poiche' il registro pc non e' coinvolto nell'operazione, che il valore corrispondente a r13 verra' ripristinato nel registro r13 della modalita' SYSTEM invece che in quello della modalita' corrente (IRQ) 4.24 nop 4.24.1 In alcune versioni dell'architettura ARM non e' possibile accedere subito dopo l'operazione precedente ad un registro "privato" 4.24.2 Il modo piu' semplice per evitare problemi e' inserire quindi una istruzione che non fa nulla 4.25 ldr lr,[sp,#(6*4)] 4.25.1 Preleva dallo stack l'indirizzo di ritorno dal gestore delle interruzioni 4.25.2 Ripristina l'indirizzo di ritorno nel registro r14/lr della modalita' IRQ 4.26 movs pc,lr 4.26.1 Salta all'indirizzo di ritorno 4.26.2 La "s" finale significa che l'istruzione copiera' anche il contenuto di spsr in cpsr 4.26.3 Come conseguenza, la modalita' di esecuzione della CPU tornera' ad essere quella corrente all'occorrenza della interruzione 4.26.4 La gestione della interruzione e' effettivamente conclusa 5 La procedura in azione 5.1 Subito prima della interruzione, ultima istruz, eseguita a indirizzo P: +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ *SY| | | | | | | | | | | | | | N | O | | |////| | A | B | C | D | E | F | G | H | I | J | K | L | M |----|---|(P)| Q |----| IR| | | | | | | | | | | | | | ? | ? | | | ? | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ +---+---+---+ STK| X | Y | Z | +---+---+---+ N +4 +8 5.2 Subito dopo l'interruzione: +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ SY| | | | | | | | | | | | | | N | O | | |////| | A | B | C | D | E | F | G | H | I | J | K | L | M |----|---| * | * |----| *IR| | | | | | | | | | | | | | ? |P+8| | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| X | Y | Z | +---+---+---+ N +4 +8 5.3 Dopo l'esecuzione delle istruzioni: mov r13,r0 sub r0,lr,#4 mov lr,r1 mrs r1,spsr +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ SY| | | | | | | | | | | | | | N | O | | |////| |P+4| Q | C | D | E | F | G | H | I | J | K | L | M |----|---| * | * |----| *IR| | | | | | | | | | | | | | A | B | | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| X | Y | Z | +---+---+---+ N +4 +8 5.4 Dopo l'esecuzione delle istruzioni: msr cpsr_c,#(SYS_MODE|NO_IRQ) stmfd sp!,{r0,r1} stmfd sp!,{r2-r3,r12,lr} mov r0,sp sub sp,sp,#(2*4) +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ *SY| | | | | | | | | | | | | |N-32| O | | |////| | N-| Q | C | D | E | F | G | H | I | J | K | L | M |----|---| * | * |----| IR| 24| | | | | | | | | | | | | A | B | | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| ? | ? | C | D | M | O |P+4| Q | X | Y | Z | +---+---+---+---+---+---+---+---+---+---+---+ N-32 +4 +8 +12 +16 +20 +24 +28 +32 +36 +40 5.5 Dopo l'esecuzione delle istruzioni: msr cpsr_c,#(IRQ_MODE|NO_IRQ) stmfd r0!,{r13,r14} +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ SY| | | | | | | | | | | | | |N-32| O | | |////| | N-| Q | C | D | E | F | G | H | I | J | K | L | M |----|---| * | * |----| *IR| 32| | | | | | | | | | | | | A | B | | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| A | B | C | D | M | O |P+4| Q | X | Y | Z | +---+---+---+---+---+---+---+---+---+---+---+ N-32 +4 +8 +12 +16 +20 +24 +28 +32 +36 +40 5.6 Dopo l'esecuzione delle istruzioni: msr cpsr_c,#(SYS_MODE|NO_IRQ) ldr r12,=_bsp_irq mov lr,pc +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ *SY| | | | | | | | | | | | |bsp|N-32| * | | |////| | N-| Q | C | D | E | F | G | H | I | J | K | L |irq|----|---| * | * |----| IR| 32| | | | | | | | | | | | | A | B | | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| A | B | C | D | M | O |P+4| Q | X | Y | Z | +---+---+---+---+---+---+---+---+---+---+---+ N-32 +4 +8 +12 +16 +20 +24 +28 +32 +36 +40 5.7 Dopo l'esecuzione delle istruzioni: bx r12 msr cpsr_c,#(SYS_MODE|NO_INT) mov r0,sp add sp,sp,#(8*4) +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ *SY| | | | | | | | | | | | | | N | * | | |////| | N-| ? | ? | ? | E | F | G | H | I | J | K | L | ? |----|---| * | ? |----| IR| 32| | | | | | | | | | | | | ? | ? | | | ? | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| A | B | C | D | M | O |P+4| Q | X | Y | Z | +---+---+---+---+---+---+---+---+---+---+---+ -32 -28 -24 -20 -16 -12 -8 -4 N +4 +8 5.8 Dopo l'esecuzione delle istruzioni: msr cpsr_c,#(IRQ_MODE|NO_INT) mov sp,r0 ldr r0,[sp,#(7*4)] msr spsr_cxsf,r0 +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ SY| | | | | | | | | | | | | | N | * | | |////| | Q | ? | ? | ? | E | F | G | H | I | J | K | L | ? |----|---| * | ? |----| *IR| | | | | | | | | | | | | |N-32| ? | | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| A | B | C | D | M | O |P+4| Q | X | Y | Z | +---+---+---+---+---+---+---+---+---+---+---+ N-32 +4 +8 +12 +16 +20 +24 +28 +32 +36 +40 5.9 Dopo l'esecuzione delle istruzioni: ldmfd sp,{r0-r3,r12,lr}^ nop ldr lr,[sp,#(6*4)] +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ SY| | | | | | | | | | | | | | N | O | | |////| | A | B | C | D | E | F | G | H | I | J | K | L | M |----|---| * | ? |----| *IR| | | | | | | | | | | | | |N-32|P+4| | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| A | B | C | D | M | O |P+4| Q | X | Y | Z | +---+---+---+---+---+---+---+---+---+---+---+ N-32 +4 +8 +12 +16 +20 +24 +28 +32 +36 +40 5.10 Dopo l'esecuzione della istruzione: movs pc,lr +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ | | | | | | | | | | | | | | sp | lr| pc| | | |r0 |r1 |r2 |r3 |r4 |r5 |r6 |r7 |r8 |r9 |r10|r11|r12|r13 |r14|r15|cpsr|spsr| +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ *SY| | | | | | | | | | | | | | N | O | | |////| | A | B | C | D | E | F | G | H | I | J | K | L | M |----|---|P+4| Q |----| IR| | | | | | | | | | | | | |N-32|P+4| | | Q | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+---+---+----+----+ STK| X | Y | Z | +---+---+---+ N +4 +8 ========