2010-01-11 19 views
8

Sono nuovo nella programmazione di sistemi embedded. Sto lavorando su un dispositivo che utilizza un chipset 8051. Ho notato nei programmi di esempio che quando si definiscono le variabili, a volte usano la parola chiave xdata. in questo modo ...Quando uso xdata?

statico senza segno carattere xData PatternSize;

mentre altre volte la parola chiave xdata viene omessa.

La mia comprensione è che la parola chiave xdata indica al compilatore che quella variabile deve essere memorizzata in memoria esterna, flash, memoria.

In quali casi è necessario memorizzare le variabili esternamente con xdata? L'accesso a queste variabili richiede più tempo, giusto? I valori memorizzati usando xdata non rimangono dopo un hard reset del dispositivo, vero?

Inoltre, ho capito che la parola chiave static indica che la variabile persisterà attraverso ogni chiamata alla funzione in cui è definita. Do static e xdata devono essere usati insieme?

+0

Che compilatore stai usando – Gerhard

risposta

6

L'architettura 8051 ha tre spazi di indirizzi separati, la RAM di base utilizza un indirizzo a 8 bit, quindi può essere fino a 256 byte, XDATA è uno spazio di indirizzi a 16 bit (64 KByte) con capacità di lettura/scrittura e lo spazio del programma è uno spazio di indirizzi a 16 bit con capacità di esecuzione e sola lettura dei dati.A causa della sua gamma di indirizzi ridotta e dell'accoppiamento ravvicinato al core, l'indirizzamento della RAM centrale è più efficiente in termini di spazio di codice e cicli di accesso

Il core 8051 originale aveva RAM minuscola su chip (uno spazio di indirizzamento di 256 byte ma alcune varianti ne avevano la metà nella memoria reale) e XDATA si riferiva alla memoria dei dati fuori dal chip (al contrario della memoria del programma). Tuttavia, i dispositivi di architettura 8051 più moderni dispongono di XDATA su chip e memoria di programma.

Quindi è possibile utilizzare la memoria di base quando le prestazioni sono critiche e XDATA per oggetti di memoria più grandi. Tuttavia il compilatore dovrebbe, nella maggior parte dei casi, prendere questa decisione per te (controlla il manuale del tuo compilatore, descriverà in dettaglio come viene allocata la memoria). Il set di istruzioni rende efficiente implementare lo stack nella memoria di base, mentre i dati statici e allocati dinamicamente di solito sono allocati in modo più ragionevole in XDATA. Se il compilatore ha una parola chiave XDATA, allora sovrascriverà la strategia del compilatore e dovrebbe essere usata solo quando la strategia del compilatore fallisce in qualche modo poiché ridurrebbe la portabilità del codice.

[modifica] Si noti inoltre che il nucleo di memoria comprende una regione di bit indirizzabile 32byte, le operazioni di bit di indirizzamento utilizzano un indirizzo 8bit in questa regione per accedere direttamente singoli bit. La regione esiste all'interno della memoria principale indirizzabile a 256 byte, quindi è sia bit che byte indirizzabile [/ edit]

1

Come e quando utilizzare l'area di memoria xData dipende dall'architettura di sistema. Alcuni sistemi potrebbero avere RAM a questo indirizzo, mentre altri potrebbero avere ROM o Flash. In entrambi i casi, l'accesso sarà più lento dell'accesso a RAM, ROM o Flash interne.

In generale, gli articoli di grandi dimensioni, gli articoli costanti e gli articoli meno utilizzati devono essere inseriti in xData. Non ci sono regole standard su ciò che accade in xData, in quanto dipende dall'architettura.

+0

In modo rigoroso, xdata cambia solo la generazione del codice per emettere le istruzioni che colpiscono lo spazio dati a 16 bit. Che si tratti di RAM, ROM o (NOR) flash non è qualcosa di cui il compilatore si preoccupa; ovviamente diversi dispositivi possono avere uno spazio di indirizzi misto, ma sono tutti "xdata" di memoria. –

1

L'8051 ha un intervallo di 128 byte di "pseudo-registri" di blocchi da scrittura che (la maggior parte) i compilatori utilizzano come predefiniti per le variabili dichiarate. Ma ovviamente quest'area è molto piccola e si vuole essere in grado di inserire anche variabili nello spazio di indirizzamento della memoria a 16 bit. Questo è ciò che lo specifier xdata (cioè "dati esterni") è per. Cosa mettere da dove dipende, ovviamente, su quali sono i dati e come prevedi di usarli.

Fondamentalmente, penso che questa sia la domanda sbagliata. Devi capire la tua architettura della CPU prima di imparare a usare le caratteristiche specifiche dell'8051 del compilatore C.

5

xdata dice al compilatore che i dati sono memorizzati nella RAM esterna in modo da deve utilizzare un'istruzione diversa per leggere e scrivere quella memoria invece della RAM interna.

L'accesso ai dati esterni richiede più tempo. Di solito inserisco le variabili di interrupt nella RAM interna e nella maggior parte degli array di grandi dimensioni nella RAM esterna.

Per quanto riguarda lo stato della RAM esterna dopo un hard reset (non ciclo di alimentazione): Ciò dipende dalla configurazione dell'hardware. Una linea di reset va al chip esterno? Anche alcuni chip sono dotati di XDATA nel chip della CPU. Leggi di nuovo. Alcuni chip hanno una CPU 8051, più una certa quantità di XDATA all'interno della IC.

statico e xdata non si sovrappongono. Statico dice al compilatore come allocare una variabile (su una pila o in una posizione di memoria). Xdata dice al compilatore come arrivare a quella variabile. Statico può anche limitare lo spazio dei nomi di quella variabile solo a quel file. Si può avere una variabile statica xdata che è locale al solo una funzione, e hanno una variabile statica che è locale a una funzione, ma utilizza RAM interna.

2

Un punto importante non ancora menzionato è che poiché le istruzioni vengono utilizzate per accedere a diverse aree di memoria, l'hardware non ha unificato concetto di un "puntatore". Qualsiasi indirizzo noto nello spazio DATA/IDATA può essere identificato in modo univoco con un puntatore a un byte; allo stesso modo qualsiasi indirizzo noto nello spazio PDATA. Qualsiasi indirizzo noto nello spazio CODICE può essere identificato con un puntatore a due byte; allo stesso modo qualsiasi indirizzo noto nello spazio XDATA. In molti casi, tuttavia, una routine come memcpy non saprà in anticipo quale spazio di memoria dovrebbe essere utilizzato con i puntatori passati. Per ovviare a ciò, i compilatori 8x51 generalmente usano un tipo di puntatore a tre byte che può essere usato per accedere alle cose in qualsiasi spazio di memoria (un byte seleziona quale tipo di istruzioni dovrebbero essere usate con il puntatore e gli altri byte mantengono il valore). Una dichiarazione di puntatore del tipo:

char *ptr; 

definirà un puntatore a tre byte che può puntare a qualsiasi spazio di memoria. Cambiando la dichiarazione

char xdata *data ptr; 

definirà un puntatore a due byte, che viene immagazzinato nello spazio DATI, ma che può puntare solo cose nello spazio XDATA. Analogamente

char data * data ptr; 

definiranno un puntatore a due byte, che viene immagazzinato nello spazio DATI, ma che può indicare solo cose nel DATA struttura iData. Il codice che utilizza i puntatori che puntano a uno spazio dati noto sarà molto più veloce (possibilmente di un fattore dieci) rispetto al codice che utilizza i puntatori a tre byte "generici".