Ancora sulle variabili...

In fase di sviluppo Stesura preliminare In fase di sviluppo

In questa pagina sono mostrati alcuni usi avanzati della memoria.

Stack software

Prima di iniziare, assicuratevi di conoscere i contenuti di questa pagina: Cosa è uno stack?

A differenza di altri processori, il PIC18 non possiede uno stack dedicato per la memorizzazione di generiche variabili. Possiede invece uno stack hardware, usato esclusivamente per gli indirizzi.

Per realizzare il cosiddetto stack software il PIC18 utilizza uno dei tre registri FSR, in genere il numero 1. Se usato in questo modo è spesso chiamato stack pointer (puntatore -alla cima- dello stack, come con altri processori) in quanto punta alla prima cella libera dello stack, partendo dall'alto.

Innanzitutto occorre riservare alcune celle di memoria RAM per uso esclusivo dello stack. La soluzione più semplice è utilizzare un intero banco (256 byte) anche se ovviamente è possibile dedicare meno spazio (nota 1). Occorre:

Il codice sorgente completo è scaricabile a fondo pagina. Si consiglia vivamente di simularlo con attenzione, modificando il numero e l'ordine delle variabili salvate nello stack.

Variabili inizializzate

Le variabili sono memorizzate nella memoria volatile e quindi all'accensione contengono un valore casuale. Per poter usare variabili con un valore iniziale Microchip ha scelto una strada un po' complessa e soprattutto non documentata, almeno nella versione attuale

Variabili inizializzate

Nell'insieme tale procedura è piuttosto complessa, ma disponendo del codice opportuno non è necessario conoscere i dettagli di seguito descritti; è sufficiente:

La struttura della tabella dei valori iniziali

La struttura della tabella che contiene i dati iniziali e la procedura sono piuttosto complesse, ma non è necessario conoscerle neppure superficialmente se si usa il codice descritto nel precedente paragrafo. La lettura di questo paragrafo è quindi riservato ai curiosi e agli appassionati di enigmistica...

Quanto mostrato è relativo all'esempio sopra riportato, costituito da una sezione idata_acs ed una sezione idata. Il linker ha scelto di riservare lo spazio alle variabili rispettivamente a partire dall'indirizzo 0x000 e 0xF22

Nella memoria FLASH sono presenti due o più tabelle. Quella qui riportata a sinistra descrive gli indirizzi di tutte le variabili ed inizia a partire dall'indirizzo _cinit, in questo caso pari a 0x0006 (nota 2)

Tabella 1  Tabella 2

Nell'ordine possiamo leggere nella tabella di sinistra (i colori giallo e azzurro identificano rispettivamente le sezioni idata_sample e idata_sample_ACS dell'esempio):

Nella tabella di destra, a partire dall'indirizzo 0x0084 possiamo leggere i codici ASCII corrispondente alla stringa "Hello World": 0x48 0x65 0x6C... 0x64  (nota 4)

Sempre nella tabella di destra, a partire dall'indirizzo dispari 0x008F possiamo leggere la variabile a 16 bit 0x1234, la variabile a 8 bit 0x08 e la stringa "abcdefgh" (0x61 0x62... 0x68)

Il codice della subroutine init_data sposta:

Il suo esame è lasciato come esercizio...

Note

  1. Creare stack di dimensioni maggiori è invece cosa più complessa, inefficiente e tutto sommato inutile
  2. Microchip non documenta la struttura della tabella e quanto qui descritto è frutto di reverse engineering
  3. Le stringhe vengono spesso create inserendo alla fine il carattere NULL (0x00), secondo la convenzione del linguaggio C. Per esempio:
    hello db "Hello World\0"
  4. Le coppie di byte di ciascuna cella sono scritti con notazione little endian, e quindi vanno "scambiati"

Codice

 

Data di creazione di questa pagina: luglio 2017
Ultima modifica: 2 agosto 2017


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima