2010-01-11 28 views
8

Soy nuevo en la programación de sistemas integrados. Estoy trabajando en un dispositivo que usa un chipset 8051. Me he dado cuenta en los programas de muestra que al definir variables, a veces usan la palabra clave xdata. como este ...¿Cuándo uso xdata?

estática unsigned char xdata PatternSize;

mientras que otras veces se omite la palabra clave xdata.

Mi entendimiento es que la palabra clave xdata indica al compilador que esa variable se debe almacenar en memoria externa, flash,.

¿En qué casos debo almacenar variables externamente con xdata? El acceso a esas variables lleva más tiempo, ¿no? Los valores almacenados con xdata no permanecen después de un restablecimiento completo del dispositivo ¿verdad?

Además, entiendo que la palabra clave estática significa que la variable persistirá en cada llamada a la función en la que está definida. ¿Deben usarse estáticos y xdata juntos?

+0

Qué compilador está usando – Gerhard

Respuesta

6

La arquitectura 8051 tiene tres espacios de direcciones separados, la memoria RAM central utiliza una dirección de 8 bits, puede tener hasta 256 bytes, XDATA es un espacio de direcciones de 16 bits (64 Kb) con capacidad de lectura/escritura, y el espacio del programa un espacio de direcciones de 16 bits con ejecución y capacidad de datos de solo lectura.Debido a su pequeño rango de direcciones y su acoplamiento directo al núcleo, el núcleo RAM 8051 es más eficiente en términos de espacio de código y ciclos de acceso

El núcleo 8051 original tenía una RAM diminuta en el chip (un espacio de direcciones de 256 bytes pero algunas variantes tenían la mitad de eso en la memoria real), y XDATA hacía referencia a la memoria de datos fuera del chip (a diferencia de la memoria del programa). Sin embargo, la mayoría de los dispositivos modernos de arquitectura 8051 tienen memoria XDATA y programa en el chip.

Así que puede utilizar la memoria del núcleo cuando el rendimiento es crítico y XDATA para objetos de memoria más grandes. Sin embargo, el compilador en la mayoría de los casos debe tomar esta decisión por usted (consulte el manual de su compilador, describirá en detalle cómo se asigna la memoria). El conjunto de instrucciones hace que sea eficiente implementar la pila en la memoria del núcleo, mientras que los datos estáticos y dinámicamente asignados normalmente se asignarían de forma más sensata en XDATA. Si el compilador tiene una palabra clave XDATA, anulará la estrategia del compilador, y solo se debe usar cuando la estrategia del compilador falla de algún modo, ya que reducirá la portabilidad del código.

[edit] Tenga en cuenta también que la memoria del núcleo incluye una región de 32 bits direccionable por bits, las instrucciones de direccionamiento de bits utilizan una dirección de 8 bits en esta región para acceder directamente a bits individuales. La región existe dentro de la memoria básica direccionable de 256 bytes, por lo que es tanto bit y byte direccionable [/ edit]

1

Cómo y cuándo utilizar el área de memoria xData depende de la arquitectura del sistema. Algunos sistemas pueden tener RAM en esta dirección, mientras que otros pueden tener ROM o Flash. En cualquier caso, el acceso será más lento que el acceso a la memoria RAM, ROM o Flash interno.

En general, los elementos grandes, los elementos constantes y los artículos menos utilizados deben ir a xData. No existen reglas estándar sobre lo que entra en xData, ya que depende de la arquitectura.

+0

Estrictamente, xdata solo cambia la generación de código para emitir las instrucciones que golpean el espacio de datos de 16 bits. Ya sea que se trate de memoria RAM, ROM o flash (NOR) no es algo que le preocupe al compilador; obviamente, diferentes dispositivos pueden tener un espacio de direcciones mixto, pero todos son de memoria "xdata". –

1

El 8051 tiene un rango de 128 bytes de "registros de pseudoregistro" que (la mayoría) de los compiladores usan como valor predeterminado para las variables declaradas. Pero, obviamente, esta área es muy pequeña, y también desea poder poner variables en el espacio de direcciones de memoria de 16 bits. Para eso es para lo que es el especificador xdata (es decir, "datos externos"). Lo que debe colocarse depende, obviamente, de los datos y cómo planea usarlos.

Básicamente, creo que esta es la pregunta incorrecta. Primero debe comprender la arquitectura de su CPU antes de aprender a usar las características específicas del 8051 del compilador de C.

5

xdata le dice al compilador que los datos están almacenados en la RAM externa, por lo que tiene que usar una instrucción diferente para leer y escribir esa memoria en lugar de RAM interna.

El acceso a datos externos lleva más tiempo. Normalmente coloco variables de interrupción en la RAM interna y en la mayoría de las grandes matrices en la RAM externa.

En cuanto al estado de la RAM externa después de un restablecimiento completo (no ciclo de encendido): Eso dependería de la configuración del hardware. ¿Una línea de restablecimiento va al chip externo? También algunos chips vienen con XDATA dentro del chip de la CPU. Lee eso de nuevo. Algunos chips tienen una CPU 8051 más cierta cantidad de XDATA dentro del IC.

estática y xdata no se superponen. Static le dice al compilador cómo asignar una variable (en una pila o en una ubicación de memoria). Xdata le dice al compilador cómo llegar a esa variable. Static también puede restringir el espacio de nombre de esa variable a solo ese archivo. Puede tener una variable estática xdata que sea local para solo una función, y tener una variable estática que sea local para una función pero que use RAM interna.

2

Un punto importante que aún no se menciona es que debido a que se usan diferentes instrucciones para acceder a diferentes áreas de memoria, el hardware no tiene concepto de un "puntero". Cualquier dirección que se sabe que está en el espacio DATA/IDATA puede identificarse de manera única con un puntero de un byte; Del mismo modo, cualquier dirección que se sabe que está en el espacio PDATA. Cualquier dirección que se sabe que está en el espacio CODE se puede identificar con un puntero de dos bytes; Del mismo modo, cualquier dirección que se sabe que está en el espacio XDATA. Sin embargo, en muchos casos, una rutina como memcpy no sabrá de antemano qué espacio de memoria debe usarse con los punteros pasados. Para acomodar eso, los compiladores 8x51 generalmente usan un tipo de puntero de tres bytes que puede usarse para acceder a cosas en cualquier espacio de memoria (un byte selecciona qué tipo de instrucciones se deben usar con el puntero, y los otros bytes mantienen el valor). Una declaración de puntero como:

char *ptr; 

definirá un puntero de tres bytes que puede apuntar a cualquier espacio de memoria. Cambio de la declaración de

char xdata *data ptr; 

definirá un puntero de dos bytes que se almacena en el espacio de datos, sino que sólo puede apuntar a las cosas en el espacio XDATA. Del mismo modo

char data * data ptr; 

definirá un puntero de dos bytes que se almacena en el espacio de datos, sino que sólo puede apuntar a las cosas en los datos y espacios iData. El código que utiliza punteros que apuntan a un espacio de datos conocido será mucho más rápido (posiblemente por un factor de diez) que el código que utiliza los punteros de tres bytes de "propósito general".

Cuestiones relacionadas