Voy a escribir algo de código para un Texas Instruments Stellaris Launchpad de la junta (un Cortex-M4F, el chip es un LM4F120H5QR). Estoy usando el IRMP biblioteca de infrarrojos de decodificación, que funciona bien, siempre y cuando no uso matemática de punto flotante fuera de su ISR. Sólo una operación única, como en
MAP_SysCtlDelay((MAP_SysCtlClockGet())/ 30.0);
rompe el IRMP de la biblioteca. El chip todavía funciona, IRMP llamadas de todas sus funciones requeridas, UART transmisiones de trabajo, pero IRMP no puede decodificar cualquier infrarrojos de recepción más.
En la parte superior de mi main
función que obtuve:
// Enable FPU
MAP_FPULazyStackingEnable();
MAP_FPUEnable ();
En efecto, si el comentario fuera de esas líneas, el software sólo se bloquea durante el intialization.
He probado varios sabores de los FPU habilitación de funciones (ROM_, MAP_, FPUStackingEnable, FPULazyEnable), pero parece que nada para solucionar el problema.
El pasado 4 horas de búsqueda en Google han demostrado ser inútil, así que tenía la esperanza de encontrar una respuesta aquí.
Edit: Más rareza: si puedo compilar con -O0, IRMP no decodificar nada. En cuanto a las optimizaciones a O1 o superior, comienza a trabajar de nuevo (siempre que no aritmética de punto flotante se lleva a cabo fuera del temporizador de ISR de la rutina y de las funciones que se llama).
Ah, y en caso de que ayuda, arm-none-eabi-gcc --version
le 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
Edit 2: debo añadir que no real de los cálculos de punto flotante suceder en el IRMP código. Es decir: todas las variables son números enteros. Sin embargo, hay un montón de define que son intermedios flota, por ejemplo:
#define IRMP_KEY_REPETITION_LEN (uint16_t)(F_INTERRUPTS * 150.0e-3 + 0.5)
Estas constantes son en comparación con otros uint16_t
tipos en el código real. No estoy muy seguro de por qué esto requiere FP aritmética en el código de tiempo de ejecución, todos los valores fijos que puede ser doblado en números enteros.