STM32 se bloquea a Default_Handler

0

Mi STM32F4 Discovery se bloquea cuando intento ejecutar la función sin o sinf con la FPU activada y con la FPU desactivada.

for (; i < 1023; ++i){
    ftemp = sin (c*t);        // Crashes here
    temp =  buffer[i] * ftemp;
    buffer[i] = temp;
    t += step;
}

Cuando uso la función sinf, este bucle se bloquea en su segunda iteración. Cuando se usa el pecado simple, se bloquea después de entre 768 y 1023 iteraciones (lo he probado exhaustivamente). ¿Qué está causando esto?

Nota: Al usar la FPU, la configuré así: enlace

EDITAR:

Desde entonces he descubierto que se está invocando el HardFault_Handler (). Esto es con la FPU completamente deshabilitada

EDITAR:

Aparentemente, estoy accediendo a una dirección de memoria no válida. ¡Leí la PC de la pila y es 0x00000000! ¿Cómo es eso posible? (El contador del programa es la séptima palabra de 32 bits en la pila)

    
pregunta user929404

2 respuestas

2

¿Tiene una función de controlador de systick? De lo contrario, se llamará al controlador predeterminado después de un período de tiempo establecido (al menos con ese archivo de inicio).

Editar, en respuesta a los comentarios:

Todos los microcontroladores ARM Cortex tienen un temporizador de sistema de 24 bits incorporado, al que se hace referencia como systick. El temporizador realiza una cuenta regresiva desde un valor que puede configurar a cero y cuando llega a cero dispara la interrupción del systick. Su objetivo principal es proporcionar sincronización al software; por ejemplo, puede configurarlo para que dispare la interrupción cada milisegundo, lo que puede ser bastante útil para la sincronización o la ejecución de un sistema operativo.

La interrupción del systick debe tener un controlador: en su archivo de inicio está configurado en el controlador predeterminado, que es esencialmente un bucle infinito. El controlador no tiene que hacer nada, solo puede ser una función vacía,

void SysTick_Handler(void)
{
}

pero para la mayoría de los usos, querrá incrementar su propio contador, para hacer un seguimiento de milisegundos, por ejemplo,

uint32_t sys_count=0;
void SysTick_Handler(void)
{
    ++sys_count;
}

o ejecute parte del sistema operativo.

    
respondido por el Ian G
2

Para determinar la causa de la falla, debe crear controladores separados para cada una de las fallas en lugar de asignarlos al controlador predeterminado. Luego, cuando se produce el fallo, podrá determinar la causa buscando el controlador que se ejecutó. Si se produce un fallo grave, puede consultar varios registros para encontrar los detalles de la causa del fallo.

Editar: es un poco difícil localizar una falla dura. Aquí hay una buena explicación: Debugging Hard Fault & Otras excepciones en los microcontroladores ARM Cortex-M3 y ARM Cortex-M4

    
respondido por el Joe Hass

Lea otras preguntas en las etiquetas