Ich habe ein Problem mit dem Schreiben von Interrupt-Handlern im Keil ARM-Compiler für LPC1114. Wenn ich ein Programm in C++ schreibe und die Compiler-Option --cpp angebe, verschwindet der gesamte Code von Interrupt-Handlern und wird durch eine Endlosschleife ersetzt. Ich habe ein einfaches Programm geschrieben, das meine Probleme veranschaulicht.
#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();
}
Beim Versuch, diesen Code mit der Compileroption --cpp zu kompilieren, erhalte ich eine Endlosschleife in Disasm:
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Dies ist der Ort, an dem __NOP() aus dem obigen Programm sein muss. Und es ist da, wenn ich Code mit der Compileroption --c99 oder ohne zusätzliche Optionen kompiliere. Die Keil-MDK-Version ist 4.12. Kann mir jemand sagen, gibt es eine Lösung oder Problemumgehung?
Die "schwache" Referenz bedeutet nur, dass die Routine durch eine gleichnamige Routine in Ihrem Code ersetzt wird. Wenn Sie C verwenden, ist dies einfach, die Namen sind immer identisch, aber der C++-Name verstümmelt die Funktionen (zum Überladen von Funktionen usw.), sodass der kompilierte Name wahrscheinlich nicht mit dem Standard-ISR-Namen übereinstimmt. Sie müssen die Funktion (oder zumindest eine Vorwärtsreferenz, ich bin mir der Einzelheiten nicht sicher, da ich hauptsächlich in C arbeite) in einen externen "C"-Wrapper umschließen, um den Compiler zu zwingen, den Namen nicht zu manipulieren.
extern "C" {
void SysTick_Handler(void)
{
// do whatever
}
}
Nick T
volatile
darin zu deklarieren.x4mer
x4mer
Kevin Vermeer