Loading
Note di Apprendimento
Study Reminders
Support
Text Version

Interruzioni in MSP430

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Introduzione a Embedded System Design Professor Dhananjay V. Gadre Netaji Subhas University of Technology, New Delhi Lecture - 25 Interrupts in MSP430 Ciao e benvenuto in una nuova sessione per questo corso online su Introduzione a Embedded System Design. Come di consueto, sono il vostro istruttore Dhananjay Gamma. In questa lezione parleremo di Interrupts. Gli interrupt sono paradigmi molto importanti, è un paradigma importante, è un meccanismo che dà una sensazione di multitasking o di essere in grado di fare più cose contemporaneamente. Ovviamente questo non è vero, perché alla fine del giorno il vostro microcontrollore, che sia MSP430 o qualsiasi altro piccolo microcontrollore ha una sola CPU e una singola CPU può eseguire una sola operazione alla volta.
Ma poiché è in grado di eseguire quelle operazioni ad una velocità molto veloce rispetto ai livelli di interazione umana o velocità dell'interazione umana, è possibile dare una percezione che il microcontrollore o il vostro microcontrollore nel sistema embedded stia effettivamente facendo più cose contemporaneamente. E così vi introdurremo a questo concetto di interruzioni.
Ora, perché abbiamo bisogno di interruzioni? Si tratta di un'idea importante perché un microcontrollore o un sistema incorporato vorrebbero eseguire diverse funzioni contemporaneamente. Per esempio, diciamo che in un sistema hai molti, molti switch o hai pochi interruttori, poche manopole di selettore e un utente esterno come un essere umano può premere il commutatore o un pomello o qualche altro interruttore e si desidera che il microcontrollore risponda a questo evento esterno.
Ora se un microcontrollore sta cercando di leggere un interruttore, allora bisognerà aspettare che quell' interruttore venga premuto, se è in attesa che quell' interruttore venga premuto, cosa se l'utente preme un altro interruttore?
Come si fa, come si fa ad affrontare una situazione del genere? Così (micro) il modo di risolvere questo è quello di portare in questo concetto di interruzioni. (Fare Slide Time: 02.29) Quindi, le interruzioni consentono di eseguire più attività invece di polling. Ora cosa è il polling? Per esempio, io do questa idea che ci sono diversi interruttori, forse ci sono diversi pomelli, e un modo per affrontare un utente esterno che preme qualsiasi interruttore o trasformare una qualsiasi delle manopole sarebbe quello di andare ad un interruttore, aspettare che venga premuto per qualche tempo, poi andare su un altro interruttore attendere che venga premuto, se non viene premuto andare al terzo interruttore così via e così via, e può continuare a polling. Polling significa attendere un'azione, in attesa che un evento accada e se non c'è evento può andare a guardare un altro evento, possibilità di un altro evento.
Ora, questo polling va bene ma quando il numero di tali input esterni aumenta o mi lasciano continuare con questo esempio, diciamo che ci sono diversi interruttori e l'utente preme un interruttore, ma il momento in cui un utente preme un interruttore, il microcontrollore rileverà che quell' interruttore è stato premuto. E se durante quel tempo viene premuto un altro interruttore?
Ma perché il microcontrollore è in attesa che questo interruttore venga premuto e che abbia ora rilevato che questo interruttore è stato premuto, attenderà che venga rilasciato, durante quel tempo se qualcun altro o l'essere umano preme un altro interruttore e lo rilascia, è possibile che il microcontrollore lo mancherà, e quindi il modo di gestire tali eventi esterni sarebbe quello di dare delle slot temporali ed eseguire un'azione. Se non c'è un'azione passa ad un'altra attività o un altro input, aspetta che venga eseguito, se non puoi continuare ad andare da uno al secondo al terzo al quarto e così on.Quindi, polling eventi esterni usando un metodo che spesso viene chiamato round-robin è una buona idea e posso darti un'analogia. Diciamo che sto dando una lezione, sto consegnando una lezione in un'aula, un'aula fisica dove ci sono pochi studenti e questi studenti vogliono farmi delle domande in base a quello che ho insegnato. Ora un modo per affrontare quello è, impostare una regola che seguo dopo aver insegnato un particolare modulo, diciamo che insegno un concetto e alla fine del concetto che farò, a partire da lasciarci dire a sinistra dell'aula, chiederò ad ogni studente, l'avete capito? Hai qualche dubbio? L'hai capito? Hai qualche dubbio? L'hai capito? Hai qualche dubbio? Posso andare da sinistra a destra e coprire l'intera classe.
Ora, se faccio questo metodo, se uso questo metodo per cercare di trovare se qualcuno ha una domanda e vorrebbero una risoluzione di quella domanda, questo metodo di fornire una risoluzione è chiamato polling e questo funziona bene se il numero di persone in questo esercizio è limitato e sono piccoli. Ora immaginate il numero di partecipanti, numero di studenti in classe aumenta. Se è così, diciamo che inizio a fare il polling questa classe da sinistra e c'è uno studente a destra, estrema destra e ha un dubbio, ha una domanda, ma fino a quando non vengo a quella studentessa, dovrà aspettare.
Mentre dopo gli chiedo cosa succederebbe se il solo studente precedente avesse un'altra domanda e avrebbe dovuto aspettare fino a quando tornerò dopo aver completato di nuovo tutti gli studenti a quel secondo ultimo studente, e così il polling è problematico quando il numero di input, il numero dei partecipanti aumenta ed è qui che entra in gioco l'idea di interruzione. Come funziona?
Immagina di cambiare la regola della partecipazione in classe, che invece di me dopo aver insegnato un concetto che chiederò individualmente a ciascuno studente se hanno un dubbio. Diciamo che cambio la regola che ogni volta che insegno un concetto dopo che chiunque abbia un dubbio può alzare la mano. Quindi, questo atto di alzata di mano equivale a generare un'interruzione, ovviamente quando sto insegnando e se qualcuno solleva una mano, avrò la possibilità di ignorarlo perché potrei essere di fronte alla lavagna e dopo aver insegnato quel concetto mi girerò e vedrò quante mani sono alzate.
Se non ci sono mani alzate, cosa significa? Che loro, gli studenti hanno ricevuto il mio, quel particolare argomento ben e posso continuare al prossimo argomento. Ma se alcuni studenti hanno un dubbio che cresceranno di mano e di nuovo, rifarei la scansione da sinistra a destra e la mano alzata che trovo in questo processo di scansione da sinistra a destra, la prima che trovo, prima mano che trovo alzata, chiederò loro qual è la domanda e rispondo che e poi andrò alla prossima mano alzata e così via.
Ora immaginate in questa situazione la prima persona solleva una mano sulla sinistra, chiedo a quale domanda sia, rispondo a quella domanda, intanto un'altra persona verso destra aveva alzato anche la mano, ma perché io posso rispondere solo a una domanda alla volta. Scelgo di privilegiare la persona a sinistra e dal momento in cui finisco quella domanda e ho iniziato a scansionare verso destra, ho scoperto che la seconda persona ha messo la mano o la mano giù.
Per me il mio lavoro è fatto. Se non trovo altra mano alzata fino alla fine della stanza, immagino che la seconda persona probabilmente aspettata abbastanza a lungo non abbia avuto un'opportunità o è anche possibile che la prima domanda sollevata sia stata anche la stessa domanda che la seconda persona ha dovuto chiedere e quindi ha trovato inutile continuare ad alzare la mano.
Quindi, questa idea di alzare una mano è molto, molto simile a questo concetto di interruzione. Quindi, un'interruzione è un meccanismo attraverso il quale un sistema di microcontrollori o un sistema digitale possono guardare ad eventi esterni ogni qualvolta accadano, possono rispondere a quegli eventi. Ora prima di arrivare a quell' aspetto, voglio mostrarti quanto tempo fa MSP430 prendere per eseguire qualsiasi istruzione data.
(Riferimento Slide Time: 08.59) Così, ho elencato qui i vari tipi di istruzioni e in questo particolare, guarda questa terza colonna dove dice, seconda colonna dove dice quanti cicli sono necessari per eseguire una determinata istruzione. E ci sono diversi fogli di questo tipo. (Fare Slide Time: 09.11) Qui ora si vede, qui, stanno prendendo tre cicli e i cicli qui si riferiscono ai cicli dell'orologio. (Slide Time: 09.21) Allo stesso modo, quindi ne hai uno, hai un intervallo da 1 cicli di clock per l'esecuzione di un'istruzione, andando fino a 6 cicli di clock. Quindi, questa è l'istruzione più lunga. Ora, consideriamo anche quanto tempo, qual è la frequenza, qual è il periodo di tempo di questo ciclo di clock? (Fare Slide Time: 09.43) Quindi, se noi, sappiamo che MSP430 lavora ad una frequenza di clock massima di 16 megahertz. Quindi, 16 megahertz è la tua frequenza di clock, questo porta a un periodo di clock di 62,5 nanosecondi, il che significa che l'istruzione più veloce eseguirà in 62,5 nanosecondi e il più lungo sarà di 6 e quindi sarà di circa 400, 380 nanosecondo o così. Ora, ovviamente, non abbiamo bisogno di argomentare qui esattamente quale istruzione sta prendendo quanto tempo, prendiamoci in media.
Diciamo che tutte le istruzioni contenute nel mio programma sono in media a 4 cicli di clock, il che significa pressappoco stiamo parlando di 62 su 4, di circa 260, fateci sapere arrotondare a 250 nanosecondi. 250 nanosecondo è il tempo medio in cui qualsiasi istruzione data assume in un determinato programma, il che significa che se un'istruzione impiega 250 nanosecondi che significa in 1 microsecondo eseguo 4 istruzioni. Nel 1 second eseguo 4 milioni di istruzioni.
E questo, infatti, si riferisce alla capacità o alla velocità del processore, spesso si esprime così che per un programma di esempio, per un programma di riferimento dove ci assumiamo, dove abbiamo ipotidato che ogni istruzione assumerà 4 cicli di clock, questo microcontrollore MSP430 può eseguire 4 MIPS, al ritmo di 4 MIPS che è in grado di eseguire un programma al ritmo di 4 milioni di istruzioni al secondo. Ora quello è un gran numero.
L'interazione umana, invece, l'atto di premere un interruttore e rilasciarlo è un processo molto più lento, il che significa che se un umano sta andando a premere pochi interruttori, a questa velocità il microcontrollore sarà in grado di scansare e fare sondaggi molti, molti, molti switch nel 1 second. Anche così, saresti privato dell'esecuzione del programma effettivo mentre il microcontrollore è in attesa di un interruttore da premere e quindi questa idea di interruzione viene portata in scena.
Ora l'interruzione coinvolge, il microcontrollore sta eseguendo un programma e diciamo che un evento esterno vuole attenzioni, un evento esterno qui, ad esempio, potrebbe essere un utente che preme un interruttore. E così invece del microcontrollore che continua a eseguire il programma che stava eseguendo, lo sospende per qualche tempo, si spezza per eseguire una subroutine che si occupa di questo evento esterno, in questo caso un utente ha premuto un interruttore e poi ritorna dopo aver scoperto quale interruttore è stato premuto, può tornare al programma principale e continuare l'esecuzione di quel programma.
Quindi, un'interruzione si riferisce al trasferimento del controllo del microcontrollore dal programma esistente per eseguire una subroutine speciale, eseguirlo e poi tornare rapidamente per riprendere il programma in corso che stava eseguendo.
(Riferimento Slide Time: 13.14) Ora, questo evento potrebbe essere a causa di un evento esterno, significa che qualcuno ha premuto un interruttore o a causa di una richiesta o evento generato internamente, ad esempio, forse il microcontrollore ha un ADC, Analog to Digital Converter. L'analogico a Digital Converter richiede molto tempo per completare una conversione e dopo che la conversione è finita la periferica ADC potrebbe generare un interrupt che dice al microcontrollore che qualunque conversione doveva essere eseguita, è finita, gentilmente guarda il risultato e fai quello che devi fare. Quindi, le interruzioni potrebbero essere generate da fonti esterne così come le periferie interne. (Fare Slide Time: 13.53) Ora, dove sono interrotte le interruzioni? Beh, tipicamente quando hai un compito urgente, stai eseguendo un programma principale e arriva qualche incarico urgente, ti piacerebbe affrontarlo sospendendo il tuo programma esistente che tratta di questi compiti urgenti e tornare a continuare a eseguire il programma in corso.
Compiti frequenti, che accadono una volta ogni tanto, si vorrebbe trattare con loro usando un'interruzione e come ho accennato, gli input umani sono molto lenti, possono essere infrequenti rispetto alla velocità con cui un microcontrollore può eseguire un programma, l'interazione umana è molto, molto infrequente e quindi si potrebbe gestire gli eventi esterni generati dagli input dagli esseri umani attraverso interruzioni.
Inoltre, nel caso di MSP430, e questo è molto importante e specifico per MSP430 perché ha molte modalità di risparmio energetico. Una volta che un microcontrollore entra in una modalità di risparmio energetico, si sospende il funzionamento di un programma e se si desidera riprendere l'esecuzione del programma, è molto importante uscire da queste modalità di alimentazione basse. Come abbiamo discusso, ci sono diverse modalità a basso consumo, ha quattro o cinque modalità a basso consumo e il modo per uscire dalla modalità a basso consumo e continuare, iniziare, iniziare a eseguire il programma richiede un'interruzione.
E così in MSP430, quando ci si trova, quando si è entrati in una modalità a basso consumo, l'unico modo per uscirne è tramite un'interruzione, qualunque sia la fonte di quell' interruzione. Ne discuteremo quando discuteremo di modalità a basso consumo e come intervengono le interruzioni per uscire da queste modalità a basso consumo.
Ora, come si gestiscono le interruzioni? Come ho accennato, il vostro programma principale che si stava eseguendo sarebbe stato sospeso e si eseguirebbe una subroutine, e quindi può sembrare che un'interruzione stia eseguendo una risposta ad un'interruzione è come eseguire una subroutine, anzi lo è.
(Riferimento Slide Time: 16.00) Ma è diverso da una funzione o subroutine convenzionale, è sicuramente un po' diverso per vari motivi. In una normale funzione o subroutine, si chiama quella funzione. Ma in un'interruzione non si chiama quella subroutine di interruzione, la subroutine di interruzione viene chiamata. Perché? Perché spesso è il risultato di un'operazione asincrona come un utente che preme un interruttore.
In una normale subroutine, ovviamente, sospendi la tua esecuzione corrente e vai a eseguire quella subroutine. Ma dopo che la subroutine è finita, vuoi tornare dove eri prima, e quindi il modo di fare che sarebbe quello di salvare il controvalore del programma sulla pila.
Ora in caso di subroutine di interruzione, non si sa quando si viene chiamati e quindi è necessario non solo memorizzare l'indirizzo dell'istruzione che si sta eseguendo o che avrebbe eseguito sulla pila, ma anche lo stato del microcontrollore e lo stato del microcontrollore qui si riferisce a varie bandiere come zero, carry e così via. Quindi anche quelli devono essere salvati sullo stack.Inoltre, devi sapere che per una determinata interruzione, dov' è la subroutine. Perché ci possono essere diverse fonti di interruzioni e non si può andare a un solo indirizzo per scoprire chi ha creato, chi ha generato quell' interruzione e quindi lasciarmi eseguire questo particolare programma in risposta a quell' input. Il modo in cui viene gestito è che per tutti i vari input e tutte le varie fonti di interruzioni, si assoca un indirizzo univoco, dove si individua la propria, dove si mette la subroutine in cui verrebbe eseguita una tale interruzione.
Ecco, questo è questo aspetto che l'indirizzo della subroutine di interruzione è determinato dall'hardware. L'indirizzo di una subroutine normale è determinato dal software. A seconda di quanto sia grande il tuo codice, l'assembler o il compilatore metterà quella subroutine da qualche parte, ma e quel posto può cambiare. Ma la subroutine per l'interruzione è decisa dal microcontrollore, il che significa che è deciso dall'hardware e quando vediamo i dettagli capirete cosa intendo.
(Riferimento Slide Time: 18.26) Quindi, le interruzioni richiedono che una sottoroutine venga eseguita in risposta a questo evento, e che la subroutine sia spesso chiamata, molto popolarmente chiamata Interrupt Subroutine o Interrupt Handler.
Le interruzioni possono essere generate dalla maggior parte delle periferie in MSP430, possono essere generate da piedini di input - output general-purpose qui. Come sappiamo che sul MSP430 che stiamo usando sul nostro lunotto ci sono due porte P1 e P2. Qualsiasi pin di input su P1 e P2 può generare un'interruzione. Ogni interruzione ha una bandiera e quando quella bandiera viene alzata, la condizione per l'interruzione è soddisfatta e il microcontrollore farà qualcosa in risposta a quella condizione. Sempre in larga misura sul MSP430, ci sono tre tipi di interruzioni. Uno è il reset del sistema che è, abbiamo discusso la parte reimpostata. Ogni volta che si preme, si genera un reset per qualunque cosa, qualunque cosa possa essere la sorgente di quel reset, viene trattata come un'interruzione.
Inoltre, il pin di reset è condiviso con l'interruzione non maschilabile, ricordiamo che quel pin è in realtà chiamato RST/NMI, il che significa che lo stesso pin può essere utilizzato come input di reset oltre che per un interrotto non maschilabile. NMI spicca per l'interruzione non maschilabile. E a parte queste due fonti, si hanno anche molte, molte periferie che forniscono o generano quelle che sono chiamate interruzioni maschilabili. Stiamo per discutere, qual è il significato di non maskable versus maskable molto a breve.
Ora, qual è il significato dell'interruzione maschilabile e dell'interruzione non maschilabile, e lasciatemi portare alla consueta vita normale per illustrare quell' idea? Come, torniamo a quell' esempio di aula.
Qualcuno ha alzato una mano, ma perché stavo facendo qualcosa di importante sulla lavagna, posso scegliere di ignorare la mano alzata, questo significherebbe che ho mascherato quella fonte di interruzione.
D'altra parte, diciamo che questa aula ha un allarme antincendio, e ogni volta che gli anelli di allarme antincendio, aspetterei quello che sto facendo sulla lavagna per finirlo? No, correrei per la mia vita. Così la fonte di questa particolare interruzione, come illustrato da un allarme antincendio, è un esempio di interruzione non maschilabile. Non ho la libertà o la libertà di ignorare un evento del genere, una tale interruzione e tali interruzioni sono chiamate interruzioni non maschili.
Quindi, sostanzialmente la classificazione degli interruzioni sono interruzioni maschilabili, tali interruzioni, tali eventi, che possono essere ignorati o sospesi per qualche tempo, il che significa sospeso come in te non è necessario rispondere ad essi eseguendo quella subroutine di interruzione, è possibile lasciarle attendere, e alcuni interruzioni che non sono maschilabili. MSP430 offre entrambi.
Nel caso di MSP430, si vedrà nella prossima slide che anche l'interruzione non maschilabile può essere disabilitata. In generale, nei microcontrollori generali, l'interruzione non maschilabile non può essere disabilitata, non può essere sospesa affatto. Ma qui c'è una piccola flessibilità che c'è un meccanismo per ignorare anche quello o disabilitarli. (Fare Slide Time: 22.00) Così, questo diagramma qui è un'importante illustrazione di come vengono generati interruzioni, rilevate, e poi hanno risposto a. Così come ho accennato, la fonte dell'interruzione potrebbe essere piedini in uscita qui.
La fonte di un'interruzione potrebbe essere il tempo di conteggio del timer. Potrebbe essere il, un interrupt non maschilabile. Ora la prima considerazione importante che un'interruzione sarà servita sarebbe che deve generare una richiesta, deve generare un evento. E quando viene generato un evento viene catturato in un registro chiamato flag di interruzione, registro delle bandiere di interruzione.
Quindi, se la bandiera è 1, significa che c'è un evento esterno. Tuttavia, sta a te fare in modo che tu voglia rispondere a quell' evento o vuoi ignorarlo e la seconda parte di questo diagramma di blocco ti mostra che. Ora si vede questo GPIO potrebbe generare un'interruzione, ma potrebbe ignorarlo se questo interruttore è aperto. Quindi, si dispone di un registro chiamato interrompe abilitare il registro se avete disabilitato tali interruzioni, questa richiesta di interruzione non procederà alla CPU.
D'altra parte, si vede che questa interruzione non maschilabile può essere fermata solo da questo interruttore successivamente non c'è nulla che lo fermi. Una volta se questo interruttore è acceso, può andare fino in fondo. D'altra parte, il resto di queste interruzioni, queste sono tutte interruzioni maschilabili di cui hai bisogno un singolo interruttore di interruzione, ma c'è anche un tipo di interruttore globale, se questo interruttore è disattivato, allora non importa se un evento esterno avviene, non importa se è stato abilitato singolarmente, la CPU non risponderà a tali interruzioni, non c'è nulla, non c'è un blocco di blocco da questo switch qui, non c'è un roadblock, se questo è stato abilitato, accade il momento in cui avviene una interruzione non maschilabile esterna, la CPU dovrà risponderti. E così vedremo come questi interruttori, come li controlli e come li manipoli in modo che gli eventi esterni possano portare a un'interruzione in risposta a cui il microcontrollore eseguirà una subroutine di interruzione.
Quindi, ci sono tre aspetti che interrompono il registro delle bandiere, interrompono i singoli possibili di interruzione e un errore globale di interruzione. Per di più, per tutti i, per tutte le interruzioni maschilabili bisogna affrontare tutte queste tre parti. Per l'interruzione non maschilabile, non si deve affrontare questo tipo di interruzione globale, si deve solo affrontare il fatto che l'interruzione non maschilabile dovrebbe generare un evento e poi dovrebbe essere abilitata, poi si raggiungerebbe da qui alla CPU. Quindi ora le interruzioni non maschilabili possono essere generate da diverse fonti.
(Riferimento Slide Time: 25:14)
Può essere generato perché uno degli oscillatori, e si sa che ci sono tre sorgenti oscillanti nel vostro microcontrollore MSP430 se uno qualsiasi dell'oscillatore non sta funzionando come dovrebbe generare una interruzione non maschilabile.
Inoltre, hai dei ricordi di programma; RAM, se stai cercando di leggere o scrivere da località che non sono disponibili sul tuo microcontrollore, porterebbe alla violazione di accesso alla memoria che genererà anche un'interruzione non maschilabile. E il terzo è il pin di interruzione non maschilabile, che come abbiamo accennato in precedenza è in realtà condiviso con il pin RST, RST/NMI. Se si fornisce un segnale ondato, allora potrebbe essere interpretato come un'interruzione non maschilabile. Questo può essere utilizzato anche per generare un'interruzione non maschilabile. Ecco dunque le tre fonti di interruzione non maschilabili.
(Riferimento Slide Time: 25:59) Ecco i dettagli di, ecco i dettagli del pin RST/NMI. Al power - on, quando si attiva, quando si accende la potenza, il pin RST/NMI è configurato come pin di reset e la funzione del pin RST/NMI viene selezionata nel registro di controllo watchdog.
Poi se il pin RST/NMI viene selezionato come funzione di reset, il momento in cui si preme questo interruttore che è in possesso della logica su questo pin a 0, reimposterà il processore e lo terrà in stato di reset finché si terrà questo pin 0, e quando lo si rilascia, lascerà che il microcontrollore esegua il programma per il quale andrà al vettore di reset. Come abbiamo discusso, il vettore di reset è a questo indirizzo e lo farà, da questo indirizzo, troverà l'indirizzo della prima istruzione nella memoria del programma flash e lo eseguirà. Imposterà anche questo flag RSTIFG in modo che tu sappia, qual è la fonte di quel reset.
Se invece questo pin è stato configurato tramite software come NMI, allora un unico bordo selezionato da questo registro genera un interrotto NMI, non maskable e andrà al vettore per interruzione non maschilabile ed eseguire un programma in risposta ad esso