STKPTR
Il registro STKPTR (STacK PoinTeR) contiene 7 bit utili
OSCTUNE |
bit |
STKFUL |
STKUNF |
- |
SP4 |
SP3 |
SP2 |
SP1 |
SP0 |
funzione |
R/W |
R/W |
0 |
R/W |
R/W |
R/W |
R/W |
R/W |
-
bit 7 STKFUL:
Stack Full Flag
1 = overflow da stack troppo pieno
0 = no overflow
-
bit 6 STKUNF:
Stack Underflow Flag
1 = underflow da stack troppo svuotato
0 = no underflow
-
bit 5 non utlizzato
- se letto, riporta 0
-
bit 4-0 SP4:0
Contatore dello stack pointer
I bit 7 e 6 sono azzerati da un Power On Reset (POR) o dall'
utente
I progettisti
di Microchip hanno previsto la possibilità di due eventi disastrosi per lo
stack: l' eccessivo riempimento e l' eccessivo svuotamento Qui entrano in
gioco i due flag di STKPTR
-
STKFUL viene settato quando si supera la capacità dello
stack,
ovvero si sta cercando di inserire qualcosa oltre il trentunesimo livello :
in questo caso l'
indirizzo da salvare viene scartato e il flag STKFUL va a 1. Si tratta di una situazione anomala, in
quanto, mancando un vettore di ritorno, il flusso del programma sarà gravemente
alterato, con conseguenze imprevedibili.
-
STKUNF viene settato quando ci si
trova ad avere una richiesta di indirizzo di rientro, ma lo stack è vuoto : in
tal caso sarà passato come indirizzo di ritorno 0x00, ovvero il vettore di
reset.
Anche a questo proposito, va osservato che una simile condizione è anomala e
può dipendere solo da un uso sbagliato di POP o da un guasto hardware del
processore; il ritorno al punto di ingresso del reset è l' unica cosa
possibile da fare, alternativa solo all' arresto completo del processore.
Un disallineamento dello stack è un problema grave, ma anche per
questa situazione i progettisti di Microchip hanno
provveduto ad installare un paracadute: si tratta del bit STVREN, che si trova
in un registro di configurazione.
Una volta settato STVREN , nel momento in cui STKFUL o STKUNF vanno a 1,
viene generato un reset, spingendo il PC all' indirizzo del vettore di RESET,
in modo da riportare il programma a partire da 0x00.
Il reset completo
del PIC è una risorsa estrema, ma d' altronde non si vede quale altra soluzione
possa essere posta in atto per correggere un problema così grave come un
problema allo stack.
NOTA:
Un reset da
arrivo della tensione (Power On Reset) e un reset generato da altre
cause possono avere effetti diversi sui
registri speciali e le periferiche.
Inoltre, la
possibilità dei PIC enhanced di generare Reset per diverse cause,
compresa una istruzione, può portare a situazioni
anomale e, comunque, richiede che si sviluppino degli
interventi diversi dalle inizializzazioni del POR.
Quando si
faccia uso di diverse sorgenti di RESET, si
richiede una gestione dell' evento
che permetta di
discriminarne la causa e possa operare le necessarie azioni.
Nei PIC18F è possibile determinare la causa che ha
prodotto il reset in modo molto semplice, per cui è facile istituire all' inizio del programma una gestione
di queste cause ed una segnalazione diagnostica relativa, avendo così
immediatamente chiara la ragione del riavvio spontaneo del sistema. Questa
funzione è dettagliata meglio nella parte che riguarda il Reset.
|
Come detto, però, una situazione di totale sballo dello stack si verifica
solamente a seguito di una programmazione altrettanto sballata (o di un errore
interno dell' hardware del PIC). Quindi si tratta di casi del tutto anomali
(almeno il secondo....), in quanto se durante la compilazione di un sorgente C
il compilatore verifica una carenza di risorse segnala la situazione prima di
creare l' oggetto eseguibile.
|
|
Copyright © afg. Tutti i diritti riservati.
Aggiornato il 03/11/10.
|