Newsgroup: it.hobby.elettronica.digitale
Titolo: [pic] wake up from interrupt

dal datasheet del pic18f2620
"On all exits from Idle or Sleep modes by interrupt, code
execution branches to the interrupt vector if the GIE/
GIEH bit (INTCON<7>) is set."
quindi se mando in sleep il micro da dentro una isr c'ï¿œ rischio di 
rientranza?
-ice-

 rientranza?
In genere una volta entrati nell'interrupt la prima cosa da fare � azzerare 
il flag corrispondente.
Alcuni compilatori come il CCS infatti lo fanno in automatico.
La rientranza � un'altra cosa, cio� iniziare a eseguire una funzione ed 
essere interrotti ed eseguire la medesima funzione.
Molti compilatori (anche il citato CCS) se rilevano rientranza disabilitano 
gli interrupt prima della chiamata nel main e mandano un warning
Ciao
CG 

 essere interrotti ed eseguire la medesima funzione.
appunto :)
la isr ï¿œ una funzione (speciale ma sempre funzione ï¿œ)
- sono in una isr qualsiasi (quindi flag della stessa giï¿œ disabilitato)
- mando in sleep il micro
- un irq sveglia il micro
- sfortunatamente l'int che ha svegliato il micro ï¿œ proprio quello la 
cui isr aveva eseguito la sleep
- viene richiamata la isr "incriminata"
per me ï¿œ un caso di rientranza... o sbaglio a ragionare da qualche parte?
-ice-

 per me � un caso di rientranza... o sbaglio a ragionare da qualche parte?
Non ho capito dove pensi di rientrare. E' una pratica comune quella di 
svegliarsi dall'interrupt e dopo qualche linea tornarci. Negli altri casi, 
visto che non � specificato di tornare in sleep, l'esecuzione torner� al 
main al punto dove era scattato il primo interrupt. Un esempio potrebbe 
essere svegliare il micro ogni tot, azzerare lo watchdog e tornare a 
dormire.
E' una pratica comune ma a me non piace. Di solito organizzo i programmi un 
capello pi� seri in modo che la sleep venga chiamata solo dal main, e gli 
interrupt accodino soltanto delle richieste. In questo modo, quando la mia 
coda � vuota sto in sleep. Quando l'interrupt sveglia il micro e accoda una 
richiesta, il tutto si sveglier�, verr� eseguita l'operazione ed il micro 
torner� a nanna.
Ciao
CG 

 rientranza?
Non conosco i PIC, ma normalmente in una ISR il GIE viene automaticamente
disabilitato quando entri e riabilitato quando esci. Quindi a meno che non
lo riarmi tu manualmente (che � male), se vai in sleep dentro a una ISR
immagino che ti risveglierai sull'istruzione successiva alla sleep, senza
che sia fatto nessun ulteriore branch.
-- 
emboliaschizoide.splinder.com


Mi sa che va interpretato in un altro modo.
"exit from Idle or Sleep" vuol dire risvegliarsi. Se ti risvegli perchï¿œ 
ï¿œ arrivato un interrupt mi sembra abbastanza logico che la prima cosa da 
fare sia saltare alla isr, se GIE/GIEH ï¿œ abilitato.
Ciao
Pasu

 capello piï¿œ seri in modo che la sleep venga chiamata solo dal main
in genere io faccio fare tutto al main()
nelle isr setto solo dei flag che dicono al main cosa fare e cosa non fare
-ice-

 fare sia saltare alla isr, se GIE/GIEH ï¿œ abilitato.
esatto... se il gie ï¿œ settato si salta alla isr e si va in rientranza se 
era stata questa isr a mandare in sleep il micro;
perï¿œ se disabilito (come quasi sempre si fa) il gie allora il micro si 
sveglia ma non sa cosa lo ha svegliato dato che gie=0 e quindi non si 
intraprende il branch
-ice-

 intraprende il branch
Non ï¿œ vero che non sa cosa l'ha svegliato, i flag di interrupt delle 
varie periferiche vengono sempre settati...
P.

 che sia fatto nessun ulteriore branch.
Esattamente, tranne per il fatto che nella famiglia 18 c'� anche la 
possibilit� di suddividere le periferiche in alta e bassa priorit�. Se 
vai in Sleep in un interrupt a bassa priorit� e ti risvegli con un 
interrupt ad alta priorit�, l'esecuzione salter� all'isr di 
quest'ultimo. Questo perch� l'isr ad alta priorit� pu� interrompere 
l'altra, ma non viceversa.
� forse questo che perplime l'OP?
P.

 rientranza
Non � una rientranza. Semplicemente istr4 e istr5 non le esegui mai. Se 
queste sono obbligatorie per poter tornare prima o poi al main allora sono 
cacchi amari, devi rivedere il programma
una rientranza � questa:
void main () {
    ...
   funzione_rientrante();
    ...
}
int_ext () {
    ...
    funzione_rientrante();
    ...
}
void funzione_rientrante (void) {
    ...
    ...
    ...
    ...
    ...
}
se arriva l'int_ext mentre si � nel main a eseguire la funzione rientrante, 
in teoria PC torna alla prima linea e riparte con l'esecuzione. Quando per� 
poi torna al main nelle variabili della funzione ci sono quelle utilizzate 
dalla int_ext e 99 volte su 100 sono diverse :)  Nessun compilatore ti 
permetter� mai di avere un codice rientrante, a meno che non lo freghi in 
qualche modo (wrapper, puntatori a funzione), ma � una porcheria!
Ciao
CG

 sarei curioso per quale motivo devi organizzare cos� una funzione :)
Io non riesco ad immaginarlo. Il primo comandamento del software embedded �
che gli interrupt devono essere serviti pi� rapidamente possibile. Mettere
il processore in sleep in una ISR mi sembra una bestemmia.

 rientranza
Guarda che non ï¿œ il compilatore che disabilita GIE...
P.

Ahem...
reti -> retfie

 quindi nessuna rientranza.
cinque righe, detto tutto.
saluti
-- 
  lowcost

 qualche modo
dichiarando #inline la funzione rientrante?
-ice-

 Guarda che non ï¿œ il compilatore che disabilita GIE...
bhe diciamo che ci mette del suo :)
nel senso che traduce la chiamata e il rientro da interreput con le 
istruzioni che in automatico gestiscono il GIE bit
non ï¿œ una buona pratica ma se a mano riabilito, per qualche motivo, il 
GIE dentro la ISR posso far si che la ISR venga interrotta... ovvio mi 
prendo la responsabilitï¿œ dei registri
in fondo se sono in una low_priority isr e scatta un int prioritario la 
gestione dei registri vitali tocca cmq farla nella isr a bassa prioriï¿œ;
altrimenti come minimo lo stack viene riscritto dalla isr a prioritï¿œ alta
ciao!!!
-ice-

 dichiarando #inline la funzione rientrante?
Non prenderti gioco degli anziani che, gi� alla tua et�, ne sapevano di pi�
di te. Finirai assai peggio di loro.

 bhe
Una parola dice pi� di cinque righe.
Hai voglia ad aver fiducia nei giovani...

 altrimenti come minimo lo stack viene riscritto dalla isr a priorit� alta
Forse diventerai un grande, riscriverai le tavole.
Cos�, a naso, mi sembri, al momento, un gondone. Bucato.

 di te. Finirai assai peggio di loro.
(ti rispondo qui anche per le altre risposte recenti che hai dato e che 
non mi sembrano affatto attinenti a quello di cui si parla... se non lo 
trovi interessante o ritieni di essere superiore, e potrebbe essere, a 
queste domande inutili/stupide basta semplicemente non rispondere)
non sto prendendo in giro gli "anziani"... e poi che ne sai tu di quanti 
anni ho
se la routine che viene chiamata sia dal main sia dalla isr la duplico 
(certo, sprecando ROM) il compilatore non segnala piï¿œ la rientranza... 
dato che non c'ï¿œ piï¿œ!
sinceramente a me non basta che il compilatore non segnali una warning 
per essere a posto, prima voglio capire bene quello che c'ï¿œ scritto sul 
datasheet e perchï¿œ
ciao
-ice-

 dichiarando #inline la funzione rientrante?
La #inline si usa per risparmiare un livello di stack e qualche istruzione 
di salvataggio/ritorno da subroutine. A questo punto ha molto pi� senso 
velocizzarla magari scrivendola in asm oppure sistemando il codice!
Se la usi con funzioni che lavorano con variabili globali ne subirai le 
conseguenze, e saranno problemi difficili da trovare perch� non ci sar� 
nessuno a spararti una access violation.
Per cui, penso tu abbia capito che il modo di incastrare i firmware c'� 
eccome, ed � estremamente pi� facile che incastrare un processo che gira 
sopra a un sistema operativo. Si tratta di programmare con criterio.
Ciao
CG 

 sopra a un sistema operativo. Si tratta di programmare con criterio.
si e grazie per essere intervenuto
ciao!
-ice-