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.cpp
habe 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_Handler
aus 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.cpp
ohne den Handler aus der Startdatei zu löschen.
Kann jemand vorschlagen, warum mein übergeordneter Handler nicht aufgerufen wird? Ist das ein C++-Unterschied?
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_Handler
Code 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 weak
Funktion 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.
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++?
geometrisch