Arduino Due'de istisna işleme nasıl etkinleştirilir?

Jan 07 2021

Buradaki soru bazı ipuçları verirken, orada sağlanan çözüm, farklı bir derleyici ve araç takımı kullandığı için doğrudan Due üzerinde çalışmaz. Ayrıca Due, çoğu proje için gereğinden fazla flaşa sahiptir, böylece istisna işleme için gereken ekstra kod kabul edilebilir. Ancak AVR tabanlı kartlarda olduğu gibi, Arduino IDE kullanılırken derleyici bayraklarına otomatik olarak "-fno-istisnaları" eklenir ve derleme için herhangi bir atma veya yakalama talimatı engellenir.

Due'da istisna desteğini nasıl etkinleştirebilirim?

Yanıtlar

5 PMF Jan 07 2021 at 15:04

İlk olarak, "-fno-exceptions" derleyici bayrağının "-fexceptions" ile üzerine yazıldığından emin olmalıyız. Ek olarak, yığın çözme için derleyici destek işlevlerini içeren ayrı bir kitaplık bağlamalıyız.

Bu içeriğe sahip C:\Users\<UserName>\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.12yeni bir dosyaya gidin ve oluşturun platform.local.txt:


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}

Son satır, ilgili satırla eşleşmeli ve sonunda platform.txtbir fazlalık olmalıdır {linker.elf.extralibs}(araç setini yükseltmek bu satırı güncelleyebilir, bu nedenle diğer parametreleri karşılaştırmanız gerekebilir).

Bu satırlar -fexceptions, derleyiciye komut satırını ve supc++kitaplığı bağlayıcı girişine ekler (aksi takdirde çözümlenmemiş harici öğelerle ilgili hatalar alırsınız). Bu değişikliklerden sonra projenizi yeniden oluşturabilir ve istisna işlemeyi kullanabilirsiniz.

Bazı kullanım ipuçları

Due'deki istisna desteği, yaklaşık 40k ekstra flash bellek gerektirir. 512k'ye sahip olduğu için, bu genellikle kabul edilebilir. Biraz fazladan RAM de kullanılıyor, ancak bu da yeterince küçük görünüyor.

Tanımlanmış standart istisna sınıfları olmadığından (ve ArduinoSTL kütüphanesi kullanıma hazır durumda derlenmediğinden), kendi istisna sınıflarınızı yazmanız gerekecek, yani şöyle bir şey:

class Exception
{
  private:
  const char* _msg;
  public:
  Exception(const char* msg)
  {
    _msg = msg;
  }

  const char* Message() const
  {
    return _msg;
  }
};

Kullanım şekli:


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

İşlenmeyen istisnaların programı sonlandıracağını unutmayın . İşlenmeyen bir istisna, nedene bağlı olarak seri konsola karşılık gelen bir mesaj çıkmasına ve ardından bir çıkmaz hata durumuna girmesine neden olur.