Wie aktiviere ich die Ausnahmebehandlung auf dem Arduino Due?
Während die Frage hier einige Hinweise gibt, funktioniert die dort bereitgestellte Lösung nicht direkt auf dem Due, da ein anderer Compiler und ein anderes Toolkit verwendet werden. Außerdem verfügt der Due über mehr als genug Flash für die meisten Projekte, sodass der für die Ausnahmebehandlung erforderliche zusätzliche Code akzeptabel ist. Aber wie bei den AVR-basierten Karten werden bei Verwendung der Arduino-IDE automatisch "-fno-Ausnahmen" zu den Compiler-Flags hinzugefügt, um zu verhindern, dass Anweisungen zum Kompilieren geworfen oder abgefangen werden.
Wie kann ich die Ausnahmeunterstützung für die Fälligkeit aktivieren?
Antworten
Zuerst müssen wir sicherstellen, dass das Compiler-Flag "-fno-Ausnahmen" mit "-fexceptions" überschrieben wird. Darüber hinaus müssen wir eine separate Bibliothek verknüpfen, die die Compiler-Unterstützungsfunktionen zum Abwickeln des Stapels enthält.
Navigieren Sie zu dieser C:\Users\<UserName>\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.12
Datei und erstellen Sie eine neue Datei platform.local.txt
mit folgendem Inhalt:
compiler.cpp.extra_flags=-fexceptions
linker.elf.extralibs=-lsupc++
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -mcpu={build.mcu} -mthumb {compiler.c.elf.flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group {compiler.combine.flags} {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.path}/{archive_file}" -Wl,--end-group -lm -lgcc {linker.elf.extralibs}
Die letzte Zeile sollte mit der entsprechenden Zeile in übereinstimmen platform.txt
, mit einem zusätzlichen {linker.elf.extralibs}
am Ende (durch Aktualisieren des Toolkits wird diese Zeile möglicherweise aktualisiert, sodass Sie möglicherweise die anderen Parameter vergleichen müssen).
Diese Zeilen fügen die -fexceptions
zur Compiler-Befehlszeile und die supc++
Bibliothek zur Linker-Eingabe hinzu (andernfalls erhalten Sie Fehler über nicht aufgelöste externe Elemente). Nach diesen Änderungen können Sie Ihr Projekt neu erstellen und die Ausnahmebehandlung verwenden.
Einige Verwendungshinweise
Die Ausnahmeunterstützung für den Due erfordert ca. 40 KB zusätzlichen Flash-Speicher. Da es 512k hat, ist dies normalerweise akzeptabel. Ein bisschen zusätzlicher RAM wird ebenfalls verwendet, aber das scheint auch klein genug zu sein.
Da keine Standardausnahmeklassen definiert sind (und die ArduinoSTL-Bibliothek nicht sofort kompiliert werden kann), müssen Sie Ihre eigenen Ausnahmeklassen schreiben, z.
class Exception
{
private:
const char* _msg;
public:
Exception(const char* msg)
{
_msg = msg;
}
const char* Message() const
{
return _msg;
}
};
Benutzen als:
void ThrowExceptionFunc()
{
throw Exception("Something bad happened");
}
void ValidateExceptionHandling()
{
try
{
ThrowExceptionFunc();
Serial.print("Exception was not thrown:");
}
catch(Exception& ex)
{
Serial.print("Exception happened:");
Serial.println(ex.Message());
}
}
Beachten Sie, dass nicht behandelte Ausnahmen das Programm beenden . Eine nicht behandelte Ausnahme führt dazu, dass der Due eine entsprechende Nachricht an die serielle Konsole ausgibt und dann in einen Deadend-Fehlerstatus wechselt.