es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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 y EXTI15_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 en startup.cpp. Luego, declarar esas funciones en otro archivo cpp, digamos main.cpp, con el mismo nombre de función que EXTI0_IRQHandler y EXTI15_10_IRQHandler, respectivamente. Este método permitirá que el archivo main.cpp sobrescriba las funciones EXTI0_IRQHandler y EXTI15_10_IRQHandler, mientras que el archivo startup.cpp seguirá conteniendo la definición de la función Default_Handler.

    Ejemplos de fragmentos de código:

    startup.cpp

    void Default_Handler(void)
    {
        while(1);
    }
    
    void EXTI0_IRQHandler(void);
    void EXTI15_10_IRQHandler(void);
    

    main.cpp

    extern "C" {
        void EXTI0_IRQHandler(void)
        {
            // Su implementación personalizada de la función EXTI0_IRQHandler
        }
    
        void EXTI15_10_IRQHandler(void)
        {
            // Su implementación personalizada de la función EXTI15_10_IRQHandler
        }
    }
    

    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.

Comments are closed.