Return Address Stack
I PIC18 hanno uno stack a 31 livelli invece di 8 ed hanno un controllo di
overflow sulla manipolazione dello stack. Due istruzioni, PUSH e POP, servono
a questo scopo.
Lo stack dei PIC16 è uno buffer circolare: push oltre l' ottavo livello
sovrascrivono il primo livello e così via.
Lo stack dei PIC18 è un buffer lineare e le condizioni di opearzioni oltre il
livello 31 e al di sotto del livello 0 possono essere monitorate con due bit
contenuti in un registro STCKPTR. A questi bit può essere associata una
chiamata a RESET per correggere o segnalare la situazione anomala.
Al POR lo stack è posizionato a 0, i bit di overflow sono azzerati e l'
abilitazione del reset per overflow è inattiva. Quindi, se queste funzioni
ausiliarie non sono richieste, la compatibilità con i mid-range è
assicurata, con l' aggiunta di una profondità di stack maggiore.
Se si intendono utilizzare funzioni di accesso allo stack o abilitare la
funzione di allarme, occorre consultare le relative pagine del foglio dati.
Da notare che, a fronte delle svariate possibilità di RESET presenti negli
enhanced, è facilmente implementabile una gestione dell' evento che
discrimini le varie cause e permetta di prendere le opportune misure.
Azione
Se si ritiene possibile l' overflow dello stack, implementare il
meccanismo di emergenza e la relativa analisi delle cause del reset. |
Fast Register Stack
Se nei mid range alla chiamata di interrupt corrispondeva tipicamente la
ruotine di salvataggio dei registri indispensabili e quindi il restore prima
del rientro, nei PIC18 il Costruttore ha implementato un automatismo che
effettua questa operazione in modo interamente trasparente per il
programmatore, senza aggiunta di tempo di esecuzione e senza richiedere
impegno di registri RAM.
Questa funzione prende il nome di Fast Register Stack.
Ad ogni chiamata a interrupt, WREG, STATUS e BSR sono automaticamente
salvati in tre registri speciali, non accessibili. Con l' istruzione RETFIE
FAST, il contenuto dei registri è ripristinato.
Va notato che, se il salvataggio avviene automaticamente, il recupero è
effettuato solo con l' aggiunta del FAST.
Questo permette di mantenere, volendo, la stessa struttura di salvataggio
manuale implementata nei PIC16, senza modifiche se non quella di introdurre
BSR (se usato) nel set dei registri salvati.
Ovviamente la manovra più efficace è quella di abolire le routine o le
macro di push e pull dei registri all' ingersso/uscita dell' interrupt e
sfruttare questa funzione FAST.
Questo porta immediati benefici per quanto riguarda la velocità di esecuzione
e la lunghezza del sorgente.
Maggior cura deve essere posta se si utilizzano i due livelli di priorità.
In tal caso sarà opportuno riservare il FAST alla priorità superiore, dato
che il salvataggio dei registri in modo automatico avviene ad ogni chiamata di
interrupt e l' alta priorità può interrompere una interruzione a bassa
priorità, sovrascrivendone così i registri salvati.
Inoltre FAST può essere usato anche per chiamate di subroitine con l'
istruzione CALL, inserndo una riga del genere:
CALL subroutine, FAST
che dovrà essere chiusa da:
RETURN FAST
Anche qui, l' aggiunta del FAST rende
l' operazione a discrezione del programmatore.
Azione
Ove possibile, eliminare il salvataggio manuale ed utilizzare il
Fast Return Stack
|
Se si utilizza questa funzione, bisogna avere ben presente che i
registri di salvataggio sono unici ed ogni chiamata FAST sovrascrive
il contenuto. Per cui una azione logica potrà essere questa:
- se non si utilizza interrupt, FAST può essere usato senza
problemi per le CALL
- se si utilizza interrupt, FAST nelle CALL diventa molto
critico ed è sconsigliato
- se si utilizza interrupt a due priorità, FAST va riservato
per la priorità maggiore, inserendo dove necessario un
salvataggio manuale per la priorità a basso livello.
|
|