Qual è il punto di avere un interrupt di livello?


8

Ovunque abbia cercato l'implementazione pratica dell'interrupt basato sul livello, ho trovato solo un suggerimento che le persone hanno dato, cioè disabilitare l'interrupt non appena entra nell'ISR modo che non si inneschi nuovamente.

Un'altra cosa che ho letto è che è usato per creare un loop, cioè finché c'è l'interrupt, serve l'ISR, ma ciò potrebbe essere ottenuto con un whileodo while loop.

E i vantaggi che un interrupt di livello fornirebbe potrebbe essere il lusso di eseguire un'istruzione del programma principale tra servire gli ISR ​​e la latenza. Suppongo.

Quindi c'è qualcosa che mi manca quando si tratta di comprendere l'interruzione del limite di livello?

Una grande risposta sarebbe mostrarmi una sorta di uso pratico degli interrupt di livello.


... Un'altra cosa che ho letto è che viene utilizzato per creare un loop, cioè finché è presente l'interrupt, serve l'ISR, ma ciò potrebbe essere ottenuto con un po 'di tempo o un ciclo while ... Il fatto che alcune cose possono essere raggiunto in un modo, non significa che dovremmo eliminare tutti gli altri modi di fare lo stesso.
Eugene Sh.

@EugeneSh. Non c'è dubbio, ma ci deve essere un solido vantaggio nel fare la stessa cosa nell'altro modo. No? Sono più interessato a sapere quel "vantaggio". Voglio solo sapere che tipo di differenza fa nel looping usando istruzioni loop e interrupt di livello? Se il looping è l'unico scopo raggiunto utilizzandolo.
MaNyYaCk,

2
cosa succede se si dispone di più interrupt in sospeso su una riga? ad es. ogni trigger di ISR ​​gestisce un pacchetto di dati ma il dispositivo ne ha multipli nella coda? Con l'interruzione attivata dal fronte, il controller dell'interrupt deve sapere quando viene gestita l'interruzione precedente e quando è il momento di inviare l'interruzione successiva. Anche per i casi d'uso in cui viene affermato l'interrupt multiplo quando l'host sta ancora gestendo uno precedente, senza che venga attivato il livello, è difficile accodarli e stabilire le priorità.
user3528438

Risposte:


10

Gli interrupt di livello possono essere condivisi e messi in cascata in modo semplice e affidabile; al contrario, la condivisione affidabile di interruzioni innescate dai bordi è spesso difficile e talvolta impossibile.

Quando si usano gli interrupt di livello, un gestore di interrupt può semplicemente chiedere a ogni possibile sorgente di interruzione a sua volta "Hai bisogno di attenzione" e, in tal caso, sostituirlo. Al termine, il gestore può tornare. Se una sorgente di interrupt che è stata sottoposta a polling all'inizio della sequenza decide di aver bisogno di attenzione mentre viene eseguita la manutenzione di una sorgente successiva, il processore noterà che il pin IRQ è ancora attivo e riattiverà il gestore di interrupt, consentendo così all'interrupt in arrivo in arrivo di essere revisionato.

Quando si usano gli interrupt trigger-edge non in cascata, le cose si complicano. Dopo che un gestore di interrupt ha esaminato e assistito tutti, deve quindi esaminare e ripetere il polling di tutti per scoprire se un dispositivo precedentemente sottoposto a polling ha deciso che necessita di assistenza. Solo dopo che ogni dispositivo ha consecutivamente segnalato che non ha bisogno di assistenza, sarebbe sicuro che l'interruzione ritorni. Si noti che se i dispositivi che desiderano assistenza mantengono attiva la loro indicazione di "necessità di servizio", il ritorno da un gestore di interruzioni in un momento in cui un dispositivo necessita di assistenza può rendere tale interruzione permanentemente inutile.

Può essere utile che un pin I / O abbia una logica di acquisizione dei bordi che, quando arriva un fronte, imposta un fermo e genera un'indicazione di "servizio necessario" fino a quando il software non lo cancella. Una cosa del genere potrebbe apparire proprio come un interrupt sensibile ai bordi. In qualsiasi punto a valle, tuttavia, è meglio avere una richiesta di logica di interruzione per la manutenzione di un interrupt in qualsiasi momento quando un punto a monte non è soddisfatto.


Vorrei scusarmi per aver impiegato così tanto tempo. Ma la domanda che ho posto era molto specifica per gli interrupt esterni del controller e mi ci è voluto un po 'di tempo per capire tutte le risposte che sono arrivate considerando il processore con un controller di interrupt. Grazie per aver fornito questa preziosa risposta.
MaNyYaCk,

6

Una situazione ovvia in cui gli interrupt di livello sono utili è quella in cui il segnale è già in quello stato quando il codice inizia a monitorare il segnale.

Consideriamo un esempio tipico ...

Segnale: "Case_Over_Temperature" Si abbassa quando l'ambiente nella scatola è troppo alto per il normale funzionamento.

Ovviamente, questo segnale potrebbe abbassarsi in qualsiasi momento, sia perché stiamo producendo troppo calore, sia perché la scatola è installata in un luogo caldo.

Ovviamente, all'accensione quella linea potrebbe essere in entrambe le condizioni. Supponiamo per il momento che il codice di accensione non vada semplicemente a cercare ma si basi invece sull'interruzione. Se l'interruzione è attivata dal fronte e il segnale è già basso, quando l'interruzione viene abilitata il codice appropriato non verrà eseguito. Gli interrupt sensibili al livello sarebbero prudenti qui.

Allo stesso modo, se il processore viene messo in sospensione e non è impostato per riattivarsi su quell'interruzione, quella linea può scendere in qualsiasi momento. Quando qualsiasi altra cosa si sveglia, accade che l'interrupt si attivi in ​​quel momento.

In effetti, probabilmente, con la prevalenza dei processori in modalità sleep, gli interrupt basati sul livello sono diventati più utili.

Tuttavia, come per tutto ciò che riguarda il codice, esiste sempre più di un modo per "scuoiare un gatto". Se non si utilizza il livello di base, il codice di riattivazione deve eseguire il polling dei pin di interruzione se non vengono messi in coda automaticamente dal processore.

Ovviamente, il livello attivato presenta anche una serie di problemi in quanto il codice deve gestire sapendo che ha già gestito la condizione, ecc.


2

È un po 'il contrario: perché avere interruzioni innescate che si attivano in modo anomalo quando è possibile attivare il livello più semplice?

Gli interrupt attivati ​​dal bordo sono più sensibili ai picchi di rumore e più difficili da filtrare. Sono quindi più rischiosi per far passare i cavi off-board o up. L'interruzione non può essere ritirata dalla fonte.

Gli interrupt attivati ​​dal livello rimangono attivi fino a quando la CPU non riconosce la sorgente. Quindi c'è la solida base dell'handshaking completo. La CPU è in grado di filtrare il rumore dal segnale di interruzione quasi in qualsiasi modo lo desideri, ma sta semplicemente aumentando il tempo di risposta degli interrupt. Se l'applicazione richiede e consente segnali ben filtrati, il trigger di livello è adattabile.

Ho visto per la prima volta gli interrupt trigger-edge utilizzati per gli NMI su CPU come Z80 e 6502, mentre gli interrupt mascherabili utilizzavano il trigger di livello. Gli NMI utilizzavano il trigger a fronte semplicemente per impedire a un perno bloccato o a un circuito di guida bloccato di impedire che la CPU rientrasse nell'ISR NMI per sempre. L'NMI deve mostrare l'attività per ottenerne un'altra.

La risposta, ovviamente, è che entrambi hanno le loro applicazioni. Ma il livello di partenza è il punto di partenza e il trigger di fronte è andato perché c'è un caso speciale.


1
Non direi che Z80 e 6502 usassero interruzioni triggerate dal bordo per evitare problemi di pin "bloccati". Invece, direi che devono essere in grado di mascherare qualsiasi tipo di interruzione una volta che la manutenzione è iniziata, e per NMI che viene realizzato tramite un dispositivo di chiusura speciale "maschera NMI" che viene impostato quando viene eseguita la manutenzione di un NMI e viene cancellato quando il Il pin NMI è stato rilasciato.
supercat,

@supercat, hai descritto come lo vedi ma non come funziona Z80 / 6502. L'NMI avrebbe potuto essere a livello, come INT / IRQ con la sorgente di interruzione rimossa dalla conferma di interruzione hw o sw. Funziona perfettamente. Cosa pensi li abbia resi progettare NMI come edge-triggered e INT / IRQ come livello, cosa vedi come vantaggio?
TonyM,

Il termine "edge triggered" viene utilizzato per descrivere gli ingressi che posizionano un circuito di rilevamento dei bordi prima di un sincronizzatore, in modo che un segnale che va e viene all'interno di un singolo ciclo verrà elaborato, ma l'ho visto anche usato per descrivere gli ingressi che blocca un segnale su ciascun segnale di clock e cerca un segnale che è assente su uno o più cicli e quindi presente per uno o più cicli. Se l'NMI dovesse essere riconosciuto dal software, il mancato riconoscimento del primo interrupt maschererebbe efficacemente tutti quelli successivi.
supercat,

@supercat, non è così che funzionano Z80 / 6502 e solo loro sono stati l'oggetto del mio esempio che hai messo in discussione. Se stai dopo una discussione su NMI innescati da edge, vai a chattare per evitare uno scambio di commenti prolungato. Non sono sicuro di cosa posso aggiungere, però. Grazie.
TonyM,

Non ho esaminato i dettagli di come funziona lo Z80, ma secondo la scheda dati 6502 l'NMI viene campionato una volta su ogni clock phi2. La scheda tecnica non fornisce informazioni sui tempi di campionamento / attesa, ma da quello che ho letto altrove un impulso NMI che non è presente durante almeno tre campioni consecutivi non verrà sempre elaborato.
supercat,

1

Supporto Ack / Nak basato su livello ISR che è utile quando si hanno molte fonti.

Se hai molti ISR ​​e molti gradi di priorità sia in SW che in HW esterni con priorità classificate.

Se tutte le fonti fossero edge OR dovresti comunque effettuare il polling di ognuna per trovare quale sorgente impostare e quindi cancellare l'interrupt.

Quindi sia il bordo che il livello presentano vantaggi in architetture diverse.

Per evitare di perdere un Edge IRQ, è necessario abilitarlo e testarlo immediatamente dopo alla fine dell'ISR.

Alcuni IRQ di livello possono durare a lungo rispetto all'ISR e rilevati se previsti.


1

È quando viene utilizzata una "linea per feste", insieme a open-drain o open-collector, quando la modalità di funzionamento a livello ha più senso.

In questo caso, ogni "parte" sulla linea attiva il proprio output quando ha bisogno di "servizio". Man mano che il software di gestione degli interrupt si spegne e esegue il polling (e quindi gestisce) a turno ciascun dispositivo sulla linea del party, questi dispositivi rilasciano la presa e diventano inattivi. Alla fine, non ci sono più interruzioni (di livello) rimanenti, la linea di interruzione stessa diventa inattiva e gli interrupt di gestione del software diventano di nuovo "quiescenti".


1
importa. cosa succede se l'host riceve un altro vantaggio su un'altra linea quando sta già gestendo un interrupt? alcune scelte: 1) ignora l'interrupt in arrivo; 2) metterlo in coda nell'hardware; 3) interrompere l'attuale gestore di interrupt e gestire quello nuovo, gestirlo completamente o metterlo in coda per dopo. Con il trigger di livello lo lasci lì e sarà ancora lì per te da gestire dopo aver terminato l'ISR corrente.
user3528438

@ user3528438 Mi rivolgo alla domanda sul "perché livello". Quindi rimuoverò quella parte ed eviterò il dibattito.
Jon

1
Anche quando si usano interrupt dedicati, suggerirei che gli interrupt triggerati da edge sono migliori solo se si potrebbe essere interessati a rispondere a un evento che potrebbe essere venuto e scomparso nel momento in cui si può intervenire, e anche lì usando un latching di eventi il dispositivo per guidare un interrupt sensibile al livello può essere utile quanto usare un interrupt sensibile al bordo. Un interruzione innescata dal limite potrebbe salvare un'istruzione che sarebbe altrimenti necessaria per eliminare il latch, ma in genere non è un costo o un risparmio significativi.
supercat,

@supercat Ho ri-focalizzato la mia risposta per rispondere direttamente alla domanda intitolata, in modo da evitare di impegnarmi in qualche capitolo lungo e sordido. Molto più semplice (Sì, uso tutti i tipi di metodi di interruzione dal ... 1974 ... quindi ho visto tutti i motivi, penso. Non voglio discuterne oggi.)
Jon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.