¿Por qué no se está llamando a mi SysTick_Handler () en mi Proyecto LPCxpresso C ++?

5

He creado un proyecto de C ++ para un LPC1227 utilizando LPCExpresso 6.1.0. El proyecto, hasta ahora, construye y funciona bien. No he realizado ningún cambio en cr_startup_lpc12xx.cpp .

Me gustaría agregar un SysTick_Handler() . En mi main.cpp he añadido un método:

void SysTick_Handler(void)
{
    timerCounter++;  // these variables are all declared globally in main.cpp
    timer_10ms_tick = true;
    if ((timerCounter % 10) == 0)  //every 100ms
    {
        timer_100ms_tick = true;
    }
    if ((timerCounter % 100) == 0)  //every 1000ms
    {
        timer_1000ms_tick = true;
    }
}   

También agregué la siguiente línea en mi método main() :

SysTick_Config(12000000/100);  

Cuando ejecuto mi código a través de la depuración, la interrupción se dispara, pero se atasca en el SysTick_Handler() predeterminado que está dentro de cr_startup_lpc12xx.cpp (que es solo un bucle infinito). Si elimino el SysTick_Handler predeterminado de cr_startup_lpc12xx.cpp , fallas graves de mi programa.

He visto el ejemplo de Blinky (que es C, no C ++) y agrega un nuevo controlador a main.cpp sin eliminar el controlador del archivo de inicio.

¿Alguien puede sugerir por qué no se llama a mi controlador principal? ¿Es esta una diferencia de C ++?

    
pregunta TDL

3 respuestas

4

De enlace

  

Debe declarar su controlador de interrupciones como una función C de lo contrario   La función no anulará el controlador predeterminado.

     

Entonces, por ejemplo, podrías hacer algo como lo siguiente para hacer que   declaración de trabajo en C o C ++:

#ifdef __cplusplus
extern "C" {
#endif

void irq_handler();

#ifdef __cplusplus
}
#endif

Supongo que cambiar irq_handler() en el código anterior a tu código SysTick_Handler funcionará. por ejemplo

extern "C" {
    void SysTick_Handler(void)
    {
        timerCounter++;  // these variables are all declared globally in main.cpp
        timer_10ms_tick = true;
        if ((timerCounter % 10) == 0)  //every 100ms
        {
            timer_100ms_tick = true;
        }
        if ((timerCounter % 100) == 0)  //every 1000ms
        {
            timer_1000ms_tick = true;
        }
    }
}
    
respondido por el geometrikal
0

No sé si esto es cierto para C ++, pero en C el controlador predeterminado debe declararse como una función weak en las declaraciones predeterminadas. Esto permite que otra declaración anule la original, por lo que su controlador personalizado no debe tener el atributo débil.

    
respondido por el Joe Hass
0

Tuve exactamente el mismo problema una vez. Sí, es C ++ vs C diferencia. Parece que los mantenedores de las bibliotecas de soporte de LPC no se preocuparon por los desarrolladores de C ++. La respuesta completa está aquí Error en el compilador Keil ARM con ¿Manejar interruptores y C ++?

    
respondido por el x4mer

Lea otras preguntas en las etiquetas