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:
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.