Estoy escribiendo código para una placa Texas Instruments Stellaris Launchpad (una Cortex-M4F, el chip es un LM4F120H5QR ). Estoy usando la biblioteca IRMP para la decodificación de infrarrojos, que funciona bien, siempre que no use ninguna matemática de punto flotante fuera de su ISR. Una sola operación como en
MAP_SysCtlDelay((MAP_SysCtlClockGet())/ 30.0);
rompe la biblioteca IRMP. El chip aún se ejecuta, IRMP llama a todas sus funciones requeridas, las transmisiones UART funcionan, pero IRMP ya no puede decodificar ninguna recepción de infrarrojos.
En la parte superior de mi main
función tengo:
// Enable FPU
MAP_FPULazyStackingEnable();
MAP_FPUEnable ();
De hecho, si comento esas líneas, el software simplemente se bloquea durante la inicialización.
Probé varias versiones de esas funciones de habilitación de FPU (ROM_, MAP_, FPUStackingEnable, FPULazyEnable), pero nada parece solucionar el problema.
Las últimas 4 horas de búsqueda en Google han resultado inútiles, así que esperaba encontrar una respuesta aquí.
Editar: Más rarezas: si compilo con -O0, IRMP tampoco decodifica nada. Tan pronto como configuro las optimizaciones en O1 o superior, comienza a funcionar nuevamente (siempre que no se realice una aritmética de punto flotante fuera de la rutina ISR del temporizador y las funciones que llama).
Ah, y en caso de que ayude, arm-none-eabi-gcc --version
da:
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.7.3 20121207 (release) [ARM/embedded-4_7-branch revision 194305]
Estoy compilando con las siguientes opciones:
-DPART_LM4F120H5QR -DARM_MATH_CM4 -DTARGET_IS_BLIZZARD_RA1 -I$SOMEDIR/stellarisware
-Os -Wall -std=gnu99 -c -fmessage-length=0 -fsingle-precision-constant -mcpu=cortex-m4
-mfpu=fpv4-sp-d16 -mthumb -mfloat-abi=softfp -ffunction-sections -fdata-sections
Edición 2: debo agregar que no se realizan cálculos reales de punto flotante en el código IRMP. Es decir: todas las variables son números enteros. Sin embargo, hay muchas definiciones que son flotantes intermedias, por ejemplo:
#define IRMP_KEY_REPETITION_LEN (uint16_t)(F_INTERRUPTS * 150.0e-3 + 0.5)
Estas constantes se comparan con otros uint16_t
tipos en el código real. No estoy muy seguro de por qué esto requiere aritmética FP en el código de tiempo de ejecución, todos son valores fijos que se pueden doblar en números enteros.
¿Por qué no intenta eliminar todos los cálculos de coma flotante de las rutinas del servicio de interrupción? Mucha gente señalaría que, en primer lugar, no debería estar allí.
Calcule previamente las cosas de punto flotante en el flujo de código de la línea principal para que no sea necesario que estén en el ISR. Esto puede requerir un replanteamiento de los algoritmos utilizados, pero a menudo conducirá a un código más robusto y más ágil.
PedroJ
AVH
AVH
AVH
miguel karas
miguel karas
AVH
AVH
AVH