Salta al contenuto
Note per Studenti Sistemi di interruzioni - latenza, nesting e sostenibilità

Sistemi di interruzioni - latenza, nesting e sostenibilità

In questa pagina 5

Questa nota quantifica quanto detto in Sottosistema di I-O - polling, interruzioni e DMALe periferiche si collegano al bus con una interfaccia che ha registri di dati (DREG), controllo (CREG) e stato (SREG); nei µC e DSP sono mappati in memoria (si leggono e scrivono come locazioni). Poiché le periferiche sono asincrone e lente, la sincronizzazione avviene per polling (inefficiente), per interruzioni (la più usata) o per DMA (costoso, per grandi quantità di dati). Una interruzione: completa l'istruzione, salva il contesto (PC e registro di stato, spesso altro), esegue la ISR, ripristina. Le sorgenti si distinguono con ISR di stato, interruzioni vettorizzate o daisy-chaincollegamento delle periferiche in catena, in cui il segnale di riconoscimento passa dall'una all'altra; le NMI non sono mascherabili.Sottosistema di I-O - polling, interruzioni e DMA →: quanto tempo passa tra la richiesta di una interruzione e l'inizio della sua routine di servizio, e quando un insieme di sorgenti di interruzione è gestibile senza perdere richieste. È una domanda presente in ogni appello di Elettronica Industriale.

Nesting e priorità

Le sorgenti hanno una priorità; per convenzione nelle tabelle "prioritàordine con cui sono servite le richieste: 1 è la più alta 1" è la più alta. Due strategie di gestione:

  • senza nesting: una ISR in corso non viene mai interrotta. Le richieste che arrivano nel frattempo restano pendenti e sono servite in ordine di priorità alla fine della ISR. Se più richieste sono pendentirichieste arrivate ma non ancora servite, in attesa che la CPU sia libera si serve prima quella di priorità maggiore.
  • con nesting (annidamento): una richiesta di priorità maggiore interrompe subito la ISR in corso (quelle di priorità minore restano pendenti fino al termine). Il nesting serve a servire nel minimo tempo le interruzioni di alta priorità; può penalizzare quelle di bassa priorità. Se tutte le ISR sono brevi, anche la gestione senza nesting dà buone prestazioni (il massimo ritardo è breve). Molti DSP offrono solo la gestione senza nesting; Cortex-M3, Freescale 56F8xx e AD 21xx offrono il nesting.

Tempo di latenza

Il tempo di latenzatempo tra la richiesta di interruzione e la prima istruzione della sua ISR TLT_L è il tempo tra la richiesta di interruzione e l'esecuzione della prima istruzioneoperazione elementare del processore: la CPU finisce quella in corso prima di servire l'interruzione della sua ISR. Ha una componente intrinseca TLIT_{LI} dovuta al salvataggio del contestocopia in memoria (o in registri alternativi) dello stato del programma interrotto (PC, SR, registri), automatico o da programma; minimizzarla è importante (nei µC con vettorizzazione e salvataggio automatico è piccola). Le interruzioni di priorità più bassa hanno latenze crescenti.

Detto Tex,iT_{ex,i} il tempo di esecuzione (corpo) della ISR della priorità ii, nel caso peggiore (tutte le ISR di priorità maggiore attive):

  • con nesting, per la priorità nn: TL,n=TLI+∑i=1n−1Tex,i;T_{L,n}=T_{LI}+\sum_{i=1}^{n-1}T_{ex,i};
  • senza nesting: TL,n=TLI+∑i=1n−1Tex,i+max⁡j>nTex,j,T_{L,n}=T_{LI}+\sum_{i=1}^{n-1}T_{ex,i}+\max_{j>n}T_{ex,j}, perché la richiesta può arrivare quando è appena partita la ISR più lunga di quelle di priorità più bassa (che non si può interrompere). Anche l'interruzione di priorità più alta ha latenza superiore a TLIT_{LI}, per due motivi: le interruzioni possono essere disabilitate per proteggere una regione criticatratto di programma che non deve essere interrotto, e per cui le interruzioni sono disabilitate (TRCT_{RC}) e la CPU deve completare l'istruzione in corso (la più lunga dura TISTT_{IST}). Nel caso peggiore TL=TLI+TRC+TISTT_L=T_{LI}+T_{RC}+T_{IST} (per la priorità 1).

Nelle formule che seguono Td,iT_{d,i} è la durata complessiva della richiesta ii: per l'utilizzo si usa Tex,i+TLIT_{ex,i}+T_{LI} (tempo in cui la CPU lavora per quella sorgente), per la condizione di intervallo si aggiunge anche l'istruzione in corso, Td,i=Tex,i+TLI+TISTT_{d,i}=T_{ex,i}+T_{LI}+T_{IST}. Nei temi d'esame la tabella spesso dà già "durate comprensive di tutto": allora si usa quel valore ovunque. Quando il testo chiede "la percentuale di tempo dedicata all'esecuzione delle ISR" si usano soltanto i Tex,iT_{ex,i}.

Esempio (tema d'esame settembre 2020). Tre attività, nessun nesting: conversione AD + PI (125 µs, 300 Hz, priorità 1), trasmissione seriale (120 µs, 300 Hz, priorità 2), lettura del riferimento (60 µs, 20 Hz, priorità 3). Percentuale di utilizzo: 125⋅300+120⋅300+60⋅20=74700125\cdot300+120\cdot300+60\cdot20=74700 µs al secondo =7,47%=7{,}47\%. Latenze massime (senza nesting): priorità 1: max⁡(120,60)=120\max(120,60)=120 µs; priorità 2: 125+60=185125+60=185 µs; priorità 3: 125+120=245125+120=245 µs.

Sostenibilità: quando nessuna richiesta viene persa

Il sistema deve riuscire a servire tutte le richieste. Due condizioni, la prima necessaria ma non sufficiente.

1) Densità delle interruzioni (utilizzo della CPU): ∑i=1NTd,iTp,i<1,\sum_{i=1}^N\frac{T_{d,i}}{T_{p,i}}<1, con Tp,iT_{p,i} il periodo minimoil minimo intervallo di tempo tra due richieste successive della stessa sorgente di ripetizione della richiesta ii (inverso della frequenza massima). La somma è la percentuale di tempo che la CPU dedica alle ISR.

2) Condizione di intervallo, per ciascuna interruzione ii (non basta la prima perché richieste di priorità più alta, sommandosi, possono impedire di servire la ii-esima nel suo periodo): Td,i+∑k=1i−1nk Td,k  +  max⁡ ⁣(TRC,max⁡j>iTd,j)⏟solo senza nesting  ≤  Tp,i.T_{d,i}+\sum_{k=1}^{i-1}n_k\,T_{d,k}\;+\;\underbrace{\max\!\big(T_{RC},\max_{j>i}T_{d,j}\big)}_{\text{solo senza nesting}}\;\le\;T_{p,i}. nkn_k è il numero di volte in cui la richiesta kk di priorità maggiore può verificarsi nell'intervallo Tp,iT_{p,i}: nk=⌈Tp,i/Tp,k⌉n_k=\lceil T_{p,i}/T_{p,k}\rceil (le slide scrivono INT(Tp,i/Tp,k)+1\mathrm{INT}(T_{p,i}/T_{p,k})+1, che coincide con ⌈⋅⌉\lceil\cdot\rceil per rapporti non interi e dà un'unità in più per rapporti interi; nei temi si usa il rapporto stesso quando è intero: per esempio Tp,3=12 Tp,1T_{p,3}=12\,T_{p,1} vale n1=12n_1=12). Il termine con il massimo c'è solo senza nesting (la ISR in corso, di priorità più bassa, non si può interrompere), mentre con nesting è assente.

Procedura per l'esame:

  1. calcolare la somma ∑Td/Tp\sum T_d/T_p (se ≥1\ge1: non sostenibile, stop);
  2. per ogni ii calcolare il primo membro della condizione di intervalloverifica che una ISR riesca a finire entro il periodo di ripetizione, tenendo conto delle ISR di priorità maggiore (con o senza nesting) e confrontarlo con Tp,iT_{p,i};
  3. per una massima durata Td,xT_{d,x} o una massima frequenza (minimo Tp,xT_{p,x}) di una sorgente, imporre l'uguaglianza in tutte le condizioni in cui Td,xT_{d,x} o Tp,xT_{p,x} compare e prendere la più restrittiva (tipicamente quella della priorità più bassa, che raccoglie le richieste di tutte le altre).

Esempio 1: due sorgenti senza nesting

Due interruzioni vettorizzatecon una linea di richiesta per ogni sorgente e salto automatico alla routine giusta (priorità 1 e 2, senza nesting), richieste ogni 100 µs, regione critica di 20 µs nel programma principale. Condizioni: (1) Tex,1+max⁡(TRC,Tex,2)<100T_{ex,1}+\max(T_{RC},T_{ex,2})<100 µs; (2) TRC+Tex,2+Tex,1<100T_{RC}+T_{ex,2}+T_{ex,1}<100 µs. La seconda è più restrittiva: Tex,1+Tex,2<80T_{ex,1}+T_{ex,2}<80 µs.

Esempio 2: tre sorgenti (tema d'esame gennaio 2026)

priorità durata TdT_d [µs] periodo TpT_p [µs]
IRQ1 1 3 10
IRQ2 2 5 20
IRQ3 3 25 500

Utilizzo: 310+520+25500=0,3+0,25+0,05=0,60<1\frac3{10}+\frac5{20}+\frac{25}{500}=0{,}3+0{,}25+0{,}05=0{,}60<1.

Senza nesting: per IRQ1: 3+max⁡(5,25)=28>103+\max(5,25)=28>10 ✗. Non sostenibile: la ISR3, lunga 25 µs e non interrompibile, può ritardare l'IRQ1 oltre il suo periodo.

Con nesting: IRQ1: 3<103<10 ✓. IRQ2: 5+n1⋅35+n_1\cdot3 con n1=⌈20/10⌉=2n_1=\lceil20/10\rceil=2: 11<2011<20 ✓. IRQ3: 25+n1⋅3+n2⋅525+n_1\cdot3+n_2\cdot5 con n1=50n_1=50, n2=25n_2=25: 25+150+125=300<50025+150+125=300<500 ✓. Sostenibile con nesting.

Massima durata di ISR2 (con nesting): IRQ2 chiede Td,2+6≤20⇒Td,2≤14T_{d,2}+6\le20\Rightarrow T_{d,2}\le14; IRQ3 chiede 25+150+25 Td,2≤500⇒Td,2≤1325+150+25\,T_{d,2}\le500\Rightarrow T_{d,2}\le13 µs: vale 13 µs (la condizione dell'IRQ3 è la più restrittiva).

Massima frequenza di IRQ1 (con nesting): IRQ1: 3≤Tp,13\le T_{p,1}; IRQ2: 5+⌈20/Tp,1⌉⋅3≤20⇒⌈20/Tp,1⌉≤5⇒Tp,1≥45+\lceil20/T_{p,1}\rceil\cdot3\le20\Rightarrow\lceil20/T_{p,1}\rceil\le5\Rightarrow T_{p,1}\ge4; IRQ3: 25+⌈500/Tp,1⌉⋅3+125≤500⇒⌈500/Tp,1⌉≤116⇒Tp,1≥4,3125+\lceil500/T_{p,1}\rceil\cdot3+125\le500\Rightarrow\lceil500/T_{p,1}\rceil\le116\Rightarrow T_{p,1}\ge4{,}31 µs. Quindi fmax=1/4,31 μs=232f_{max}=1/4{,}31\ \mu\text{s}=232 kHz.

Esempio 3: dalla percentuale di impegno alle durate

Se le durate sono proporzionali (Td,1T_{d,1}, 2Td,12T_{d,1}, 3Td,13T_{d,1}) con Tp,1=18T_{p,1}=18 µs, Tp,2=36T_{p,2}=36 µs, Tp,3=216T_{p,3}=216 µs e l'impegno complessivo è del 75%: Td,118+2Td,136+3Td,1216=Td,1⋅1+1+0,2518=0,75⇒Td,1=6\frac{T_{d,1}}{18}+\frac{2T_{d,1}}{36}+\frac{3T_{d,1}}{216}=T_{d,1}\cdot\frac{1+1+0{,}25}{18}=0{,}75\Rightarrow T_{d,1}=6 µs, Td,2=12T_{d,2}=12 µs, Td,3=18T_{d,3}=18 µs. Senza nesting: per IRQ1 6+max⁡(12,18)=24>186+\max(12,18)=24>18 ✗; con nesting: IRQ2 12+2⋅6=24<3612+2\cdot6=24<36, IRQ3 18+12⋅6+6⋅12=162<21618+12\cdot6+6\cdot12=162<216 ✓.

Interruzioni e temporizzazione di un algoritmo

Un algoritmo di filtraggio o controllo posto nella ISR dell'ADC deve terminare entro il periodo di campionamento, tenendo conto delle latenze e delle ISR di priorità maggiore: altrimenti si perdono campioni e la frequenza di calcolo non è più costante. Buona pratica: associare all'ADC l'interruzione di priorità più alta. Per misurare la durata reale di un segmento di codice si usa un pin di I/O (acceso all'inizio, spento alla fine) e un oscilloscopiostrumento che mostra l'andamento nel tempo di un segnale elettrico: permette anche di scoprire occasionali variazioni (jitter, glitchimpulso indesiderato di breve durata).

Errori comuni

  • Verificare solo l'utilizzo <1<1 e dimenticare le condizioni di intervallo.
  • Dimenticare il termine con il massimo delle durate di priorità più bassa senza nesting.
  • Contare nkn_k con il rapporto sbagliato (deve essere Tp,i/Tp,kT_{p,i}/T_{p,k}, periodo della ii-esima sorgente su periodo della kk-esima).
  • Trascurare la latenza intrinseca quando la tabella dà solo TexT_{ex}.

Versione ripasso

Esercizi su questo argomento

Teoria collegata