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.