Estoy desarrollando para la plataforma AVR y tengo una pregunta. No quiero que la biblioteca de punto flotante se vincule con mi código, pero me gusta el concepto de tener valores analógicos del rango 0.0 ... 1.0 en lugar de 0 ... 255 y 0 ... 1023, dependiendo de incluso si estoy usando un puerto como entrada o como salida.GCC optimización en tiempo flotante en tiempo de compilación
Así que decidí multiplicar los argumentos de las funciones de entrada/salida por 1023.0 y 255.0, respectivamente. Ahora, mi pregunta es: si pongo en práctica la división de la siguiente manera:
#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))
se GCC (con la bandera -O3 activada) optimizar el tiempo de compilación multiplicaciones en coma, conocido en tiempo de compilación y emitidos a una integral flotante tipo, en operaciones enteras? (Sé que al utilizar estas macros con argumentos no constantes, la optimización no es posible, solo quiero saber si se hará en el otro caso)
No debería ser esto una multiplicación, no una división? ('analog_out (7, 0.5)' se convierte en una escritura de '0.5 * 255' al puerto 7, en lugar de una escritura de 0 picado desde 1/510) ... – Borealid
sí, seguro :) Reparado. –
¡Pruébalo y descúbrelo! 'gcc -S' producirá un volcado de montaje. Probablemente quieras '-O2 -ffast-math' para esto, no' -O3' ('-O3' activa optimizaciones que casi siempre son net * lose *, como la sobreinyección agresiva, está destinado a ser utilizado en el un archivo en el que su programa pasa el 90% de su tiempo). – zwol