Domanda

Devo conservare le istruzioni, i comandi che riceverò via seriale. I comandi saranno lunghi 8 bit.

Ho bisogno di preservare la trasparenza tra nome del comando, e il suo valore. Al fine di evitare di dover tradurre un numero a 8 bit ricevuto in serie in qualsiasi tipo.

Mi piacerebbe utilizzare le enumerazioni di trattare con loro nel mio codice. Solo un censimento corrisponde a una su questa piattaforma un numero intero di 16 bit.

La piattaforma è AVR ATmega169V microcontrollore, sulla bordo farfalla demo . È un sistema 8bit con un supporto limitato per le operazioni 16bit. Non è un sistema veloce e dispone di circa 1 KB di RAM. Essa non ha lussi come i sistemi di file di I / O, o un esercizio.

Quindi, eventuali suggerimenti riguardo a quale tipo dovrei usare per memorizzare i comandi a 8-bit?
Ci ha avuto modo di essere qualcosa di meglio di una massiccia intestazione del # definisce.

È stato utile?

Soluzione

gcc di -fshort-enums potrebbe essere utile:

  

assegnare a un tipo "enum" solo come   numero di byte come necessari per la   gamma dichiarato di valori possibili.   In particolare, il tipo "enum" sarà   equivalente a   il tipo più piccolo intero che ha abbastanza spazio.

In realtà, qui 'una pagina con un sacco informazioni di rilevante. Spero che ci si imbatte in molti switch GCC non si sapeva mai esistito. ;)

Altri suggerimenti

Si sta cercando di risolvere un problema che non esiste.

La tua domanda è contrassegnati C. In C tipi enum lingua nel contesto valore sono completamente compatibili con i tipi integrali e si comportano proprio come gli altri tipi integrali. Quando utilizzato in espressioni, sono sottoposti a esattamente le stesse promozioni integrali degli altri tipi integrali. Una volta che si prende in considerazione, si dovrebbe capire che, se si desidera memorizzare i valori descritti da costanti di enumerazione in un tipo integrale 8-bit, tutto quello che dovete fare è scegliere un adeguato generica a 8 bit di tipo integrale (diciamo int8_t) e utilizzarlo invece di tipo enum. Potrai perdere assolutamente nulla per la memorizzazione enum valori costanti in un oggetto di tipo int8_t (al contrario di un oggetto in modo esplicito dichiarato con tipo enum).

Il problema si descrive esisterebbe in C ++, dove tipi enum sono separati molto più lontano da altri tipi integrali. In C ++ utilizzando un tipo integrale al posto del tipo enum per lo scopo di salvare memoria è più difficile (anche se possibile). Ma non in C, dove si richiede alcuno sforzo aggiuntivo di sorta.

Non vedo il motivo per cui un enum non avrebbe funzionato. I paragoni con, e le assegnazioni da un enum dovrebbero funzionare bene anche con l'ampliamento di default. Basta stare attenti che i valori a 8 bit sono firmati correttamente (penserei che si vorrebbe un'estensione non firmata).

Si otterrà i confronti a 16 bit in questo modo, spero che non ci sarà un problema di prestazioni (non dovrebbe essere, soprattutto se il processore è a 16 bit, come suona come è).

compilatore di Microsoft C ti permette di fare qualcosa di simile, ma è un'estensione (è di serie in C ++ 0x):

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

Dal momento che hai contrassegnato GCC, non sono del tutto sicuro se la stessa cosa è possibile, ma GCC potrebbe avere un interno in modalità gnu99 o qualcosa per esso. Dategli un vortice.

Mi consiglia di rimanere enum in ogni caso, per i seguenti motivi:

  • Questa soluzione consente di mappare valori di comando direttamente a ciò che il vostro protocollo seriale si aspetta.
  • Se davvero si utilizza l'architettura a 16 bit non c'è così grande numero di vantaggi di passare a 8 bit tipo. Pensate aspetti altri poi 1 byte di memoria salvato.
  • In alcuni compilatori ho usato dimensione effettiva enumerazione utilizzato numero minimo di bit (enumerazioni che potrebbe essere in forma di byte utilizzato solo byte, quindi 16 bit quindi 32).

In primo luogo non si dovrebbe preoccuparsi di larghezza tipo reale. Solo se si ha realmente bisogno modo efficace di archiviazione che si dovrebbe utilizzare flag di compilazione, come -fshort-enumerazioni su GNU compilatore, ma io non raccomandare loro a meno che non si ha realmente bisogno di loro.

Come ultima opzione è possibile definire 'enum' come dati di presentazione per i comandi e utilizzare la conversione in byte con 2 semplici operazioni per memorizzare / ripristinare il valore di comando per / dalla memoria (e racchiudendolo in un unico luogo). Che dire di questo? Questi sono molto semplici operazioni così si può anche loro in linea (ma questo consente di utilizzare davvero solo 1 byte per l'archiviazione e dall'altro lato per eseguire le operazioni utilizzando enum più utile definita come vi piace.

Risposta che è rilevante per ARC compilatore (Citato da DesignWare Metaware C / C ++ Guida di Programmatore per ARC; sezione 11.2.9.2)

  

Misura di enumerazioni La dimensione di un tipo enum dipende dallo stato di commutazione * * Long_enums.

     

■ Se ginocchiera * * Long_enums è spento, le mappe di tipo enum al più piccolo di uno, due o quattro byte, in modo tale che tutti i valori possono essere rappresentati.

     

■ Se ginocchiera * Long_enums * è in, un mappe enum a   quattro byte (corrispondente alla AT & T portatile convenzione compilatore C).

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