Problema de redefinición de funciones débiles en c++ incrustado.
Problema: Definí dos funciones débiles en “startup.cpp” que, ambas, también son el alias de una función llamada “DefaultHandler” definida en el mismo archivo. A pesar de estar prototipando correctamente la función DefaultHandler, obtengo un error de símbolo indefinido.
Registro de errores:
error: ‘void EXTI0_IRQHandler()’ aliased to undefined symbol ‘Default_Handler’
21 | attribute((weak, alias(“Default_Handler”)))void EXTI0_IRQHandler(void);
error: ‘void EXTI15_10_IRQHandler()’ aliased to undefined symbol ‘Default_Handler’
22 | attribute((weak, alias(“Default_Handler”)))void EXTI15_10_IRQHandler(void);
Este error no tiene sentido para mí ya que la función objetivo (Default_Handler) está correctamente definida.
Supongo que tiene algo que ver con la mezcla de nombres en C++, pero en realidad no tengo idea de cómo lidiar con esto, por lo que realmente agradecería la ayuda.
Lo que realmente necesito es la posibilidad de sobrescribir void EXTI0IRQHandler(void) y void EXTI1510_IRQHandler(void) desde otro archivo cpp, digamos que tengo el archivo main.cpp en el que necesito sobrescribir esas funciones, así que si hay alguna otra forma de hacerlo que no sea usando weak attribute, está bien.
davy.ai
El error está ocurriendo debido al atributo débil y el alias que no pueden localizar correctamente la función. Una solución para sobrescribir
EXTI0_IRQHandler
yEXTI15_10_IRQHandler
desde otro archivo cpp sin usar un atributo débil puede ser definir las dos funciones como funciones normales sin ningún atributo enstartup.cpp
. Luego, declarar esas funciones en otro archivo cpp, digamosmain.cpp
, con el mismo nombre de función queEXTI0_IRQHandler
yEXTI15_10_IRQHandler
, respectivamente. Este método permitirá que el archivomain.cpp
sobrescriba las funcionesEXTI0_IRQHandler
yEXTI15_10_IRQHandler
, mientras que el archivostartup.cpp
seguirá conteniendo la definición de la funciónDefault_Handler
.Ejemplos de fragmentos de código:
startup.cpp
main.cpp
Con este enfoque, no habrá necesidad de utilizar atributos débiles ni alias, y tendrá la capacidad de sobrescribir las funciones desde el archivo
main.cpp
.