¿Error en el compilador Keil ARM con controladores de interrupción y C ++?

8

Tengo un problema con la escritura de controladores de interrupción en el compilador Keil ARM para LPC1114. Cuando escribo un programa en C ++ y especifico la opción del compilador --cpp, todo el código de los controladores de interrupción desaparece, se reemplaza con un bucle infinito. Escribí un programa simple que ilustra mis problemas.

#include "LPC11xx.h"           // LPC11xx definitions
#define SYSTICK_DELAY 120000   // for 10 ms systick @ 12MHz osc

void SysTick_Handler(void)
{
  __NOP();
}

int main (void) 
{
  SystemInit();                   // from system_LPC11xx.c
  SysTick_Config(SYSTICK_DELAY);  // from core_cm0.h
  // Loop forever
  while (1) __NOP();
}

Al tratar de compilar este código con la opción del compilador --cpp, obtengo un bucle infinito en el desorden:

SysTick_Handler PROC
            EXPORT  SysTick_Handler           [WEAK]
            B       .
            ENDP

Este es el lugar donde debe estar __NOP () del programa anterior. Y está ahí cuando compilo el código con la opción del compilador --c99 o sin opciones adicionales. La versión de Keil MDK es 4.12. ¿Alguien puede decirme si hay alguna solución o solución?

    
pregunta x4mer

1 respuesta

14

La referencia "débil" solo significa que la rutina será reemplazada por una rutina en su código del mismo nombre. Cuando usar C, esto es simple, los nombres siempre serán idénticos, pero el nombre de C ++ maneja las funciones (para la sobrecarga de funciones, etc.), por lo que el nombre compilado probablemente no coincidirá con el nombre ISR predeterminado. Necesitas envolver la función (o al menos una referencia hacia adelante, no estoy seguro de los detalles específicos sobre los que trabajo principalmente en C) en un envoltorio externo "C" para forzar al compilador a no destrozar el nombre.

extern "C" {
  void SysTick_Handler(void)
  {
    // do whatever
  }
}
    
respondido por el timrorr

Lea otras preguntas en las etiquetas