Domanda su interrupt
Moderatore:
Paolino
14 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
Buonasera a tutti, dal basso della mia ignoranza volevo chiedere un chiarimento riguardo gli interrupt. In questo periodo sto giocando un po' con una board stm32 nucleo e mi sono imbattuto negli interrupt. Da quello che ho capito (e verificato) al termine della subroutine richiamata dall'interrupt l'esecuzione del programma riprende da dove era stata abbandonata. La mia domanda è se in qualche modo è possibile far sì che al termine della subroutine il programma ricominci dall'inizio invece che da dove si era fermato. Vi ringrazio in anticipo e chiedo scusa per eventuali bestialità scritte. Buonanotte a tutti.
0
voti
Più o meno, in realtà preferirei che il codice ricominciasse dalla linea 1 (o da una determinata funzione) perché (corregetemi se sbaglio) il reset andrebbe ad annullare tutti i settaggi che ho fatto sulle periferiche (per esempio un pin impostato a valore logico alto, oppure un onda quadra in uscita comandata dal timer).
0
voti
Per quanto ne so io, non è possibile: l'interrupt in sè non è fatto per ciò che hai in mente.
Piuttosto, a livello di sistema operativo in generale è possibile gestire entro certi limiti i segnali dell'interrupt e prevedere opportune "routine" di rientro... ma non sono sicuro che il tuo caso disponga di un sistema così "evoluto"'.
Piuttosto, a livello di sistema operativo in generale è possibile gestire entro certi limiti i segnali dell'interrupt e prevedere opportune "routine" di rientro... ma non sono sicuro che il tuo caso disponga di un sistema così "evoluto"'.
-

rugweri
5.948 2 8 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 1366
- Iscritto il: 25 nov 2016, 18:46
2
voti
Con quasi tutti i micro controllori a 8 bit con un po' di assembler è possibile cambiare l'indirizzo di ritorno di un interrupt. Con gli ARM (compresi i Cortex) hanno un sistema di protezione per impedire giochi strani con gli indirizzi di memoria e poi bisogna tenere conto della ottimizzazione del ARM sugli interrupt annidiati.
Tralasciando la fabbilità e una sua implementazione, pensare di fare una cosa del genere è in generale indice di un pessimo codice non mantenibile.
Consiglio se si vuole comunicare da un interrupt un salto di farlo attraverso una segnalazione (con un meccanismo thread safe) al programma principale (quello interrotto) poi sarà il programma principale a leggere la segnalazione e eseguire il salto.
Tralasciando la fabbilità e una sua implementazione, pensare di fare una cosa del genere è in generale indice di un pessimo codice non mantenibile.
Consiglio se si vuole comunicare da un interrupt un salto di farlo attraverso una segnalazione (con un meccanismo thread safe) al programma principale (quello interrotto) poi sarà il programma principale a leggere la segnalazione e eseguire il salto.
0
voti
Ammetto di non aver mai sentito parlare di "thread safe" quindi magari è proprio quello che cercavo e non appena ho mezz'ora libera mi vado ad informare, a questo punto mi chiedo in che modo il microcontrollore gestisce una situazione in cui all'interno della routine di un interrupt viene richiamato un interrupt (anche lo stesso). Esempio banale: un interrupt mi fa entrare in un ciclo che attende l'arrivo di un altro interrupt e così via, a questo punto se la routine degli interrupt non viene mai completata il microcontrollore cosa fa? Continua a memorizzare tutti i punti del codice a cui deve tornare fino a che non esaurisce la memoria e va in crash? Spero di essermi spiegato bene...
1
voti
In verità, l'esecuzione di una routine di interrupt spesso implica il mascheramento di tutti gli altri interrupt (meno un ridotto sottoinsieme "essenziale").
In ogni caso, anche si trovasse un "goto per interrupt", il suo utilizzo sarebbe tutt'altro che consigliabile.
Ribadisco il mio consiglio, che è già stato "rilanciato" da XYZ: verificare cosa il sistema del dispositivo può fare, e muoversi in quella direzione usando segnali, librerie di thread, semafori... ciò che viene messo a disposizione ad "alto livello".
In ogni caso, anche si trovasse un "goto per interrupt", il suo utilizzo sarebbe tutt'altro che consigliabile.
Ribadisco il mio consiglio, che è già stato "rilanciato" da XYZ: verificare cosa il sistema del dispositivo può fare, e muoversi in quella direzione usando segnali, librerie di thread, semafori... ciò che viene messo a disposizione ad "alto livello".
-

rugweri
5.948 2 8 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 1366
- Iscritto il: 25 nov 2016, 18:46
0
voti
E' un termine noto a chiunque si sia occupato di programmazione concorrente:
https://it.wikipedia.org/wiki/Thread_safety
E' fondamentale in tutti i sistemi operativi e anche nei micro controllori più semplici (quelli a 8 bit) bisogna scrivere codice che ne tenga conto (compreso chi programma per ARM) se si usa gli interrupt.
L'implementazione del codice si basa nell'eseguire operazioni atomiche su dati condivisi:
https://it.wikipedia.org/wiki/Transazione_atomica
Come implementarlo è una cosa abbastanza difficile a chi è alle prime armi (di solito implica l'uso di assembler direttamente o indirettamente), consiglio di utilizzare librerie o RTOS per il proprio micro controllore utilizzato.
https://it.wikipedia.org/wiki/Thread_safety
E' fondamentale in tutti i sistemi operativi e anche nei micro controllori più semplici (quelli a 8 bit) bisogna scrivere codice che ne tenga conto (compreso chi programma per ARM) se si usa gli interrupt.
L'implementazione del codice si basa nell'eseguire operazioni atomiche su dati condivisi:
https://it.wikipedia.org/wiki/Transazione_atomica
Come implementarlo è una cosa abbastanza difficile a chi è alle prime armi (di solito implica l'uso di assembler direttamente o indirettamente), consiglio di utilizzare librerie o RTOS per il proprio micro controllore utilizzato.
0
voti
Grazie mille a tutti e 2, mi è rimasto solo un dubbio, ovvero quello che vi avevo chiesto prima:
Zazzu ha scritto:Esempio banale: un interrupt mi fa entrare in un ciclo che attende l'arrivo di un altro interrupt e così via, a questo punto se la routine degli interrupt non viene mai completata il microcontrollore cosa fa? Continua a memorizzare tutti i punti del codice a cui deve tornare fino a che non esaurisce la memoria e va in crash?
0
voti
Zazzu ha scritto:Grazie mille a tutti e 2, mi è rimasto solo un dubbio, ovvero quello che vi avevo chiesto prima
Ti ho già risposto:
rugweri ha scritto:In verità, l'esecuzione di una routine di interrupt spesso implica il mascheramento di tutti gli altri interrupt (meno un ridotto sottoinsieme "essenziale").
E aggiungo che, in particolare, può essere definita una scala di priorità degli interrupt sì che durante l'esecuzione di una certa ISR tutti gli interrupt a priorità più bassa vengano ignorati.
Il mascheramento degli interrupt può essere abilitato in vari modi (se il processore lo consente)... per esempio, nel vecchio Intel 8086 c'era un bit di interrupt enable in un apposito registro.
-

rugweri
5.948 2 8 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 1366
- Iscritto il: 25 nov 2016, 18:46
14 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 12 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

