ESP8266 MMU increase heap


I switched from Arduino IDE to PlatformIO a half year ago. PlatformIO is a great product. I was able to structure my code for my ESP8266 and ESP32’s in a way that wasn’t possible with Arduino IDE.

Also the compilations are very fast and gives me a lot more control.

Hence I have a question. I want to increase the heap, to try to use the bear ssl client with a extensive code for my esp8266. I run a standard webserver in the esp and some advances features for processing sensors, actuators etc.

But for using a ssl client to communicate securely to my domotic solution, I run out of heap.

In the arduino IDE there is a option, to customise the memory allocation, but I can’t find the way to do that with PlatformIO.

See: PoC cache configuration control by mhightower83 · Pull Request #7060 · esp8266/Arduino · GitHub

Is there a way to do this in platform IO?

First of all, as someone who worked with an ESP8266 + TLS, connecting to some TLS websites is just impossible if they use big certificate chains and inefficient algorithms like RSA instead of ECC-based stuff, even if you have a little bit more memory, they’d need a lot more memory – some things are just out of reach for an ESP8266.

Second of all, the MMU feature is only available in the new 3.0.0 core for which PlatformIO doesn’t yet built-in support, see Arduino Core 3.0, when?. However, with certatin configuration options as outlined in this thread, it’s possible to get the 3.0.0 version.

Further if I read

correctly then the different MMU / heap options just boil down to adding a few macros to the build process, which we can do as well using build_flags.

So if you want the e.g. the 16KB cache + 48KB IRAM and 2nd Heap (shared) option, you would add the corresponding mmuflags as


to the platformio.ini.

I have not tested this at the moment.

The MMU options would be documented in Espressif 8266 — PlatformIO latest documentation but aren’t now; this is because PlatformIO officially supports only up to core version 2.7.4 and not the new 3.0.0 as of now. If PlatformIO updates, those options should be added.

1 Like

Yes that definitely works. If I do

platform = espressif8266
board = nodemcuv2
framework = arduino
platform_packages =
monitor_speed = 74880
upload_speed = 921600

with code

#include <Arduino.h>
#include <umm_malloc/umm_heap_select.h>

void setup() 
  HeapSelectIram ephemeral;
  Serial.printf("IRAM free: %6d bytes\r\n", ESP.getFreeHeap());
    HeapSelectDram ephemeral;
    Serial.printf("DRAM free: %6d bytes\r\n", ESP.getFreeHeap());

void loop() {
  // put your main code here, to run repeatedly:

I get

IRAM free:  21592 bytes
DRAM free:  52336 bytes

^~^ so the options are totally usable.

As you can see in here they also already updated the script for PlatformIO integration.

1 Like

Your solution works like charm. Thanks.

Great to hear, just keep a watch on Update core to 3.0.0 · Issue #249 · platformio/platform-espressif8266 · GitHub and Releases · platformio/platform-espressif8266 · GitHub for when an official update for platform-espressif8266 is released; then you should use that via a normal update (PIO Home → Platforms → Update) instead of platform_packages modifications above.