Arduino Due에서 예외 처리를 활성화하는 방법은 무엇입니까?
여기에 있는 질문 은 몇 가지 힌트를 제공 하지만, 거기에 제공된 솔루션은 다른 컴파일러와 툴킷을 사용하기 때문에 Due에서 직접 작동하지 않습니다. 또한 Due에는 대부분의 프로젝트에 대해 충분한 플래시가 있으므로 예외 처리에 필요한 추가 코드가 허용됩니다. 그러나 AVR 기반 보드와 마찬가지로 Arduino IDE를 사용할 때 "-fno-exceptions"가 컴파일러 플래그에 자동으로 추가되어 컴파일 할 던지거나 캐치 명령을 방지합니다.
마감일에 예외 지원을 활성화하려면 어떻게해야합니까?
답변
먼저 "-fno-exceptions"컴파일러 플래그를 "-fexceptions"로 덮어 써야합니다. 또한 스택 해제를위한 컴파일러 지원 함수를 포함하는 별도의 라이브러리를 연결해야합니다.
다음 콘텐츠로 이동하여 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++
링커 입력에 라이브러리를 추가합니다 (그렇지 않으면 해결되지 않은 외부에 대한 오류가 발생합니다). 이러한 변경 후 프로젝트를 다시 빌드하고 예외 처리를 사용할 수 있습니다.
사용 힌트
Due에 대한 예외 지원에는 약 40k의 추가 플래시 메모리가 필요합니다. 512k가있는 경우 일반적으로 허용됩니다. 약간의 추가 RAM도 사용되지만 충분히 작은 것 같습니다.
정의 된 표준 예외 클래스가 없기 때문에 (그리고 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());
}
}
참고 처리되지 않은 예외가 프로그램을 종료합니다 . 처리되지 않은 예외는 직렬 콘솔에 해당 메시지를 출력 한 다음 데드 엔드 실패 상태로 들어가기 때문에 발생합니다.