STM32 interrumpe y C ++ no van bien juntos [duplicado]

6

Configuré TIM3 para disparar una interrupción en mi proyecto y simplemente no funcionó. Intenté todo lo que pude y aún no pude encontrar cuál es el problema. Luego creé un proyecto limpio y copié / pegué solo el código que configura TIM3 e interrumpe y funcionó mágicamente. Literalmente, perdí la mitad de un día tratando de encontrar qué causa el problema y resulta que ... a las interrupciones no les gusta C ++.

Escribí mi código en C ++ porque necesitaba clases en mi proyecto, así que naturalmente cambié el nombre de todos mis archivos .cpp a .cpp y también compilé con la directiva --cpp. Todo funcionó bien, sin problemas hasta que decidí usar las interrupciones. Así que renombré todo a .c y todo funcionó, renombré todo a cpp y dejó de funcionar.

Utilizo Keil uVision5 y mis proyectos se generan con STM32CubeMX (solo configuración RCC).

¿Alguien les había pasado esto? ¿Alguna solución?

    
pregunta John

1 respuesta

6

He estado buscando una solución durante medio día, solo para encontrarla unos minutos después de haber publicado esta pregunta. La respuesta está dada por este post:

Error en Keil ¿Compilador ARM con controladores de interrupción y C ++?

  

La referencia "débil" solo significa que la rutina será reemplazada por una   Rutina en su código del mismo nombre. Cuando se usa C esto es simple,   los nombres siempre serán idénticos, pero el nombre de C ++ enmascara las funciones   (para la sobrecarga de funciones, etc.) por lo que el nombre compilado probablemente no   coincide con el nombre ISR predeterminado. Necesitas envolver la función (o al menos   una referencia hacia adelante, no estoy seguro de los detalles, principalmente trabajo en C) en   una envoltura externa "C" para forzar al compilador a no destrozar el nombre.

     

extern "C" {void SysTick_Handler (void) {       // haz lo que sea}}

O simplemente puede declararlo como

extern "C" void SysTick_Handler(void);

Para que no tengas que envolverlo.

    
respondido por el John

Lea otras preguntas en las etiquetas