Domanda

Se ho un tipo Int32 intero nella memoria del processore a 8 bit, ad esempio, 8051, come potrei identificare l'endianess di quel intero? E 'compilatore specifico? Penso che questo sia importante per l'invio dei dati multybyte attraverso linee seriali, ecc.

È stato utile?

Soluzione

Con un microcontrollore a 8 bit che non ha il supporto nativo per gli interi più ampi, l'endianness di interi in memoria è infatti fino allo scrittore compilatore.

Il compilatore SDCC, che è ampiamente utilizzato su 8051, memorizza interi in formato little-endian (la guida dell'utente che compilatore sostiene che è più efficiente per quella architettura, a causa della presenza di un'istruzione per incrementare un puntatore di dati ma non uno per decremento).

Altri suggerimenti

Se il processore ha operazioni che agiscono su valori multi-byte, o ha un registri multi-byte, si ha la possibilità di avere un endian-ness.

http://69.41.174.64/forum/printable.phtml?id= 14233 & thread = 14207 suggerisce che il 8051 mescola diversi endian-ness in luoghi diversi.

L'endianness è specifico per l'architettura di CPU. Dal momento che un compilatore deve indirizzare un particolare CPU, il compilatore avrebbe conoscenza del endianness pure. Quindi, se avete bisogno di inviare dati su una connessione seriale, di rete, ecc si potrebbe desiderare di utilizzare le funzioni di build-in per inserire i dati in ordine di byte di rete - soprattutto se il vostro codice deve supportare architetture multiple.

Per ulteriori informazioni, vedere: http: // www .gnu.org / s / libc / manuale / html_node / Byte-Order.html

Non è solo fino al compilatore - '51 ha alcuni registri native a 16 bit (DPTR, PC nella norma, ADC_IN, DAC_OUT e tali in varianti) di data endianness cui il compilatore deve obbedire - ma al di fuori di questo, il compilatore è libero di utilizzare qualsiasi endianness preferisce o uno si sceglie nella configurazione di progetto ...

Un numero intero non ha endianness in esso. Non è possibile determinare solo guardare i byte se è grande o little endian. Non vi resta che sapere: Per esempio, se il vostro processore a 8 bit è little endian e si sta ricevendo un messaggio che si sa di essere big endian (perché, ad esempio, il sistema di bus di campo definisce big endian), è necessario convertire i valori di più di 8 bit. Avrete bisogno di uno hard-code che o per avere un po 'di definizione sul sistema su cui i byte da scambiare.

Si noti che lo scambio di byte è la cosa facile. Si può anche avere scambiare bit in campi di bit, dal momento che l'ordine dei bit in campi di bit è specifica del compilatore. Anche in questo caso, si deve fondamentalmente sapere questo al momento della compilazione.

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

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

Se x viene assegnato il valore 1, quindi il valore 1 sarà nel byte meno significativo. Se poi ci gettiamo x essere un puntatore al byte, il puntatore punterà alla locazione di memoria più basso di x. Se quella posizione di memoria è pari a 0 è big endian, altrimenti è little 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;
}

Interpretazione l'uscita è a voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top