Progettare in modo sicuro con i microcontrollori (II)

Come progettare con i microcontrollori. La "software trap" e' caratteristica di programmazione usata per catturare stati anomali di esecuzione di un programma. Il principio generale e' di costituire una trappola per il software e reindirizzare il codice di controllo ad un determinato indirizzo, e tornare alla sua normale funzione.

Software Traps

Le "software trap" possono essere posizionate tra i codici dell'utente o dopo le "jump instructions", o possono essere situate negli spazi non utilizzati da una trappola di codici consecutivi. La più conosciuta "code trap" per 80C51 e' "5 bytes instruction", che e':

0x00: NOP
0x00: NOP
0x200000: LJMP SWRST, SWRST is 0x0000

Lo scopo è chiaro. Quando il codice perde il controllo, prima o poi, salterà alla "trap area". Se il codice segue all'LJMP SWRST, salterà cosi' realizzando un reset del software ed il sistema può essere ripristinato in una modalità di normale di lavoro. I due NOP sono utilizzati per sincronizzare il codice con quello di LJMP.

In realtà non e' una trap di 5 bytes, ma di 3 bytes (la prima "trap code" deve essere di 5 bytes) perché la "consecutive trap" e': 0x00 0x00 0x20 0x00 0x00 0x20 0x00 0x00 ..., invece di 0x00 0x00 0x20 0x00 0x00 0x00 0x00 0x20 0x00 0x00.

Esiste un altro metodo con "4 bytes instruction":

0x00: NOP
0x200020: AJMP 0x0020

Nel indirizzo 0x0020, che sta per "trap vector", possiamo mettere AJMP. 0x0020 del 80C51 è un codice di ricambio, disponibile tra il vettore di interrupt T1 (0x001B) e SCON (0x0023). Basta mettere qui tutti e due gestori di T1 e "trap code" (sono utilizzati 4 bytes). Questo approccio e' un po più complesso del primo con il codice aggiunto messo a 0x0020. Il primo requisito per questo approccio e' un byte di meno. In alcune applicazioni critiche un byte può salvare un sistema.

Problemi

Il codice potrebbe perdere il controllo in qualsiasi momento, soprattutto in una routine di servizio all'interrupt. L'80C51 ha due registri, un reset emulato del software non può "pulire" "hardware interrupt flag". C'è una soluzione.

SWRST:  ; The real software reset address
CLR EA  ; To clear EA
SETB F0 ; To setup a software reset flag in the general bit

MOV P0, #0FFH   ; To setup GP0 as High impedence input mode
...
MOV PSW, #00H   ; Clear PSW
...
MOV DPTR, #SWR0 ; A small trick here!
PUSHDPL
PUSHDPH
RETI    ; clear high level registers, but the code is actually running to next byte
SWR0:   CLR A
PUSHACC
PUSHACC
RETI    ; Clear low level interrupt register and jump to 0x0000

Commenti:

  1. La EA dovrebbe essere disattivata per assicurarsi che l'intero processo è completato
  2. RETI e' l'unico "instruction" per pulire "interrupt enable register"
  3. PUSHACC e RETI sono codici alternativi per LJMP 0000H.
  4. Anche se il codice non ha attivato i registri interrupt, funziona lo stesso.
  5. F0 o qualsiasi altra generica locazione RAM può essere utilizzato per il reset ed il successivo giudizio di ripresa per ulteriori software di elaborazione.
  6. Non e' richiesto nessun cambiamento dello stato, non è necessario hardware.

 



Progettare in modo sicuro con i microcontrollori (I)

Progettare in modo sicuro con i microcontrollori (III)

Re-post del: 08-08-2008

Scarica subito una copia gratis
Tags:

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend