Wie aktiviere ich die Ausnahmebehandlung auf dem Arduino Due?

Jan 07 2021

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

5 PMF Jan 07 2021 at 15:04

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.12Datei und erstellen Sie eine neue Datei platform.local.txtmit 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 -fexceptionszur 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.