Pregunta

Tengo que almacenar instrucciones, comandos que estaré recibiendo vía serial.Los comandos tendrán una longitud de 8 bits.

Necesito preservar la transparencia entre el nombre del comando y su valor.Para evitar tener que traducir un número de 8 bits recibido en serie a cualquier tipo.

Me gustaría usar enumeraciones para tratarlas en mi código.Sólo una enumeración corresponde a un número entero de 16 bits en esta plataforma.

La plataforma es el microcontrolador AVR ATmega169V, en el Tablero de demostración de mariposas.Es un sistema de 8 bits con soporte limitado para operaciones de 16 bits.No es un sistema rápido y tiene alrededor de 1 KB de RAM.No tiene ningún lujo como E/S de archivos o sistemas operativos.

Entonces, ¿alguna sugerencia sobre qué tipo debería usar para almacenar comandos de 8 bits?
Tiene que haber algo mejor que un encabezado masivo de #define.

¿Fue útil?

Solución

gcc's -fshort-enums podría ser útil:

Asignar a un tipo "enum" solo tantos bytes como necesite para el rango declarado de valores posibles. Específicamente, el tipo "enum" será equivalente al tipo entero más pequeño que tiene suficiente espacio.

En realidad, aquí'Página SA con mucha información relevante. Espero que te encuentres con muchos interruptores de CCC que nunca supiste que existían. ;)

Otros consejos

Estás tratando de resolver un problema que no existe.

Su pregunta está etiquetada C. en el lenguaje C Los tipos de enumentes en el contexto de valor son totalmente compatibles con los tipos integrales y se comportan al igual que otros tipos integrales. Cuando se usan en expresiones, se someten a exactamente las mismas promociones integrales que otros tipos integrales. Una vez que tenga eso en cuenta, debe darse cuenta de que si desea almacenar valores descritos por constantes de enumeración en un tipo integral de 8 bits, todo lo que tiene que hacer es elegir un tipo integral genérico de 8 bits adecuado (digamos int8_t) y úselo en lugar de tipo enum. No perderá absolutamente nada almacenando sus valores constantes en enume en un objeto de tipo int8_t (a diferencia de un objeto declarado explícitamente con el tipo enum).

El problema que describe existiría en C ++, donde los tipos de ENUM se separan mucho más de otros tipos integrales. En C ++, usar un tipo integral en lugar de tipo enum para guardar la memoria es más difícil (aunque posible). Pero no en C, donde no requiere ningún esfuerzo adicional.

No veo por qué un enum no funcionaría. Comparaciones y tareas de un enum debe funcionar bien con la ampliación predeterminada. Solo tenga cuidado de que sus valores de 8 bits estén firmados correctamente (creo que desearía una extensión sin firmar).

Obtendrá comparaciones de 16 bits de esta manera, espero que no sea un problema de rendimiento (no debería serlo, especialmente si su procesador tiene 16 bits, ya que parece que es).

El compilador C de Microsoft le permite hacer algo como esto, pero es una extensión (es estándar en C ++ 0x):

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

Dado que etiquetó GCC, no estoy completamente seguro de si lo mismo es posible, pero GCC podría tener una extensión en gnu99 modo o algo para ello. Darle un giro.

Recomendaría permanecer en la enumeración en cualquier caso por las siguientes razones:

  • Esta solución le permite asignar valores de comando directamente a lo que espera su protocolo serie.
  • Si realmente utiliza una arquitectura de 16 bits, no hay tantas ventajas para pasar al tipo de 8 bits.Piense en aspectos distintos a 1 byte de memoria guardado.
  • En algunos compiladores utilicé el tamaño de enumeración real y usé una cantidad mínima de bits (las enumeraciones que podrían caber en bytes usaron solo bytes, luego 16 bits y luego 32).

En primer lugar, no debería importarle el ancho real del tipo de letra.Sólo si realmente necesita una forma eficaz de almacenamiento, debe utilizar indicadores del compilador como -fshort-enums en el compilador GNU, pero no los recomiendo a menos que realmente los necesite.

Como última opción, puede definir 'enum' como datos de presentación para los comandos y usar la conversión a byte con 2 operaciones simples para almacenar/restaurar el valor del comando hacia/desde la memoria (y encapsularlo en un solo lugar).¿Qué pasa con esto?Estas son operaciones muy simples, por lo que incluso puedes alinearlas (pero esto te permite usar realmente solo 1 byte para el almacenamiento y desde el otro lado realizar operaciones usando la enumeración más utilizable definida como quieras.

Respuesta que es relevante para Compilador de arco (Citado de la guía del programador Metaware C/C ++ de Designware para ARC; Sección 11.2.9.2)

Tamaño de enumeraciones El tamaño de un tipo de enumación depende del estado de alternar *long_enums *.

■ Si el alternar * long_enums * está apagado, el tipo enum se mapea a los más pequeños de uno, dos o cuatro bytes, de modo que todos los valores se puedan representar.

■ Si está activado * long_enums *, un enum se mapea con cuatro bytes (que coinciden con la convención del compilador C portátil AT&T).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top