Domanda:
Cosa succede su STM32 quando più interrupt (UART) vengono attivati ​​contemporaneamente? c'è uno stack di interrupt?
user1273684
2016-02-10 03:55:48 UTC
view on stackexchange narkive permalink

Sto implementando uno schema di comunicazione uart daisy-chain con un Cortex M4. Quando un nodo riceve un byte su un UART, viene generato un interrupt ( RXNE ) e il byte viene sovrascritto un altro UART - poiché utilizzo un buffer di invio e ricezione, questo inserisce il byte nel buffer di invio e abilita l'interrupt TXE che dovrebbe essere attivato successivamente.

Questo significa per ogni byte ricevuto, vengono attivati ​​due interrupt.

Ora entrambi gli UART possono ricevere e trasmettere, ed è assolutamente possibile che entrambi gli UART ricevano un byte contemporaneamente - ora entrambi avranno un RXNE interrompe e attiva un interrupt TXE sull'altro UART.

Ma solo un ISR può essere elaborato allo stesso tempo: cosa succede con gli altri?

Esiste uno stack di interrupt che può essere pieno o gli interrupt vengono semplicemente chiamati finché tutti i bit di interrupt corrispondenti non vengono cancellati?

Il fatto è che la mia applicazione tende a bloccarsi nella situazione descritta sopra e (con più byte ricevuti). Tuttavia, non quando gli UART sono impostati su una velocità inferiore (questo sembra controintuitivo) o quando è collegato un solo lato.

Sono sicuro che sia documentato sotto qualcosa come "controller di interruzione" nella scheda tecnica delle parti ..
Tre risposte:
Steve G
2016-02-10 05:34:56 UTC
view on stackexchange narkive permalink

Quello che stai facendo è abbastanza normale e dovrebbe essere possibile farlo funzionare correttamente.

I processori M4 hanno diverse dozzine di sorgenti di interrupt ed è molto comune per 2 o più richieste di interrupt (IRQ ) per diventare attivi allo stesso tempo. Gli IRQ vengono "bloccati" dalla logica di interrupt e il controller di interrupt decide in base alla priorità quale elaborare per primo (vettorializzando al gestore di interrupt). Il 2 ° IRQ è ancora bloccato ed è definito "interruzione in sospeso". In termini semplici, quando un gestore di interrupt ha completato la sua elaborazione, deve eseguire un'istruzione speciale chiamata "return from interrupt" che consente al controller di interrupt di elaborare il successivo IRQ in sospeso.

Anche se a volte si parla di " interrupt stacked "in una situazione come la tua, non sono tenuti su uno" stack "in quanto tale, e quindi non può rimanere senza spazio e perdere IRQ. Generalmente gli IRQ rimangono bloccati finché il bit IRQ corrispondente non viene cancellato dal software.

È difficile sapere esattamente perché il tuo sistema si sta bloccando, potresti dover fornire maggiori dettagli. Un paio di cose da guardare:

  1. Il tuo gestore di interrupt cancella sempre il flag IRQ corrispondente? Se il flag non è deselezionato, il processore può rimanere bloccato in un ciclo che costantemente vettorializza al gestore e non consente ad altre cose di funzionare.

  2. Il tuo gestore di interrupt esce sempre correttamente da eseguire un'istruzione speciale "ritorno da interrupt"? In caso contrario, non consentirà al controller di interrupt di gestire un altro IRQ con lo stesso livello di priorità e sembrerà che il processore non risponda più a questi interrupt.

Cortex M non ha istruzione "ritorno dall'interruzione".I soliti ritorni di chiamata (`bx lr` e` pop pc`) funzionano qui in modalità di interruzione.
Ma tieni presente che sembrano solo usuali, "lr" ha un valore speciale, dato che c'è molto di più che cambiare semplicemente "pc".Rif: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Babefdjc.html
Marko Buršič
2016-02-10 04:06:44 UTC
view on stackexchange narkive permalink

Di solito nel sistema CPU / MCU hai un'impostazione di priorità che interrupt verrà elaborato prima. Quando viene attivato un interrupt, viene inserito nell'elenco delle code. STM32 ha un controller di interrupt vettoriale annidato NVIC, forse dovresti prima leggere un po 'di manuale.

William Brodie-Tyrrell
2016-02-10 07:55:11 UTC
view on stackexchange narkive permalink

Devi leggere su NVIC (Nested Vectored Interrupt Controller) che stm32 usa. Ciò che accade dipenderà da come hai configurato le priorità associate a ciascun interrupt nell'NVIC, dovrai leggere in dettaglio RM0090 (manuale di riferimento STM32F4).

Gli interrupt vengono elaborati nello stack di chiamate proprio come la funzione chiamate. Se un interrupt è nel mezzo dell'esecuzione quando si verifica un interrupt con priorità più alta, il secondo interrupt viene impilato sopra il primo e inizia la sua esecuzione. Quando il secondo interrupt è completato, la CPU torna indietro e termina il primo, quindi torna al thread a livello utente.

Se imposti gli interrupt UART in modo che abbiano la stessa priorità, il il primo chiamato potrà essere completato prima che il secondo inizi l'esecuzione.

Sì, puoi esaurire lo spazio dello stack, ma è lo stack di chiamate non uno stack di interrupt speciale. Nota che la CPU ha due puntatori allo stack e devi stare attento a quale stack ti trovi, perché questo può cambiare in un interrupt.

"stack di chiamate non uno stack di interrupt speciale" è un po 'confuso.Come si nota, gli stack potrebbero essere diversi (il codice normale potrebbe passare a Process stack / PSP, ma il codice di interrupt utilizzerà sempre lo stack Main / MSP).


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...