Salve a tutti,
avrei bisogno di una informazione.
Sto studiando il comportamento del micro di Arduino Uno,l'ATMEGA 328P.
Ho visto che è presente una tabella di Interrupt con le varie opzioni di abilitazioni locali
e globali.
Ho notato che con AttachInterrupt è possibile andare a definire un driver che parte
ad ogni cambio di stato di un determinato Pin.
Ma se volessi chiamare una qualsiasi interrupt definita da me,via software per esempio
con un'istruzione del tipo INT $0x.. un pò come si fa con i PC?
E' possibile?
In un computer gli interrupt sono routine che gestiscono cose anche non vitali.
Ad esempio, sui vecchi x86 mi ricordo che si usava la chiamata all'interrupt $21 per l'accesso al disco.
Su un micro tale routine si può assimilare ad una normale sub-routine, non vedo corretto chiamarla "interrupt".
Un interrupt è una routine chiamata dal micro per un evento che si scatena in determinate condizioni: il cambio di stato di un pin (PCI); un interrupt invocato per un overflow di un contatore (TIMER_OVF); l'arrivo di un segnale su un determinato pin legato ad uno degli interrupt dell'Atmega (INT) ecc...
In realtà vorrei evitare,se possibile, l'utilizzo di librerie esterne a ciò che scrivo io.
Semplicemente perchè devo fare la tesi (avevo postato un paio di mesi fa ) e dunque
anche (e sopratutto)il codice di basso livello lo vorrei scrivere da solo.
L'operazione che devo svolgere deve essere atomicama oltre che atomica deve essere
non interrompibile.
In particolare mi piacerebbe decisamente usare una vera e propria primitiva richiamata via software
in assembly, dunque dovrei andare prima ad aggiungere questa nella tabella delle interrupt
e poi richiamarla via software.
Credo che sia possibile la prima,ma richiamavarla via software con INT $0x.. non so se sia possibile.
A pagina 79 nel datasheet del ATmega168 c'è scritto questo:
The External Interrupts are triggered by the INT0 and INT1 pins or any of the PCINT23..0 pins.
Observe that, if enabled, the interrupts will trigger even if the INT0 and INT1 or PCINT23..0 pins
are configured as outputs. This feature provides a way of generating a software interrupt.
Vedi se pui approfondire, perchè io non sono sicuro aver capito.
Il problema che i vettori sono predefiniti e aggiungere un nuovo vettore software non credo si possa fare. Se c'è modo di scatenare un interrupt hardware via software allora potresti creare un registro un vettore e tutto ciò che serve per gestire degli interrupt software, ma questo lo devi creare tu ed il micro non ti fornisce alcuno aiuto.
L'argomento è interessante, mi piacerebbe leggere la tesi.
Codice atomico vuol dire appunto non interrompibile.
Scrivere tutto te, lo puoi fare: in pratica ti devi riscrivere la libreria avr di gestisce interrupt. Non so se sia una cosa pratica. Fattibile senz'altro ma non so quanto pratica.
Per l'inserimento di un vettore di interrupt nella tabella del micro ho gli stessi dubbi di Mauro, perché il datasheet non mi pare specifichi che ci possa fare. Inoltre so che, a seconda di come sono settati i fuse, il micro al reset va a copiare la tabella dei vettori di interrupt in zone differenti della memoria: ecco perché si usano delle costanti al posto dei valori assoluti.
Se comunque crei una subroutine atomica, hai all'incirca le funzioni di un interrupt, ossia codice che viene eseguito prioritariamente e che non è interrotto da altri interrupt.
Poi qui mi fermo perché non so dove vuoi arrivare e cosa vuoi fare
La tesi è l'implementazione della multiprogrammazione in un sistema come Arduino.
Ossia gestione dei processi,commutazione di contesto, coda pronti ,coda bloccati,semafori.
Ovviamente data la scarsità di memoria al massimo potranno esserci 3/4 processi.
Tutto è in fase embrionale,mi sto studiando il micro per capire come e dove appoggiarmi.
Le interrupt sono una cosa fondamentale per l'implementazione di questo 'nucleo'.
ciao, per Leo.... interrupt x86 INTEL per Hard disk via software 76 via hardware IRQ 14, non conosco il micro ma bisognerebbe accedere al registo dei flag di stato e li mascherare il bit che ti serve per inibire gli interrupt almeno quelli mascherabili, per quelli non mascherabili serve un apriscatole.
Volevo aggiungere che i processi non sono schedulati per tempo,ma per priorità che sarà un numero intero,
deciso dall'utente.
DOMANDA:
Nell'ATMEGA 328P c'è una distinsione fra modo utente e modo sistema?
Ossia dagli sketch "normali" posso fare quello che mi pare ,od ho bisogno appunto di passare
in modo sistema grazie ad un interrupt ?
Elenca mini RTOS che, specifici oppure no, girano anche su Arduino.
Mi hai tolto la parola dalla tastiera (bocca).
secondo me agisci suli registri disattivando tutti gli interrupt
con sei() e cli() abiliti e disabiliti globalmente gli interrupt, ma nell doc di avr-libc mi pare consiglino di usare altre macro per proteggere
porzioni di codice non interrompibile.
Mi interessa molto capire se ho interpretato bene ciò che c'è scritto nel datasheet, cioè posso impostare il PD2 come output e abilitare l'interrupt su questo pin, e poi per saltare alla routine mi basta impostare il PD2 alto o basso a seconda di come è impostato. La stessa cosa con i PINCHANGED, cioè ogni volta che vogli saltare alla routine, da software mi basta cambiare lo stato di un pin.
Se ho capito bene allora la cosa è fattibile giocandosi però un pin.
Mi interessa molto capire se ho interpretato bene ciò che c'è scritto nel datasheet, cioè posso impostare il PD2 come output e abilitare l'interrupt su questo pin, e poi per saltare alla routine mi basta impostare il PD2 alto o basso a seconda di come è impostato. La stessa cosa con i PINCHANGED, cioè ogni volta che vogli saltare alla routine, da software mi basta cambiare lo stato di un pin.
Se ho capito bene allora la cosa è fattibile giocandosi però un pin.
No, anche se i pin sono settati come output, gli interrupt funzionano con segnali in INGRESSO, ossia tu puoi avere il pin settato come output ma nel contempo avere un segnale su quel pin in ingresso.
leo72:
No, anche se i pin sono settati come output, gli interrupt funzionano con segnali in INGRESSO, ossia tu puoi avere il pin settato come output ma nel contempo avere un segnale su quel pin in ingresso.
Quindi dovrei far partire un filo,da un pin a quello in questione e comandare così le interrupt?
Mmm.. non mi piace molto questo modo di fare
DOMANDA:
Nell'ATMEGA 328P c'è una distinsione fra modo utente e modo sistema?
Ossia dagli sketch "normali" posso fare quello che mi pare ,od ho bisogno appunto di passare
in modo sistema grazie ad un interrupt ?
Cioè dici protect mode e NON protect mode, non no c'è e quindi no kernel space, questa è prerogativa dei microprocessori.
Poi non c'è MPIC (masquerable ecc..) ci sarà su ARDUINO 2 che monta un ARM cortex C3.
Non c'è DMAC.
Insomma è microcontrollere non un microprocessore.
Almeno da quello che si capisce tutte sono uscite ma devono essere programmate come ingressi e quando sono programmati come ingressi interagiscono anche come interrupt il pin che si sceglie è solo la priorità o codice dell'interrupt.....
Si il 21 è la chiamata in DOS non da BIOS o harddware ma è stato cambiato nel corso degli anni