Inicio » Sin categoría » Pongo un «float» y mi programa falla en el Cortex-M4

Pongo un «float» y mi programa falla en el Cortex-M4

El viernes pasado hubo gente en el curso que probó a realizar operaciones en coma flotante y vio que el programa dejaba de funcionar.

Visto que algunos estáis pensando en hacer filtros, control vectorial, transformadas de Fourier, …, creemos que debéis saber a qué atenerse y sacar partido a las posibilidades de la unidad de coma flotante o FPU (la culpable del fallo).

El problema del otro día fué que el compilador estaba configurado para generar instrucciones máquina pero la FPU no estaba activa. En la siguiente imagen se muestra la opción de Keil que hay que tocar para cambiar esto.

Si hubiésemos desactivado la opción «Use FPU» no habríamos tenido problemas. En ese caso, las operaciones en coma flotante se harían por software, igual que con los Cortex-M3, PICs, 8051s y similares. Cuidado, que no todos los Cortex-M4 tienen FPU.

Nuestra es la decisión de activar o no la FPU. Para que sea fácil, se sugiere editar el archivo de configuración system_stm32f4xx.c y añadir a la función SystemInit() el siguiente fragmento de código (comprueba antes si ya están presentes estas líneas en este fichero)

  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

Así, cualquiera que sea la configuración que se tenga en el compilador, el programa no fallará. Esto deberíamos tenerlo presente siempre que adaptemos programas del M3 o del M4 y añadamos «floats».

Si la intención es aprovechar la FPU, es muy importante informarse antes sobre sus características para sacarle partido, o lograremos todo lo contrario. Todos los fabricantes de M4F suelen tener  una nota de aplicación al respecto. Si se va a usar el STM32F4xx, se sugiere leer la nota de aplicación sobre el uso de la unidad de coma flotante.