Question

Si j'ai un entier de type int32 dans la mémoire du processeur 8 bits, disons, 8051, comment pourrais-je identifier le endianess de cet entier? Est-ce compilateur spécifique? Je pense que ce qui est important lors de l'envoi des données par le biais de lignes multybyte série etc.

Était-ce utile?

La solution

Avec un microcontrôleur 8 bits qui n'a pas de support natif pour les entiers plus larges, le boutisme des entiers stockés dans la mémoire est en effet à l'auteur du compilateur.

Le compilateur SDCC, qui est largement utilisé sur 8051, entiers magasins au format little-endian (le guide de l'utilisateur pour ce compilateur prétend qu'il est plus efficace sur cette architecture, en raison de la présence d'une instruction pour incrémenter un pointeur de données mais pas un pour décrémenter).

Autres conseils

Si le processeur a des opérations qui agissent sur des valeurs multi-octets, ou a une registres multi-octets, il a la possibilité d'avoir une endian-ness.

http://69.41.174.64/forum/printable.phtml?id= 14233 & thread = 14207 suggère que le 8051 mélange les endian-ness dans des endroits différents.

Le boutisme est spécifique à l'architecture du processeur. Étant donné qu'un compilateur doit cibler une unité centrale de traitement particulier, le compilateur aurait connaissance du boutisme ainsi. Donc, si vous avez besoin d'envoyer des données via une connexion série, réseau, etc vous pouvez utiliser les fonctions de construction-pour mettre les données dans l'ordre des octets réseau - surtout si votre code doit prendre en charge plusieurs architectures.

Pour plus d'informations, consultez: http: // www .gnu.org / s / libc / manuel / html_node / octet Order.html

Il est pas seulement jusqu'à le compilateur - '51 a des registres 16 bits natifs (DPTR, PC en standard, ADC_IN, DAC_OUT et ces dans les variantes) de boutisme donné que le compilateur doit obéir à - mais en dehors de cela, le compilateur est libre d'utiliser boutisme il préfère ou que vous choisissez dans la configuration du projet ...

Un entier ne pas boutisme en elle. Vous ne pouvez pas déterminer simplement de regarder les octets que ce soit grand ou petit-boutiste. Il vous suffit de savoir: Par exemple, si votre processeur 8 bits est peu endian et vous recevez un message que vous savez être grand endian (parce que, par exemple, le système de bus de terrain définit grand endian), vous devez convertir les valeurs de plus de 8 bits. Vous devrez soit dur code ou d'avoir une définition sur le système sur lequel octets à échanger.

Notez que la permutation d'octets est la chose facile. Vous pouvez également échanger des bits dans les champs de bits, puisque l'ordre des bits dans les champs de bits est spécifique au compilateur. Encore une fois, vous avez essentiellement de savoir cela au moment de la construction.

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

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

Si x est attribué la valeur 1 alors la valeur 1 sera le moins significatif octet. Si nous Rabattre ensuite x être un pointeur vers octets, le pointeur pointera vers l'emplacement de mémoire le plus bas de x. Si cet emplacement de mémoire est 0, il est grand endian, sinon il est peu 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;
}

L'interprétation de la sortie est à vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top