Llamar a la función miembro desde la interrupción en STM32 [cerrado]

0

He creado un nuevo proyecto STM32 usando el cubo. Cambié main.c a main.cpp y habilité --cpp en el compilador. Si algo se queja, agrego extern c para que c ++ pueda verlo.

Tengo un código c ++ que se ejecuta "bien". Sin embargo, ahora que comencé a usar interrupciones, estoy experimentando algunos problemas.

Estoy usando UART y HAL. He definido HAL_UART_RxCpltCallback como extern "C" void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) . Cuando hay un nuevo carácter en UART, la interrupción se ejecuta y la función se llama correctamente. Según tengo entendido, mi código se está ejecutando en c ++ en la devolución de llamada y debería poder acceder a los métodos de mis objetos.

Quiero ejecutar m.onReceiveCharacter() desde la devolución de llamada donde m por ahora es una variable global en el archivo main.cpp . El objeto tiene el método que trato de llamar. Agrego esa línea a la interrupción y puedo ver con el depurador que se llama la función y puedo revisarla correctamente.

Sin embargo, lo que sucede es que a veces (todavía no he encontrado la lógica) algunos de los miembros de m cambian sin ninguna razón aparente. Por ejemplo, tengo un miembro privado UART_HandleTypeDef* huart que apunta al huart correcto al principio cuando inicio y después de una interrupción (incluso antes de que se ejecute m.onReceiveCharacter() ) cambia "aleatoriamente" a otra dirección.

Por lo general, si tengo una función en el bucle principal realizando algunas operaciones en m y la interrupción se produce, el valor de huart cambia repentinamente. El valor de huart nunca se cambia de ninguna manera en el código y esto ocurre antes de que se llame al código de interrupción dentro de la función (pero la función de devolución de llamada ya ingresada). He visto problemas similares con otras variables que tampoco deben cambiarse.

¿Alguna idea?

Resumen: Algunos de los miembros de mi objeto cambian "aleatoriamente" a nuevos valores cuando se produce una interrupción. Cuales son las posibles causas? Estoy usando STM32F030R8, con un proyecto generado por Cube, en la versión 5 del compilador Keil.

    
pregunta Carlos

1 respuesta

2

Después de crear un proyecto muy simple y verlo funcionar, volví al código. Yendo lentamente con el depurador, encontré algunas funciones después de que cada valor fuera aleatorio. ¡Las funciones no hacían nada con esos valores! Y sucedió justo después de ingresar, sin ejecutar ningún código . Entonces me vino, desbordamiento de pila! Doblé la pila y ahora todos los problemas han desaparecido.

    
respondido por el Carlos

Lea otras preguntas en las etiquetas