Tutorials - PIC18 by Data Sheet

 

Pagina 54-56

 


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.