avr-gcc error de macro flotante

1

Cuando intento compilar algún código con definición de macro en la siguiente definición

# define _SPEED_FACTOR0 0.9 //or any float value

Me sale el error

  

constante flotante en la expresión del preprocesador

Estoy usando avr-gcc (versión 4.8.2)

aquí está el comando de compilación completo y el error

  

avr-gcc -g -Os -mmcu = atmega644p -c test_sens_mot.c ../utils/sources/*.c -I ../ utils / includes

     

En el archivo incluido desde ../utils/sources/motors.c:1:0:

     

../utils/sources/motors.c: En la función "ir":

     

../utils/includes/global.h:14:25: error: constante flotante en la expresión del preprocesador   # define _SPEED_FACTOR0 0.9 // solo en el temporizador 0

Me interesa evitar esto y seguir utilizando macros y valores flotantes.

gracias!

    
pregunta Virgil Litan

2 respuestas

3

Lo tengo!

Como Dave Tweed sugirió en un comentario, el problema no era la declaración en sí, sino la forma en que estaba usando esa macro. En otras líneas estaba haciendo esto:

#if SPEED_FACTOR != 1

y si comento esta parte, todo funciona bien.

¡Gracias!

    
respondido por el Virgil Litan
1

Es probable que el problema no tenga ninguna biblioteca de punto flotante vinculada al proyecto para empezar.

Esto es normal para cualquier aplicación de microcontrolador, ya que no tiene mucho sentido usar números de punto flotante allí. Particularmente cuando la MCU no tiene una FPU integrada . Porque si no lo hace, obtendrá un manejo de punto flotante a través del software, que es muy lento.

Por lo tanto, al realizar la programación integrada, siempre se evita la aritmética de punto flotante el mayor tiempo posible.

Es un malentendido común entre los programadores de PC que punto flotante significa: "Necesito mostrar una coma decimal". Eso es una tontería, puede realizar todos los cálculos en enteros planos y luego solo calcular e imprimir la posición de coma cuando necesite presentar el valor a un usuario. Los números de punto flotante solo causarán problemas (como la inexactitud del punto flotante que causa problemas durante la comparación).

Por ejemplo, si su programa necesita mostrar voltios, con 3 decimales de milivoltios, no debe crear una variable float volt = 1.234f; , sino un uint32_t milli_volt = 1234; y luego hacer todos los cálculos en milivoltios.

Punto flotante significa: "Necesito hacer matemáticas avanzadas". Como regla general, no debe usar números de punto flotante a menos que su programa tenga que hacer cálculos avanzados, como la trigonometría. En cuyo caso, debe elegir una MCU con FPU incorporada.

Dicho esto, aún puede calcular constantes numéricas en el preprocesador, sin que en realidad incluya ningún cálculo flotante en su código. Ejemplo:

#define CURRENT 0.20
#define RESISTANCE 47.0
#define VOLTAGE (uint32_t) (CURRENT * RESISTANCE)

Aquí el cálculo de punto flotante lo realizará su PC de programación y no el microcontrolador. Lo anterior es equivalente a escribir

#define VOLTAGE 9
    
respondido por el Lundin

Lea otras preguntas en las etiquetas