10
votes

Quand est-ce que j'utilise xdata?

Je suis nouveau dans la programmation du système embarqué. Je travaille sur un appareil qui utilise un chipset 8051. J'ai remarqué dans les échantillons de programmes que lors de la définition de variables, parfois ils utilisent le mot-clé XData. comme ça ...

Statique Sans signé Char XData MatureSize;

tandis que d'autres fois, le mot clé XData est omis.

Ma compréhension est que le mot-clé XData indique au compilateur que cette variable doit être stockée en mémoire externe, flash, mémoire.

Dans quels cas devrais-je stocker des variables à l'extérieur avec XDATA? Accéder à ces variables prend plus de temps, non? Les valeurs stockées à l'aide de XData ne subsistent pas après une réinitialisation dure de l'appareil?

En outre, je comprends que le mot clé statique signifie que la variable persistera à travers chaque appel à la fonction qu'il est défini. Do Static et XData doivent être utilisés ensemble?


0 commentaires

5 Réponses :


1
votes

Comment et quand utiliser la zone de mémoire XData dépend de l'architecture du système. Certains systèmes peuvent avoir la RAM à cette adresse tandis que d'autres pourraient avoir une ROM ou un flash. Dans les deux cas, l'accès sera plus lent que l'accès à la RAM interne, ROM ou Flash.

En règle générale, les gros articles, les articles constants et les articles d'occasion moins utilisés devraient entrer dans XData. Il n'y a pas de règles standard quant à ce qui se passe dans XData, car cela dépend de l'architecture.


1 commentaires

Strictement, XData ne modifie que la génération de code pour émettre les instructions qui apportent l'espace de données 16 bits. Que ce soit la RAM, la ROM ou (NOR), le compilateur se soucie de; De toute évidence, différents appareils peuvent avoir un espace d'adressage mixte, mais ils sont tous des "xdata".



1
votes

Le 8051 comporte une plage de 128 octets de «pseudo-registres» que (la plupart) compilateurs utilisent comme par défaut pour les variables déclarées. Mais évidemment, cette zone est très petite et vous voulez pouvoir également mettre des variables dans l'espace d'adresses mémoire 16 bits aussi. C'est ce que le spécificateur XData (c'est-à-dire des données externes ") est destiné. Ce qu'il faut placer où dépend, évidemment, sur ce que les données sont et comment vous envisagez de l'utiliser.

Fondamentalement, je pense que c'est la mauvaise question. Vous devez d'abord comprendre votre architecture de la CPU avant d'apprendre à utiliser les fonctionnalités spécifiques à 8051 de C compiler.


0 commentaires

6
votes

XData indique au compilateur que les données sont stockées dans la RAM externe afin d'utiliser une instruction différente pour lire et écrire cette mémoire au lieu de la RAM interne.

Accéder aux données externes prend plus de temps. Je mettez habituellement des variables interrompues dans la RAM interne et la plupart des grandes matrices en RAM externe.

sur l'état de la RAM externe après une réinitialisation dure (non du cycle d'alimentation): cela dépend de la configuration matérielle. Une ligne de réinitialisation va-t-elle sur la puce externe? De plus, certaines jetons viennent avec XData dans la puce CPU. Lisez ça à nouveau. Certaines puces ont une CPU 8051 et une certaine quantité de xdata au sein de l'IC.

statique et xdata ne se chevauchent pas. Statique indique au compilateur comment allouer une variable (sur une pile ou un emplacement de mémoire). XData indique au compilateur comment atteindre cette variable. Static peut également restreindre l'espace de nom de cette variable à ce fichier. Vous pouvez avoir une variable statique XData qui est locale à une seule fonction et avoir une variable statique locale à une fonction, mais utilise la RAM interne.


0 commentaires

9
votes

L'architecture 8051 dispose de trois espaces d'adresses distincts, la RAM principale utilise une adresse 8 bits, de même que 256 octets, XData est un espace d'adresses de 16 bits (64 kbytes) avec une capacité de lecture / écriture, et l'espace de programme est un Espace d'adresse 16 BIT avec une capacité de données exécutée et lecture seule. En raison de sa petite plage d'adresses et de son couplage de fermeture au noyau, la résolution de la RAM principale est plus efficace en termes d'espace de code et de cycles d'accès

Le noyau d'origine 8051 avait un bélier minuscule sur puce (un espace d'adressage de 256 octets, mais certaines variantes avaient une moitié de la mémoire réelle), et XData a évoqué la mémoire de données hors puce (par opposition à la mémoire de programme). Cependant, la plupart des appareils d'architecture de 8051 modernes ont une mémoire XData sur puce et une mémoire de programme.

Vous pouvez donc utiliser la mémoire principale lorsque la performance est critique et XData pour des objets de mémoire plus importants. Cependant, le compilateur devrait dans la plupart des cas de cette décision pour vous (vérifiez votre manuel de Compilr, il décrira en détail comment la mémoire est allouée). L'ensemble d'instructions facilite la mise en œuvre de la pile dans la mémoire centrale, alors que les données statiques et dynamiquement attribuées seraient généralement plus joliment allouées à XData. Si le compilateur a un mot clé XData, il remplacera la stratégie du compilateur et ne devrait être utilisée que lorsque la stratégie du compilateur échoue en quelque sorte car elle réduira la transférabilité du code.

[modifier] Notez également que la mémoire principale comprend une région adressable à 32 octets, les instructions d'adressage bit utilisent une adresse 8 bits dans cette région pour accéder directement aux bits individuels. La région existe dans la mémoire centrale adressable des octets de 256.byte, de sorte que le bit et l'octet adressable [/ EDIT]


0 commentaires

3
votes

Un point important non encore mentionné est que, car différentes instructions sont utilisées pour accéder à différentes zones de mémoire, le matériel n'a pas de concept unifié d'un "pointeur". Toute adresse qui est connue pour être dans l'espace Data / Idata peut être identifiée de manière unique avec un pointeur d'une octet; De même aucune adresse connue pour être dans l'espace PData. Toute adresse connue pour être dans l'espace de code peut être identifiée avec un pointeur de deux octets; De même aucune adresse connue pour être dans l'espace XData. Dans de nombreux cas, cependant, une routine comme memcpy code> ne saura pas à l'avance quel espace mémoire doit être utilisé avec les pointeurs transmis. Pour accueillir que les compilateurs 8x51 utilisent généralement un type de pointeur de trois octets qui peut être utilisé pour accéder à des objets dans n'importe quel espace mémoire (un octet sélectionne le type d'instructions à utiliser avec le pointeur et les autres octets contiennent la valeur). Une déclaration de pointeur comme: xxx pré>

définira un pointeur de trois octets qui peut indiquer n'importe quel espace mémoire. Changer la déclaration à P>

char data * data ptr;


0 commentaires