Tutorials - PIC18 by Data Sheet

 

Pagina 54-56

 


Lo stack

Lo stack dei PIC18F è molto più ampio di quello dei PIC16, 31 livelli al posto di 8, e quindi permette maggior  elasticità nella gestione delle chiamate di subroutine ed interrupt, quindi si presta meglio allo sviluppo di programmi con linguaggi ad alto livello come il C, noto consumatore di stack. In effetti è più facile trovare compilatori C per la serie 18 che non per la famiglia 16, anche perchè i primi hanno un set di istruzioni più ampio,  maggior disponibilità di memoria programma (è facile trovarsi con la memoria esaurita implementando una applicazione un più che semplice su un PIC16F), meccanismi di accesso ai registri e alla memoria più efficienti.

 

Quale è la funzione dello stack?

Si tratta di una area di memoria gestita da un meccanismo LIFO (Last In First Out - ultimo arrivato, primo ad uscire) che conserva gli indirizzi del PC durante una chiamata a subroutine o a interrupt.

Esso è strettamente collegato con il meccanismo del Program Counter.

 

Se il PC incontra una istruzione di salto GOTO o BRA, l' indirizzo di destinazione del PC si sposta dall' istruzione successiva a quello indicato dalla istruzione di salto. Il PC abbandona la sequenza che sta svolgendo e passa ad una nuova area di memoria. Lo stack non viene toccato.

Se il PC incontra una istruzione di CALL o RCALL, il meccansimo dei gestione copia l' indirizzo dell' istruzione seguente alla CALL o RCALL nello stack; il valore nel PC viene sostituito con quello dell' indirizzo della subroutine, che viene eseguita. Non appena viene incontrata una istruzione RETURN, il valore salvato nello stack veine copiato nel PC, che "rientra" nel flusso che aveva abbandonato.

La stessa cosa succede nel caso di una chiamata di interrupt.

Essendo il campo di indirizzamento dei 18F a 21 bit, ogni livello di stack è composto di tre elementi :

  • TOSU (Top Of STack Upper) che contiene i bit da 16 a 20

  • TOSH (Top Of Stack High) che contiene i bit da 8 a 15

  • TOSL (Top Of Stack Low) che contiene i primi 8 bit

Chi ha esperienza di programmazione su microprocessori ha utilizzato facilmente lo stack come vettore per scambiare parametri tra diverse routines. Si tratta, però, di sistemi in cui lo stack ha dimensioni notevolmente diverse (uno o più k) oppure può essere creato in una area di memoria con dimensioni variabili e, soprattutto, può essere manipolato accedendo ad ogni suo livello. 
Nei PIC18F lo stack, pur sensibilmente maggiore di quello dei PIC16, non è di dimensioni eccelse, tali da permettere un uso come memoria di scambio dati e, sopratutto, non è neppure un' area di memoria accessibile a piacere. 

Infatti qui è accessibile esclusivamente per quanto riguarda la cima della pila, quello che Microchip chiama il TOS (Top Of  Stack) e basta.

Esistono due istruzioni speciali per maneggiare lo Stack:

  • PUSH, che permette di copiare il Program Counter nel TOS

  • POP scarica il TOS dalla pila.

Esiste anche un registro speciale, STKPTR (STACK Pointer) i cui primi 5 bit (bit4:0) indicano il livello dello stack, mentre altri due bit, STKFUL e STKUNF, sono flag indicatori dell' overflow dello stack.

Nel TOS viene inserito automaticamente l' indirizzo per il rientro da qualsiasi genere di chiamata, sia di subroutine che di interrupt. 

E' quindi possibile inserire nello stack elementi diversi dagli indirizzi di ritorno caricati automaticamente solo con alcune contorsioni. 

Inoltre, va considerato che lo stack contiene gli indirizzi di ritorno di tutti i generi di chiamate, sia di subroutine da CALL e RCALL, sia delle chiamate di interrupt e che un loro disallineamento ha risultati nefasti sul funzionamento del programma. 
Quindi la manipolazione dello stack è una operazione piuttosto delicata : ad esempio, movimentando il TOS bisogna essere sicuri di non venire interrotti da una chiamata di interrupt che piazzerebbe i suoi valori di ritorno proprio nel TOS.
La manipolazione dello stack, potendo accedere solo al top della pila, diventa uno sport molto rischioso per chi non ha sufficiente esperienza, anche se, nelle mani di un programmatore abile diventa un veicolo potente. 
Pertanto si sconsiglia di toccare lo stack se non si è sicuri assolutamente di cosa si stia facendo.

Il rischio è sia quello di scombinare la sequenza dei vettori di rientro, sopratutto se ne sono allocati diversi, sia per la possibilità di mandare lo stack in overflow, cosa possibile date le sue ridotte dimensioni.

In alternativa all' uso dello stack si può usare un' area di uno dei banchi di RAM gestendo uno stack virtuale via software.

Anche il modificare lo stack per effettuare dei salti calcolati, inserendo nel TOS gli elementi dell' indirizzo a cui andare, non è una pratica normale e richiede la massima attenzione per non ritrovarsi nelle condizioni di cui sopra.. 
Detto questo, vediamo maggiori particolari.

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 03/11/10.