2015-08-04 31 views
10

Utilizzo AVR-GCC 4.9.2 e vorrei sapere cosa succede se eseguo un ritorno anticipato in un ISR su un AVR?Cosa succede con un "ritorno" prematuro in un ISR?

ISR(USART_RXC_vect) 
{ 
    ... 
    if(idx == BUFSIZE) 
     return; 
    ... 
} 

Intende la return essere tradotto ad un'istruzione reti? O devo includere anch'io uno reti()?

Sto cercando una spiegazione dettagliata di ciò che accade dietro le quinte.

risposta

9

Proprio come
ISR(USART_RXC_vect)
non è letteralmente appena
USART_INTERUPT_VECTOR:
in Assembler,

return;
non è letteralmente appena
ret
o
reti
nell'assemblatore.

Entrambe le istruzioni in C/C++ verranno tradotte in più istruzioni Assembler e in entrambi i casi dipenderanno dal contesto. Il contesto per un ISR(){} è piuttosto un tracciato in questo caso, ma molto probabilmente includerà anche alcuni push e l'archiviazione di SREG. Ma il numero di spinte in pila dipenderà da cosa succede nella funzione.

Così ogni return; deve essere interpretato nel contesto. Alla fine di una subroutine normale che viene incorporata in una subroutine (molte subroutine di uso limitato vengono "allineate" da un compilatore per motivi di efficienza del codice) diventerà un'istruzione ret (dopo aver gestito tutti i POP necessari e altri bassi pulizia di livello). Alla fine di un'interruzione, in pratica, significa "spegni tutto ciò che hai spinto prima (e ripristina anche l'SREG) e poi reti".

Quando si restituisce un tipo che verrà compilato nel trasferimento di quel valore attraverso il sistema della piattaforma, prima di includere l'istruzione ret. Quindi return; è una dichiarazione molto sensibile al contesto che si può assumere sarà interpretata correttamente, a meno che non si facciano cose molto strane. Ma quelle cose strane saranno cose che un buon compilatore (come AVR-GCC) per lo meno avvertirà.

3

Come detto here, i valori di return s in ISR (non nelle sue funzioni secondarie) sono convertiti in reti, quindi questo non è un problema.

+0

[Commento n. 4] (http://www.avrfreaks.net/comment/315442#comment-315442) nel link che hai fornito dice che "passerà sempre all'epilogo della funzione ISR" che sarà gira "' ripulisci tutte le risorse utilizzate dall'ISR, ripristina lo stato della CPU, e alla fine finisci in un RETI in esecuzione '". Se è così, la tua risposta potrebbe essere un po 'fuorviante. –

+0

@Roflo ringrazia. Avevo smesso di leggere dopo il secondo post lì. –