반응형

아두이노 IDE에서 여러 번 다른 스케치의 업로드를 반복하다 보면 알 수 없는 stack 에러가 발생하게 된다. 필자는 ESP32 보드에서도 발생한 적이 있었으며, 전날까지 잘되었던 NodeMcu의 와이파이 제어 테스트가 오늘은 안 되는 것이다. 

 

기본 예제파일을 올린 뒤 살펴본 후 어제 테스트한 파일을 업로드하고 안드로이드 앱으로 연결을 시도했으나 응답 요청에 대한 응답을 받지 못해 시간 초과로 wifi 제어 프로세스가 종료되거나 잠깐 연결은 되었으나 버튼 몇 개 누르면 stack 오류 또는 응답 시간 초과로 프로세스가 종료되고 한참 뒤에 시리얼 모니터에 버튼에 대한 반응이 출력되곤 했다.  또 다른 증상으로는 soft AP에 대한 스마트폰 와이파이 연결이 잘 안 된다는 것이다. 여러 번 시도해야 연결되거나 한참을 기다려야 연결이 되는 증상이 나타났다. 

 

여러 번 시도해 보고 스케치의 코드도 재차 확인해 보았으나 별 다른 특이사항을 찾을 수가 없었다. 그도 그럴 것이 수정한 것도 없었기 때문이다. 혹시나 하여 NodeMcu에 연결된 LED와 가변저항을 제거해서도 테스트해보았으나 결과는 같았다. 그러던 중 예전에 ESP32 보드에서 stack 오류 발생 시 해결했던 방법이 생각이나 그 방법을 적용해 보았다.

 

그때 당시 ESP32 보드에서의 stack 오류 해결을 위해 인터넷에서 검색해 본 결과, 아두이노 IDE에서 ESP32 보드에 스케치를 올릴 때 보통 flash를 지운 뒤 업로드를 하나 지워지지 않은 영역(주로 wifi 관련 ssid 또는 password 저장 영역 - 이전 접속 시 설정했던 정보들이 남아있는 경우)이 발생할 수 있고 이로 인해 stack오류가 발생할 수 있다는 글을 본 적이 있다. 해결책으로 flash를 완전히 지우는 프로그램을 사용하여 깨끗이 지운 뒤 스케치를 업로드해보라는 것이었고 ESP8266 보드에도 적용된다는 내용이었다.

 

 

그때 다운로드해놓은 프로그램을 사용하여 NodeMcu의 flash를 지우고 반나절을 허비한 끝에 해결하게 되었다.

 

새로 업로드한 스케치가 wifi 관련 기본 예제였었고 ssid와 password가 변경된 상태였으며 그때 저장된 wifi ssid 및 password 데이터가 삭제되지 않고 남아있어 발생한 오류인 거 같다. 

 

만약, 상기의 증상이 나타나게 되면 첨부한 프로그램을 사용하여 flash를 모두 지운 뒤 스케치를 업로드해보기 바란다.

 

사용방법은 아래 그림을 참조하기 바란다. 프로그램 실행 시 아두이노 IDE 시리얼 모니터는 종료시켜야 한다.

 

 


 

flash_download_tools_v3.6.3_0.rar
6.61MB

 

 

 

 

 

 

 

 

 

 

ESP8266 및 ESP32 리부팅 오류 발생 코드 위치 확인 프로그램 EspExceptionDecoder

 

ESP8266 및 ESP32에 아두이노를 이용하여 프로그래밍하다 보면 예상치 못하는 오류를 맞이 하게 된다. 

주요 오류로는 

1. 컴파일 시 발생 오류: 변수 누락 또는 오탈자, 스케치를 위한 공간 부족 등으로 아두이노 IDE 프로그램에서 관련 오류에 표시를 해주므로 쉽게 파악이 가능하다.

특이한 오류로써 SPIFF 파일 시스템을 사용할 때 발생하는 아래 오류는 SPIFF로 데이터 저장 및 불러오는 코드가 과도할 때? 발생하는 것 같다. 아래 오류가 발생한다면 오류가 발생하는 시점에 작업했던 SPIFF 관련 함수를 최적화해주어야 한다(FS.h 라이브러리에서 발생한 것을 알 수 있다). SPIFF 관련 함수 내에 데이터 소팅을 위한 외부함수를 사용하는 경우라면 외부함수를 사용하지 않고 외부함수에서 사용한 데이터 소팅을 위한 코드를 이용하여 직접 데이타 소팅을 해주면 해결될 수 있다. 즉,  SPIFF 관련 함수에 사용하는 외부 함수의 개수를 줄여 주어 오류를 해결할 수 있었다. 

sketch\esp32_clock_basic84.ino.cpp.o: In function `fs::File::~File()':
C:\Users\Sudo\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\FS\src/FS.h:47:(.text._ZN2fs4FileD0Ev[fs::File::~File()]+0xa): dangerous relocation: l32r: literal target out of range (try using text-section-literals): (.literal._ZN2fs4FileD5Ev+0x4)
collect2.exe: error: ld returned 1 exit status

 

2. 컴파일 후 발생하는 리부팅 오류

다양한 원인으로 발생할 수 있으나 리부팅 시에 시리얼 모니터에 표시되는 정보로는 업로드한 코드의 어느 부분에서 오류가 발생했는지 파악하기가 어렵다. 

Listing directory: /Guru Meditation Error: Core  0 panic'ed (Unhandled debug exception)
Debug exception reason: Stack canary watchpoint triggered (RBE) 
Core 0 register dump:
PC      : 0x40083fbd  PS      : 0x00060636  A0      : 0x00060630  A1      : 0x3ffb2090  
A2      : 0x00000000  A3      : 0x00060623  A4      : 0x00060620  A5      : 0x3ffc013a  
A6      : 0x00000001  A7      : 0x3ffbdc54  A8      : 0x800d2da0  A9      : 0x3ffb2220  
A10     : 0x00000014  A11     : 0x40083a10  A12     : 0x000000fe  A13     : 0x3ffc009c  
A14     : 0x7f800000  A15     : 0x00000000  SAR     : 0x00000008  EXCCAUSE: 0x00000001  
EXCVADDR: 0x00000000  LBEG    : 0x40002390  LEND    : 0x4000239f  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x40083fbd:0x3ffb2090 0x0006062d:0x3ffb2160 0x40089b6b:0x3ffb2180 0x4008a1a2:0x3ffb21a0 0x40081ce1:0x3ffb21c0 0x40081d12:0x3ffb21e0 0x40083a15:0x3ffb2200 0x4000beaf:0x3ffb2220 0x400d2d9d:0x3ffb2240 0x400d2dcf:0x3ffb2280 0x400d374c:0x3ffb22b0 0x400d2185:0x3ffb22d0 0x400d21d9:0x3ffb22f0 0x400d22b9:0x3ffb2310 0x400d27f1:0x3ffb2330 0x400d2894:0x3ffb2360 0x400d299d:0x3ffb2380 0x400d0f94:0x3ffb23a0 0x400d0fc3:0x3ffb23c0 0x40086b59:0x3ffb23e0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4

 

EspExceptionDecoder를 사용하면 리부팅되기 전까지의 기록인 "Backtrace" 정보를 이용하여 어떤 코드들이 실행되고 있었는지를 확인할 수 있다.  

 

구글에서 EspExceptionDecoder 검색

https://github.com/me-no-dev/EspExceptionDecoder

"releases page" 클릭

 EspExceptionDecoder-2.0.2.zip 다운로드

압축해제 후 EspExceptionDecoder-2.0.2 폴더 안의 EspExceptionDecoder 폴더 복사

아두이노 IDE의 파일 -> 환경설정에서 스케치 저장 폴더(기본값 Documents\Arduino) 확인

파일 탐색기로 해당 폴더로 이동

해당 폴더에 tools 폴더가 없다면 tools 폴더 생성하고 tools폴더에 앞서 복사했던 EspExceptionDecoder폴더를 붙여 넣기

아두이노 IDE종료 후 다시 실행하고 "툴" 메뉴를 클릭하면 "Esp Exception Decoder"라는 메뉴가 추가된 걸 볼 수 있다.

 스케치가 업로드되지 않은 상태에서 "Esp Exception Decoder" 메뉴를 클릭하게 되면 

 Select ELF라는 창만 활성화되고 프로그램이 실행되지 않는다. 

이 프로그램 자체가 업로드된 스케치에서 리부팅 발생 시 실행 코드 이력을 확인하는 것이므로 우선 스케치가 업로드되어 있어야 한다. 스케치가 업로드 되어 있다면 아래와 같은 창이 활성화된다. 

오류가 발생하여 모듈이 리부팅된다면 이때 시리얼 모니터에 표시된 "Backtrace"을 복사하여 "Paste your stack trace here"에 붙여 넣기 하고 엔터를 쳐주면 해당 내용이 표시된다. 

Backtrace: 0x40083fbd:0x3ffb2090 0x0006062d:0x3ffb2160 0x40089b6b:0x3ffb2180 0x4008a1a2:0x3ffb21a0 0x40081ce1:0x3ffb21c0 0x40081d12:0x3ffb21e0 0x40083a15:0x3ffb2200 0x4000beaf:0x3ffb2220 0x400d2d9d:0x3ffb2240 0x400d2dcf:0x3ffb2280 0x400d374c:0x3ffb22b0 0x400d2185:0x3ffb22d0 0x400d21d9:0x3ffb22f0 0x400d22b9:0x3ffb2310 0x400d27f1:0x3ffb2330 0x400d2894:0x3ffb2360 0x400d299d:0x3ffb2380 0x400d0f94:0x3ffb23a0 0x400d0fc3:0x3ffb23c0 0x40086b59:0x3ffb23e0

 

 

+ Recent posts