5 votos

Cortex-M4F FPU problemas

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.

5voto

Bernd Puntos 61

¿Por qué no tratar de eliminar todos los cálculos de punto flotante de las rutinas de servicio de interrupción. Mucha gente diría que no debería estar allí en primer lugar.

Pre-cálculo de punto flotante cosas en la línea principal flujo de código de modo que no se necesita estar en el ISR. Esto puede requerir un replanteamiento de los algoritmos utilizados, pero a menudo conducen a más robusto y ágil código.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X