Ich habe ein Problem beim Schreiben von Interrupt-Handlern im Keil ARM-Compiler für LPC1114. Wenn ich ein Programm in C ++ schreibe und die Compileroption --cpp spezifiziere, verschwindet der gesamte Code der Interrupt-Handler 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 Unordnung:
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. Keil MDK Version ist 4.12. Kann mir jemand sagen, ob es eine Lösung oder Problemumgehung gibt?
c++
interrupts
keil
x4mer
quelle
quelle
volatile
darin zu deklarieren .Antworten:
Die "schwache" Referenz bedeutet lediglich, dass die Routine durch eine Routine in Ihrem gleichnamigen Code ersetzt wird. Wenn Sie C verwenden, ist dies einfach. Die Namen sind immer identisch, aber der C ++ - Name beeinträchtigt 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 nicht sicher, welche Besonderheiten ich hauptsächlich in C arbeite) in einen externen "C" -Wrapper einschließen, um den Compiler zu zwingen, den Namen nicht zu entstellen.
quelle