Question

Je dois stocker des instructions, des commandes que je vais recevoir par série. Les commandes seront longues de 8 bits.

Je dois préserver la transparence entre le nom de la commande, et sa valeur. Afin d'éviter d'avoir à traduire un nombre de 8 bits reçu en série dans tout type.

Je voudrais utiliser énumérations pour traiter avec eux dans mon code. Seule une énumération correspond à une plate-forme sur ce un nombre entier de 16 bits.

La plate-forme est AVR microcontrôleur ATmega169V, sur le . Il est un système de 8bit avec un soutien limité pour les opérations de 16bit. Il est pas un système rapide et a environ 1 Ko de RAM. Il n'a pas de luxe comme fichier I / O, ou un système d'exploitation.

Alors des suggestions quant à ce type je devrais utiliser pour stocker les commandes 8 bits?
Il doit y avoir quelque chose de mieux qu'un en-tête massive de #defines.

Autres conseils

Vous essayez de résoudre un problème qui n'existe pas.

Votre question est étiqueté C. Dans les types enum de langage C dans un contexte de valeur sont entièrement compatibles avec les types intégrés et se comportent comme d'autres types intégrés. Lorsqu'ils sont utilisés dans les expressions, ils sont soumis exactement aux mêmes promotions que les autres types intégraux entiers. Une fois que vous prenez cela en compte, vous devez réaliser que si vous voulez stocker des valeurs décrites par des constantes d'énumération dans un type intégral 8 bits, tout ce que vous avez à faire est de choisir un type intégral générique approprié 8 bits (dire int8_t) et l'utiliser au lieu de type ENUM. Vous perdrez absolument rien en stockant vos valeurs enum constantes dans un objet de type int8_t (par opposition à un objet explicitement déclaré avec le type de ENUM).

La question que vous décrivez existerait en C ++, où les types de ENUM sont séparés beaucoup plus loin d'autres types entiers. En C ++ en utilisant un type intégral à la place du type ENUM dans le but de sauver la mémoire est plus difficile (mais possible). Mais pas en C, où il ne nécessite aucun effort supplémentaire que ce soit.

Je ne vois pas pourquoi un ENUM ne fonctionnerait pas. Les comparaisons, et les affectations de, un ENUM devrait fonctionner tout va bien avec l'élargissement par défaut. Il suffit de faire attention à ce que vos valeurs de 8 bits sont signés correctement (je pense que vous voulez l'extension non signée).

Vous obtiendrez des comparaisons 16 bits de cette façon, je l'espère qui ne sera pas un problème de performance (il ne devrait pas être, surtout si votre processeur est 16 bits comme il semble que ce soit).

compilateur Microsoft C vous permet de faire quelque chose comme ça, mais il est une extension (il est standard C ++ 0x):

enum Foo : unsigned char {
    blah = 0,
    blargh = 1
};

Depuis que vous avez taguée GCC, je ne suis pas tout à fait sûr que la même chose est possible, mais GCC pourrait avoir une extension en mode gnu99 ou quelque chose pour elle. Donnez-lui un tourbillon.

Je vous recommande de rester sur ENUM dans tous les cas pour les raisons suivantes:

  • Cette solution vous permet de cartographier les valeurs de commande directement à ce que le protocole de série s'attend.
  • Si vous utilisez vraiment l'architecture 16 bits il n'y a pas si grand nombre d'avantages pour passer au type 8 bits. Pensez à d'autres aspects alors 1 octet de mémoire économisée.
  • Dans certains compilateurs j'ai utilisé la taille de ENUM réelle utilisé nombre minimal de bits (de énumérations qui pourraient être en forme dans l'octet utilisé octet seulement, puis 16 bits puis 32).

D'abord, vous ne devriez pas se soucier de la largeur de type réel. Seulement si vous avez vraiment besoin moyen efficace de stockage, vous devez utiliser des drapeaux du compilateur tels que -fshort-énumérations sur le compilateur GNU, mais je ne les recommande pas à moins que vous avez vraiment besoin.

En dernière option, vous pouvez définir « enum » en tant que données de présentation pour les commandes et utiliser la conversion à l'octet avec 2 opérations simples pour stocker / restaurer la valeur de commande / de la mémoire (et ce encapsuler dans un seul endroit). Et ça? Ce sont des opérations très simples et vous pouvez même les en ligne (mais cela vous permet d'utiliser vraiment seulement 1 octet pour le stockage et de l'autre côté pour effectuer des opérations en utilisant ENUM plus utilisable définie comme vous le souhaitez.

Réponse qui est pertinent pour compilateur ARC (Cité de DesignWare MetaWare C / C ++ Guide du programmeur pour ARC; section 11.2.9.2)

  

Taille de énumérations La taille d'un type ENUM dépend de l'état de Long_enums bascule de * *.

     

■ Si bascule * Long_enums * est éteint, les cartes de type ENUM au plus petit d'un, deux ou quatre octets, de sorte que toutes les valeurs peuvent être représentées.

     

■ Si bascule * Long_enums * est activé, une carte de ENUM   quatre octets (correspondant à l'AT & T convention Portable C Compiler).

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