본문 바로가기
개발이야기

[ESP32/idf] Panic, watchdog 이벤트 발생 시 참조할 사항

by 코저씨 2022. 10. 14.
728x90

프로그램을 짜다보면 에러 발생 시 조치를 취해 주어야 한다.

특히 연결된 하드웨어가 모터라던가, 열을 발생하는 장비라던가 특히 인명에 관련된 장비라면, 메모리가 오버플로우가 발생한다던가 워치독이 발생한다던가 해서 시스템이 재부팅이 되거나 멈추게 되었을때, 안정적으로 하드웨어 처리에 대한 예외처리를 해주어야 한다. 

 

ESP32는 Exception 에러를 Panic이라고 하며 panicHandler 를 실행한다. 그래서 해당 함수내에서 장치를 끄는 예외코드를 삽입하면 된다. 

panic_handler.c

또 UART나 I2C같은 통신을 사용 시 노이즈 데이터가 주변 장치로 전달되는 것을 방지하려면 내부 레지스터를 초기화 하는 함수도 ESP32 idf에서 제공한다.

idf.py menuconfig 화면

먼저 Panic handler behaviour를 ~~reboot로 설정하고 panic_restart함수를 보면 아래에 esp_restart_noos_dig 함수가 있다. 이 함수는 모든 디지털 주변레지스터를 초기화 한다고 나와있다. 

다만 이 함수를 사용하려면 digital_reset_needed 변수가 true가 되어야 하는데, 그냥 무조건 실행되도록 설정했다.


또 워치독 이벤트 발생 시 재부팅을 하게 하고 싶으면 아래와 같이 옵션을 주어야 한다.

Component config → ESP System Settings →Invoke panic handler on Task Watchdog timeout (*)

 

728x90