tutorial studio not installed c avr avr-gcc winavr avr-studio4

studio - gcc avr



Enumeración de 8 bits, en C (6)

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

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

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

Tengo que almacenar las instrucciones, los comandos que recibiré a través de la serie. 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. Solo una enumeración corresponde a un entero de 16 bits en esta plataforma.

La plataforma es el microcontrolador AVR ATmega169V, en el tablero de demostración Butterfly . Es un sistema de 8 bits con un soporte limitado para operaciones de 16 bits. No es un sistema rápido y tiene aproximadamente 1KB de RAM. No tiene lujos como archivos de E / S, 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 #defines.


En cualquier caso, recomendaría permanecer en la lista por las siguientes razones:

  • Esta solución le permite asignar valores de comando directamente a lo que espera su protocolo serie.
  • Si realmente utiliza la 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 real de la enumeración, usé un número mínimo de bits (las enumeraciones que podrían ajustarse en el byte usaron solo el byte, luego 16 bits y luego 32).

Primero no debes preocuparte por el ancho del tipo real. Solo si realmente necesita una forma efectiva de almacenamiento, debe usar 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 en / desde la memoria (y encapsular esto en un solo lugar). Que hay de esto Estas son operaciones muy simples, por lo que incluso puede incluirlas (pero esto le permite usar realmente solo 1 byte para el almacenamiento y desde otro lado para realizar operaciones utilizando la enumeración más utilizable definida como desee).


La respuesta es relevante para el compilador ARC (Citado en la Guía del programador para ARC de DesignWare MetaWare C / C ++; sección 11.2.9.2)

Tamaño de las enumeraciones El tamaño de un tipo de enumeración depende del estado de toggle * Long_enums *.

■ Si la opción * Long_enums * está desactivada, el tipo de enumeración se asigna al más pequeño de uno, dos o cuatro bytes, de manera que todos los valores se puedan representar.

■ Si la opción * Long_enums * está activada, una enumeración se asigna a cuatro bytes (que coinciden con la convención de AT&T Portable C Compiler).


No veo por qué una enumeración no funcionaría. Las comparaciones y asignaciones de una enumeración deberían funcionar bien con la ampliación predeterminada. Solo tenga cuidado de que sus valores de 8 bits estén firmados correctamente (creo que querrí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 es de 16 bits como parece).


Usted está tratando de resolver un problema que no existe.

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

El problema que describe existiría en C ++, donde los tipos de enumeración se separan mucho más lejos de otros tipos integrales. En C ++, usar un tipo integral en lugar de un tipo de enumeración con el propósito de ahorrar memoria es más difícil (aunque posible). Pero no en C, donde no requiere ningún esfuerzo adicional.


-fshort-enums podría ser útil:

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

De hecho, here una página con mucha información relevante. Espero que encuentres muchos conmutadores GCC que nunca sabías que existían. ;)