본문 바로가기

나의 플랫폼/C언어

[ESP8266] Exception (29) 발생 시

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ESP8266 라이브러리를 이용하여 Arduino를 개발 하다가 아래와 같은 오류가 발생한 경우가 있다.


Exception (29):
epc1=0x4020678f epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

그런 후, WifiClient가 먹통이 되는 현상이 발생 한다.


구글링을 해보면서, 테스트를 해본 결과~!


Exception (29) 는 Memory leak이 발생된 결과 이다.


loop 함수가 돌아가면서 Memory 관리를 제대로 해주지 않아 Heap에 데이터가 쌓이고,


결국 공간이 없어서 발생한 Exception 인 것이다.




그럼! 어떻게 해결 할까?



문제가 되는 위치에 있는 변수가 전역 변수인지 확인 해봐라!!!



나 같은 경우, WifiClient를 전역변수에 놓고 했더니 발생 했다.


issue : https://github.com/esp8266/Arduino/issues/4689


위 이슈를 보면 WifiClient가 전역 변수로 되어 있는 것을 확인 할 수 있다.



ESP8266 예제 소스를 보면 아래와 같은 형태 이다.


#include <ESP8266WiFi.h>

const char* ssid = "********";
const char* password = "********";

const char* host = "www.example.com";


void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
}


void loop()
{
  WiFiClient client;

  Serial.printf("\n[Connecting to %s ... ", host);
  if (client.connect(host, 80))
  {
    Serial.println("connected]");

    Serial.println("[Sending a request]");
    client.print(String("GET /") + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n" +
                 "\r\n"
                );

    Serial.println("[Response:]");
    while (client.connected())
    {
      if (client.available())
      {
        String line = client.readStringUntil('\n');
        Serial.println(line);
      }
    }
    client.stop();
    Serial.println("\n[Disconnected]");
  }
  else
  {
    Serial.println("connection failed!]");
    client.stop();
  }
  delay(5000);
}

http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/client-examples.html


WifiClient가 전역 변수가 아닌 loop 함수 안에 지역 변수로 되어 있다.


이렇게 해서, client가 stop 처리 되면서 메모리 제거를 해주는 것이다.



참고로 현재 Heap 메모리 사이즈를 체크하는 함수는 아래 와 같다.


Serial.print(String("FreeHeap Thingspeak_1: "));


Serial.println(ESP.getFreeHeap(),DEC);


참고하세요.



'나의 플랫폼 > C언어' 카테고리의 다른 글

Socket Interface Name으로 IP 주소 가져오기.  (0) 2013.03.06
Cache Friendly Code 기법  (0) 2013.03.04
시그널 종류  (0) 2013.01.18