Arduino ड्यू पर अपवाद हैंडलिंग को कैसे सक्षम करें?

Jan 07 2021

जबकि यहां प्रश्न कुछ संकेत देता है, वहां प्रदान किया गया समाधान सीधे ड्यू पर काम नहीं करता है, क्योंकि यह एक अलग संकलक और टूलकिट का उपयोग करता है। इसके अलावा, ड्यूज के पास अधिकांश परियोजनाओं के लिए पर्याप्त से अधिक फ्लैश है, ताकि अपवाद हैंडलिंग के लिए आवश्यक अतिरिक्त कोड स्वीकार्य हो। लेकिन AVR- आधारित बोर्डों के साथ, "-fno- अपवाद" को Arduino IDE का उपयोग करते समय संकलक झंडे में स्वचालित रूप से जोड़ दिया जाता है, जिससे किसी भी फेंक या संकलन के निर्देशों को संकलित करने से रोका जा सके।

मैं देय पर अपवाद समर्थन को कैसे सक्षम कर सकता हूं?

जवाब

5 PMF Jan 07 2021 at 15:04

सबसे पहले, हमें यह सुनिश्चित करना चाहिए कि "-fno-अपवाद" कंपाइलर ध्वज "-fexception" के साथ ओवरराइट किया गया है। इसके अलावा, हमें एक अलग लाइब्रेरी को लिंक करना होगा जिसमें स्टैक अनइंडिंग के लिए कंपाइलर समर्थन फ़ंक्शन शामिल हैं।

नेविगेट करने के लिए C:\Users\<UserName>\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.12और एक नई फ़ाइल बनाना 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}

अंतिम पंक्ति को अंत में platform.txtएक अतिरिक्त के साथ, इसी लाइन से मेल खाना चाहिए {linker.elf.extralibs}(टूलकिट को अपग्रेड करने से वह लाइन अपडेट हो सकती है, इसलिए आपको अन्य मापदंडों की तुलना करने की आवश्यकता हो सकती है)।

ये लाइनें -fexceptionsसंकलक supc++इनपुट के लिए कंपाइलर कमांड लाइन और लाइब्रेरी को जोड़ते हैं (अन्यथा आपको अनसुलझे एक्सटर्नल के बारे में त्रुटियां मिलेंगी)। इन परिवर्तनों के बाद, आप अपनी परियोजना का पुनर्निर्माण कर सकते हैं और अपवाद हैंडलिंग का उपयोग कर सकते हैं।

कुछ उपयोग संकेत

ड्यू पर अपवाद समर्थन को लगभग 40k अतिरिक्त फ्लैश मेमोरी की आवश्यकता होती है। यह देखते हुए 512k है, यह आमतौर पर स्वीकार्य है। थोड़ी अतिरिक्त रैम का भी उपयोग किया जाता है, लेकिन यह काफी छोटा लगता है।

चूंकि कोई मानक अपवाद वर्ग परिभाषित नहीं हैं (और ArduinoSTL पुस्तकालय नियत आउट-ऑफ-द-बॉक्स पर संकलित नहीं करता है), आपको अपने स्वयं के अपवाद वर्गों को लिखना होगा, अर्थात ऐसा कुछ:

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

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

के रूप में उपयोग:


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

ध्यान दें कि बिना किसी अपवाद के प्रोग्राम समाप्त हो जाएगा । धारावाहिक कंसोल के लिए एक संबंधित संदेश आउटपुट के कारण एक अखंडित अपवाद का कारण होगा और फिर एक मृत विफल स्थिति दर्ज करें।