Description
-
Hardware: ESP8266EX
-
Core Version: SDK:2.2.2-dev(38a443e)/Core:2.6.3=20603000/lwIP:STABLE-2_1_2_RELEASE/glue:1.2-16-ge23a07e/BearSSL:89454af
-
Development Env: Arduino IDE
-
Operating System: Windows
-
Module: LOLIN Wemos D1 mini Pro & Wemos D1 r2 mini
-
Flash Size: 16MB
-
lwip Variant: v2 Lower Memory and Higher Bandwidth
-
Flash Frequency: 40Mhz
-
CPU Frequency: 80Mhz
-
Upload Using: SERIAL
-
Upload Speed: 460800
At v2 Lower Memory and Higher Bandwidth I saw memory leak each LOOP - 32 bytes or more. Try many options, with or without debug and so on... After ~26 minutes of run ESP goes to :oom and reboot with dump. Sometimes one or two or three loops go without a leak, but than mem leak continues.
If I switch to IwIP variant 1.4 Higher Bandwidth - memory leak stops and all work fine!
( SDK:2.2.2-dev(38a443e)/Core:2.6.3=20603000/lwIP:1.4.0rc2/BearSSL:89454af - that variant work fine) I can provide debug log but it will be the same as below, exclude memory leak.
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#define ESP8266
#define DEBUG 1
const char* ssid = "zzzzzz";
const char* password = "xxxxxxx";
const char* mqtt_server = "111.222.222.222";
const char* mqtt_user = "zzzz";
const char* mqtt_pass = "zzzz";
const char* mqtt_clientId = "gost-temp";
const char* mqtt_ping_topic = "apr/home/ping";
const char* mqtt_online_message = "online";
const char* mqtt_last_will = "offline";
const char* mqtt_topic_base = "apr/home/";
const int ping_time = 30;
bool firstRun = true;
WiFiClient espClient;
PubSubClient client(espClient);
uint32_t originalram;
unsigned long lastMeasure = 0;
void setup_wifi() {
int zz = 0;
delay(10);
#ifdef DEBUG
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
#endif
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
delay(500);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
#ifdef DEBUG
Serial.print(".");
#endif
zz=zz+1;
if (zz >= 100) {
ESP.restart();
}
Serial.print(zz);
}
#ifdef DEBUG
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
#endif
delay(1000);
}
void reconnect() {
delay(500);
while (!client.connected()) {
#ifdef DEBUG
Serial.print("Attempting MQTT connection...");
#endif
String mqtt_clientIdRand = mqtt_clientId;
mqtt_clientIdRand += String(random(0xffff), HEX);
if (client.connect(String(mqtt_clientIdRand).c_str(), mqtt_user, mqtt_pass, (String(mqtt_ping_topic)).c_str(), 0, 1, mqtt_last_will)) {
#ifdef DEBUG
Serial.println("connected");
#endif
} else {
#ifdef DEBUG
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
#endif
delay(5000);
}
}
}
void setup() {
randomSeed(millis());
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
if (!client.connected()) {
reconnect();
}
client.loop();
client.publish(mqtt_ping_topic, mqtt_online_message);
client.loop();
originalram = ESP.getFreeHeap();
}
void loop() {
if ((millis() - lastMeasure) > (ping_time * 1000)) {
lastMeasure = millis();
client.loop();
client.publish(mqtt_ping_topic, mqtt_online_message);
client.loop();
uint32_t ram = ESP.getFreeHeap();
Serial.printf("RAM: %d change %d\n", ram, (ram - originalram ));
}
delay(30);
}
Debug log:
07:49:35.414 -> SDK:2.2.2-dev(38a443e)/Core:2.6.3=20603000/lwIP:STABLE-2_1_2_RELEASE/glue:1.2-16-ge23a07e/BearSSL:89454af
07:49:35.414 ->
07:49:35.414 -> Connecting to XXXXX
07:49:35.414 -> bcn 0
07:49:35.414 -> del if1
07:49:35.414 -> usl
07:49:35.414 -> mode : sta(84:f3:eb:db:5a:3c)
07:49:35.414 -> add if0
07:49:35.586 -> wifi evt: 8
07:49:36.171 -> .1.2wifi evt: 2
07:49:36.378 -> .3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23scandone
07:49:39.389 -> state: 0 -> 2 (b0)
07:49:39.389 -> .24state: 2 -> 3 (0)
07:49:39.389 -> state: 3 -> 5 (10)
07:49:39.389 -> add 0
07:49:39.389 -> aid 1
07:49:39.389 -> cnt
07:49:39.492 -> .25
07:49:39.492 -> connected with XXXXXX, channel 6
07:49:39.561 -> dhcp client start...
07:49:39.561 -> wifi evt: 0
07:49:39.561 -> .26ip:192.168.88.122,mask:255.255.255.0,gw:192.168.88.1
07:49:39.596 -> wifi evt: 3
07:49:39.666 -> .27
07:49:39.666 -> WiFi connected - ESP IP address: 192.168.88.122
07:49:41.182 -> Attempting MQTT connection...[hostByName] Host: 111.111.111.111 is a IP!
07:49:41.182 -> :ref 1
07:49:41.216 -> :wr 70 0
07:49:41.216 -> :wrc 70 70 0
07:49:41.216 -> :ack 70
07:49:41.216 -> :rn 4
07:49:41.216 -> :c0 1, 4
07:49:41.216 -> connected
07:49:41.216 -> :wr 23 0
07:49:41.216 -> :wrc 23 23 0
07:49:41.285 -> :ack 23
07:49:49.372 -> pm open,type:2 0
07:50:03.705 -> :rcl
07:50:03.705 -> :abort
07:50:05.117 -> RAM: 50008 change 1296
07:50:35.151 -> RAM: 49976 change 1264
07:51:05.188 -> RAM: 49944 change 1232
07:51:35.216 -> RAM: 49944 change 1232
07:52:05.217 -> RAM: 49944 change 1232
07:52:35.249 -> RAM: 49880 change 1168
07:53:05.287 -> RAM: 49816 change 1104
07:53:35.307 -> RAM: 49784 change 1072
07:54:05.336 -> RAM: 49784 change 1072
07:54:35.374 -> RAM: 49688 change 976
07:55:05.382 -> RAM: 49560 change 848
07:55:35.429 -> RAM: 49464 change 752
07:56:05.438 -> RAM: 49464 change 752
07:56:35.483 -> RAM: 49336 change 624
07:57:05.512 -> RAM: 49080 change 368
07:57:35.547 -> RAM: 48856 change 144
07:58:05.566 -> RAM: 48648 change -64
07:58:35.574 -> RAM: 48488 change -224
07:59:05.604 -> RAM: 48008 change -704
07:59:35.638 -> RAM: 47528 change -1184
08:00:05.669 -> RAM: 47368 change -1344
08:00:35.683 -> RAM: 47176 change -1536