Qué procesador de 8 bits tiene que enfrentarse a un problema endianness?

StackOverflow https://stackoverflow.com/questions/2477379

  •  21-09-2019
  •  | 
  •  

Pregunta

Si tengo un número entero de tipo int32 en la memoria del procesador de 8 bits de, digamos, 8051, ¿cómo podría identificar el endianess de ese entero? ¿Es compilador específico? Creo que esto es importante a la hora de enviar datos a través de líneas serie multybyte etc.

¿Fue útil?

Solución

Con un microcontrolador de 8 bits que no tiene soporte nativo para los enteros más amplios, el orden de bits de enteros almacenados en la memoria es, en efecto hasta que el escritor del compilador.

El compilador SDCC, que es ampliamente utilizado en 8051, almacena los números enteros en formato little-endian (la guía del usuario para ese compilador afirma que es más eficiente en la que la arquitectura, debido a la presencia de una instrucción para incrementar un puntero de datos pero no uno para decremento).

Otros consejos

Si el procesador tiene cualquier operación que actúan sobre los valores de varios bytes, o tiene un registro de múltiples bytes, tiene la posibilidad de tener un endian-dad.

http://69.41.174.64/forum/printable.phtml?id= 14233 y rosca = 14207 sugiere que el 8,051 mezcla diferentes endian-dad en diferentes lugares.

El endianness es específico de la arquitectura de la CPU. Desde un compilador debe centrarse en una CPU en particular, el compilador tendría conocimiento de la orden de bits también. Así que si usted necesita enviar datos a través de una conexión en serie, red, etc es posible que desee utilizar las funciones de construir-en los que poner los datos en el orden de bytes de red - sobre todo si el código necesita para soportar múltiples arquitecturas.

Para obtener más información, ver: http: // www .gnu.org / s / libc / manual / html_node / Byte-order.html

No es sólo hasta el compilador - '51 tiene algunos registros nativos de 16 bits (DPTR, PC en la norma, ADC_IN, DAC_OUT y como en variantes) del orden de bits dada, que el compilador tiene que obedecer - pero fuera de eso, el compilador es libre de utilizar cualquier orden de bits que prefiere o uno que elija en la configuración del proyecto ...

Un entero no tiene orden de bits en el mismo. No se puede determinar con sólo mirar los bytes si es endian grande o pequeño. Sólo tienes que saber: Por ejemplo, si su procesador de 8 bits es poco endian y que está recibiendo un mensaje que ustedes saben que es big endian (porque, por ejemplo, el sistema de bus de campo define big endian), usted tiene que convertir los valores de más de 8 bits. Tendrá que sea difícil que el código que tiene o alguna definición en el sistema en el que los bytes de cambiar.

Tenga en cuenta que el intercambio de bytes es lo más fácil. Usted también puede tener que cambiar los bits en los campos de bits, ya que el orden de los bits en los campos de bits es su compilador. Una vez más, que básicamente tienen que saber esto en tiempo de compilación.

unsigned long int x = 1;
unsigned char *px = (unsigned char *) &x;

*px == 0 ? "big endian" : "little endian"

Si x se le asigna el valor 1, entonces el valor será 1 en el byte menos significativo. Si a continuación, echamos x sea un puntero a bytes, el puntero apunte a la ubicación de memoria más baja de x. Si la localización de memoria es 0 es endian grande, de lo contrario es poco endian.

#include <stdio.h>

union foo {
    int as_int;
    char as_bytes[sizeof(int)];
};

int main() {
    union foo data;
    int i;
    for (i = 0;  i < sizeof(int);  ++i) {
        data.as_bytes[i] = 1 + i;
    }
    printf ("%0x\n", data.as_int);
    return 0;
}

Interpretando la salida depende de usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top