Tutorials - PIC18

 

Passare da PIC16 a PIC18

 


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.

 

 

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 05/06/19.