Warum wird mein SysTick_Handler() in meinem LPCxpresso C++ Projekt nicht aufgerufen?

Ich habe ein C++-Projekt für einen LPC1227 mit LPCExpresso 6.1.0 erstellt. Das Projekt baut und läuft bis jetzt gut. Ich habe keine Änderungen an vorgenommen cr_startup_lpc12xx.cpp.

Ich möchte eine hinzufügen SysTick_Handler(). In meinem main.cpphabe ich eine Methode hinzugefügt:

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;
    }
}   

Ich habe auch die folgende Zeile in meiner main()Methode hinzugefügt:

SysTick_Config(12000000/100);  

Wenn ich meinen Code über Debug ausführe, wird der Interrupt ausgelöst, aber er bleibt in der Vorgabe hängen, SysTick_Handler()die sich innerhalb von befindet cr_startup_lpc12xx.cpp(was nur eine unendliche While-Schleife ist). Wenn ich die Standardeinstellung SysTick_Handleraus lösche cr_startup_lpc12xx.cpp, verursacht mein Programm schwere Fehler.

Ich habe mir das Blinky-Beispiel angesehen (das C, nicht C++ ist) und es fügt einen neuen Handler hinzu, main.cppohne den Handler aus der Startdatei zu löschen.

Kann jemand vorschlagen, warum mein übergeordneter Handler nicht aufgerufen wird? Ist das ein C++-Unterschied?

Wenn Sie zur normalen C-Datei wechseln, funktioniert es? Wenn Sie das Blinky-Beispiel in C++ ändern, erhalten Sie das gleiche Problem?

Antworten (3)

Von https://rowley.zendesk.com/entries/20986562-LPC1114-IRQ-Handlers-in-C-work-in-C-do-not-work

Sie müssen Ihren Interrupt-Handler als C-Funktion deklarieren, sonst überschreibt die Funktion den Standard-Handler nicht.

So könnten Sie beispielsweise Folgendes tun, damit die Deklaration sowohl in C als auch in C++ funktioniert:

#ifdef __cplusplus
extern "C" {
#endif

void irq_handler();

#ifdef __cplusplus
}
#endif

Ich gehe davon aus, dass das Ändern irq_handler()des obigen Codes in Ihren SysTick_HandlerCode dann funktioniert. z.B

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;
        }
    }
}

Ich weiß nicht, ob dies für C++ gilt, aber in C muss der Standardhandler als weakFunktion in den Standarddeklarationen deklariert werden. Dadurch kann eine andere Deklaration die ursprüngliche außer Kraft setzen, sodass Ihr benutzerdefinierter Handler das schwache Attribut nicht haben sollte.

WAHR. Es wird für schwach erklärt.

Ich hatte genau das gleiche Problem einmal. Ja, es ist ein Unterschied zwischen C++ und C. Es sieht so aus, als hätten sich die Betreuer der LPC-Unterstützungsbibliotheken nicht um C++-Entwickler gekümmert. Die vollständige Antwort finden Sie hier. Fehler im Keil ARM-Compiler mit Interrupt-Handlern und C++?