8 Bit Enum, in C
Habe ich zum speichern von Anweisungen, Befehle, die ich empfangen über die serielle.
Die Befehle werden 8 bits lang.
Ich muss zur Beibehaltung der Transparenz zwischen Befehl Namen und sein Wert.
So können Sie vermeiden, dass übersetzen ein 8-bit-Zahl empfangen, die in seriellen, in jeder Art.
Ich würde gerne verwenden Sie Aufzählungen, um mit Ihnen umzugehen in meinem code.
Nur eine Aufzählung entspricht einem auf dieser Plattform ein 16-bit-integer.
Die Plattform AVR ATmega169V-mikrocontroller, auf dem Butterfly demo board.
Es ist ein 8bit-system mit einige begrenzte Unterstützung für 16-bit-Operationen.
Es ist nicht ein schnelles system und verfügt über 1KB RAM.
Es hat keinen Luxus wie Datei-I/O-oder eine-Betriebssysteme.
Also irgendwelche Vorschläge, welche Art sollte ich verwenden, um zu speichern 8-bit-Befehle?
Es hat doch etwas besseres als eine massive header #definiert.
InformationsquelleAutor der Frage Lyndon White | 2009-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
gcc
's-fshort-enums
nützlich sein könnten:In der Tat, hier's eine Seite mit einer Menge von relevanten Informationen. Ich hoffe, Sie kommen in vielen GCC-switches, die Sie nie wusste, Bestand. 😉
InformationsquelleAutor der Antwort Michael Foukarakis
Den Sie versuchen, ein problem zu lösen, das nicht existiert.
Ihre Frage tagged C. In der C-Sprache enum-Typen im Wert-Kontext sind voll kompatibel mit integralen Typen und Verhalten sich genauso wie die anderen integralen Typen. Wenn Sie in Ausdrücken verwendet, die Sie ausgesetzt sind, um genau das gleiche integral promotions wie andere Integrale Typen. Sobald Sie, die Rechnung zu tragen, sollten Sie erkennen, dass, wenn Sie speichern möchten, die beschriebenen Werte von enumeration-Konstanten in ein 8-bit-integral-Typ, alles, was Sie tun müssen, ist wählen Sie ein geeignetes generisches 8-bit-integral-Typ (sagen
int8_t
) und verwenden Sie es anstelle von enum-Typ. Sie verlieren absolut nichts, indem Sie Ihre enum-Konstanten in ein Objekt vom Typint8_t
(im Gegensatz zu einem Objekt explizit deklariert mit enum-Typ).Das Problem, das Sie beschreiben, gäbe es in C++, wo enum-Typen getrennt sind viel weiter von den anderen integralen Typen. In C++ mit integrierter Typ statt der enum-Typ für den Zweck der Speicherung Speicher ist schwieriger (aber möglich). Aber nicht in C, wo es erfordert keine zusätzliche Anstrengung zu löschen.
InformationsquelleAutor der Antwort AnT
Ich sehe nicht ein, warum ein enum nicht funktionieren würde. Vergleiche und Zuweisungen aus, die eine enum-sollten alle funktionieren mit der Standard-Erweiterung. Nur vorsichtig sein, dass Ihre 8-bit-Werte sind ordnungsgemäß signiert (ich würde denken, Sie würde wollen, unsignierten Erweiterung).
Erhalten Sie 16-bit-Vergleiche dieser Art, ich hoffe, dass nicht ein performance-problem (es sollte nicht sein, vor allem, wenn Ihr Prozessor ist 16-bit, wie es klingt wie es ist).
InformationsquelleAutor der Antwort Keith Randall
Microsoft C-compiler ermöglicht es Ihnen, so etwas zu tun, aber es ist eine Erweiterung (es ist standard in C++0x):
Da Sie tagged GCC, ich bin nicht ganz sicher, ob die gleiche Sache möglich ist, aber könnte GCC eine Erweiterung in
gnu99
- Modus oder so etwas. Es geben einen Wirbel.InformationsquelleAutor der Antwort Jed Smith
Ich würde empfehlen, zu bleiben, die enum in jedem Fall aus den folgenden Gründen:
Erstes sollte man sich nicht darum kümmern, Typ real width. Nur, wenn Sie wirklich brauchen effektive Art der Lagerung, die Sie verwenden sollten compiler-flags wie -fshort-enums auf den GNU-compiler, aber ich weiß nicht empfehlen, es sei denn Sie Sie wirklich brauchen.
Als Letzte option können Sie festlegen, 'enum' als Präsentation von Daten für die Befehle und conversion-byte mit 2 einfachen Operationen zum speichern /wiederherstellen-Befehl Wert/aus dem Speicher (und einkapseln dieser in einem Ort). Was ist das? Diese sind sehr einfache Operationen, so können Sie auch inline (aber das können Sie wirklich verwenden Sie nur 1 byte für die Speicherung und die von der anderen Seite zum ausführen von Operationen mit den meisten nutzbare enum definiert, wie Sie möchten.
InformationsquelleAutor der Antwort Roman Nikitchenko
Beantworten, die relevant sind für ARC-compiler
(Zitiert aus DesignWare MetaWare C/C++ Programmer ' s Guide für BOGEN; Abschnitt 11.2.9.2)
InformationsquelleAutor der Antwort Morinho