Frage

Wenn ich einen int32 Typ integer in dem 8-Bit-Prozessor Speicher haben, sagen wir, 8051, wie konnte ich das Endianess dieser ganze Zahl identifizieren? Ist es Compiler spezifisch? Ich denke, das ist wichtig, wenn multybyte Daten über serielle Leitungen usw. zu senden.

War es hilfreich?

Lösung

Mit einem 8-Bit-Mikrocontroller, die keine native Unterstützung für größere Zahlen haben, die endianness von ganzen Zahlen in einem Speicher gespeichert ist in der Tat bis zu dem Compiler Schriftsteller.

Der SDCC Compiler, der weit über 8051 verwendet wird, speichert ganze Zahlen im Little-Endian-Format (die Bedienungsanleitung für diesen Compiler behauptet, dass es effizienter auf dieser Architektur ist, aufgrund des Vorhandenseins eines Befehls für einen Datenzeiger inkrementiert aber nicht ein für Erniedrigen).

Andere Tipps

Wenn der Prozessor keine Operationen hat das Gesetz über die Multi-Byte-Werte, oder hat ein Multi-Byte-Register, hat es die Möglichkeit, eine Bytereihenfolge zu haben.

http://69.41.174.64/forum/printable.phtml?id= 14233 & thread = 14207 8051 mischt unterschiedliche Bytereihenfolge an verschiedenen Orten legt nahe, dass.

Die Endian ist spezifisch für die CPU-Architektur. Da ein Compiler eine bestimmte CPU zum Ziel benötigt, würde der Compiler Kenntnis der endianness haben auch. Also, wenn Sie Daten über eine serielle Verbindung senden müssen, Netzwerk, etc. können Sie mögen build-in verwenden Funktionen, um Daten in Netzwerk-Byte-Reihenfolge zu bringen - vor allem, wenn Sie den Code Anforderungen an mehrere Architekturen zu unterstützen.

Weitere Informationen finden Sie unter: http: // www .gnu.org / s / libc / manual / html_node / Byte-order.html

Es ist nicht nur bis zu den Compiler - '51 hat einige nativen 16-Bit-Register (DPTR, PC in Standard, ADC_IN, DAC_OUT und solche in Varianten) von gegebenen endianness, die der Compiler zu gehorchen hat - aber außerhalb davon, der Compiler ist frei, jede endianness verwenden sie es vorzieht, oder ein Sie in Projekt wählen Konfiguration ...

Eine ganze Zahl nicht über endianness drin. Sie können nicht nur aus der Betrachtung des Bytes festzustellen, ob es groß oder Little-Endian ist. Sie müssen nur wissen: Zum Beispiel, wenn Ihr 8-Bit-Prozessor Little-Endian ist und Sie eine Meldung erhalten, dass Sie wissen, Big-Endian sein (weil zum Beispiel das Feldbussystem Big-Endian definiert), haben Sie Werte konvertieren von mehr als 8 Bit. Sie werden zu jedem Fest Code müssen, dass oder eine Definition auf dem System haben, auf das zu Swap-Bytes.

Beachten Sie, dass Bytes ist die einfache Sache tauschen. Sie können auch auf Swap-Bits in Bit-Felder haben, da die Reihenfolge der Bits in Bitfelder Compiler-spezifisch ist. Auch Sie im Grunde dieses Mal bei Build kennen.

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

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

Wenn x den Wert 1 zugeordnet ist, dann wird der Wert 1 wird im niederwertigen Byte sein. Wenn wir dann gegossen x ein Zeiger auf Bytes zu sein, wird der Zeiger auf die niedrigsten Speicherstelle von X zeigen. Wenn dieser Speicherplatz 0 ist, ist es Big-Endian, sonst ist es wenig 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;
}

die Ausgabe Interpretieren Sie liegt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top