ESP32 – Augmentation de l’espace mémoire pour le code programme

Le moindrement que le programme comporte plusieurs lignes, la mémoire disponible réservée pour le code est insuffisante. C’est le cas quand nous voulons avoir des interfaces Web et Bluetooth fonctionnelles simultanément. BluetoothSerial.h prend beaucoup de mémoire.

Par défaut, 1310720 octets sont réservés pour le code programme dans le «DOIT ESP32 DEVKIT V1». La mémoire flash 4MB est partitionnée et une bonne proportion de l’espace mémoire est réservée pour l’OTA (update Over the Air -> démo) et le SPIFFS (Serial Peripheral Interface Flash File System -> démo).

Partitions par défaut

Lors de la compilation du programme, l’IDE ARDUINO lit le fichier
boards.txt du répertoire > C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1

AppData est un répertoire système, par défaut il est masqué. Pour le voir, il faut cocher «Éléments masqués» dans l’explorateur Windows. Si ce n’est déjà fait, cochez aussi «Extensions de noms de fichiers».

Pour exécuter le partitionnement, le compilateur se réfère à la section correspondante au type de carte sélectionnée par l’utilisateur (dans le menu Outils de l’interface IDE).

Extrait de boards.txt (IDE Arduino 1.8.8, ESP32 V 1.0.1)

##############################################################

esp32doit-devkit-v1.name=DOIT ESP32 DEVKIT V1

esp32doit-devkit-v1.upload.tool=esptool_py
esp32doit-devkit-v1.upload.maximum_size=1310720
esp32doit-devkit-v1.upload.maximum_data_size=327680
esp32doit-devkit-v1.upload.wait_for_upload_port=true

esp32doit-devkit-v1.serial.disableDTR=true
esp32doit-devkit-v1.serial.disableRTS=true

esp32doit-devkit-v1.build.mcu=esp32
esp32doit-devkit-v1.build.core=esp32
esp32doit-devkit-v1.build.variant=doitESP32devkitV1
esp32doit-devkit-v1.build.board=ESP32_DEV

esp32doit-devkit-v1.build.f_cpu=240000000L
esp32doit-devkit-v1.build.flash_mode=dio
esp32doit-devkit-v1.build.flash_size=4MB
esp32doit-devkit-v1.build.boot=dio
esp32doit-devkit-v1.build.partitions=default
esp32doit-devkit-v1.build.defines=

esp32doit-devkit-v1.menu.FlashFreq.80=80MHz
esp32doit-devkit-v1.menu.FlashFreq.80.build.flash_freq=80m
esp32doit-devkit-v1.menu.FlashFreq.40=40MHz
esp32doit-devkit-v1.menu.FlashFreq.40.build.flash_freq=40m

esp32doit-devkit-v1.menu.UploadSpeed.921600=921600
esp32doit-devkit-v1.menu.UploadSpeed.921600.upload.speed=921600
esp32doit-devkit-v1.menu.UploadSpeed.115200=115200
esp32doit-devkit-v1.menu.UploadSpeed.115200.upload.speed=115200
esp32doit-devkit-v1.menu.UploadSpeed.256000.windows=256000
esp32doit-devkit-v1.menu.UploadSpeed.256000.upload.speed=256000
esp32doit-devkit-v1.menu.UploadSpeed.230400.windows.upload.speed=256000
esp32doit-devkit-v1.menu.UploadSpeed.230400=230400
esp32doit-devkit-v1.menu.UploadSpeed.230400.upload.speed=230400
esp32doit-devkit-v1.menu.UploadSpeed.460800.linux=460800
esp32doit-devkit-v1.menu.UploadSpeed.460800.macosx=460800
esp32doit-devkit-v1.menu.UploadSpeed.460800.upload.speed=460800
esp32doit-devkit-v1.menu.UploadSpeed.512000.windows=512000
esp32doit-devkit-v1.menu.UploadSpeed.512000.upload.speed=512000

esp32doit-devkit-v1.menu.DebugLevel.none=None
esp32doit-devkit-v1.menu.DebugLevel.none.build.code_debug=0
esp32doit-devkit-v1.menu.DebugLevel.error=Error
esp32doit-devkit-v1.menu.DebugLevel.error.build.code_debug=1
esp32doit-devkit-v1.menu.DebugLevel.warn=Warn
esp32doit-devkit-v1.menu.DebugLevel.warn.build.code_debug=2
esp32doit-devkit-v1.menu.DebugLevel.info=Info
esp32doit-devkit-v1.menu.DebugLevel.info.build.code_debug=3
esp32doit-devkit-v1.menu.DebugLevel.debug=Debug
esp32doit-devkit-v1.menu.DebugLevel.debug.build.code_debug=4

Deux lignes sont importantes pour l’assignation de la mémoire:

  • esp32doit-devkit-v1.upload.maximum_size=1310720
    • Cette ligne définit le nombre d’octets maximum pour le upload
  • esp32doit-devkit-v1.build.partitions=default
    • Cette ligne désigne le fichier qui contient la structure du partitionnement
    • Ce fichier est toujours du type csv

Fichier par défaut pour le partitionnement
C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\partitions\default.csv

default.csv

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
eeprom,   data, 0x99,    0x290000,0x1000,
spiffs,   data, spiffs,  0x291000,0x16F000,

Programme d’affichage du partitionnement du ESP32

Placer dans un répertoire nommé «Affiche_Partitions», transférer dans le ESP32 et exécuter.

#include <esp_partition.h>

void setup() {
  Serial.begin(115200);
  const esp_partition_t *partition = NULL;
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_0, "app0");
  if (partition != NULL) {
    Serial.printf("APP partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
  
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_OTA_1, "app1");
  if (partition != NULL)
  {
    Serial.printf("OTA partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
  else
  {
    Serial.printf("No OTA partition found !\n");
  }
  
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, (esp_partition_subtype_t)0x99, "eeprom");
  if (partition != NULL) {
    Serial.printf("EEprom partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
  
  partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, "spiffs");
  if (partition != NULL) {
    Serial.printf("SPIFFS partition addr: 0x%08x; size: %d; label: %s\n", partition->address, partition->size, partition->label);
  }
}

void loop() {}

Solutions

Afin de récupérer de l’espace mémoire pour le code, il est possible de modifier simplement le partitionnement de la mémoire.

Proposition de trois partitionnements. Il faut sacrifier la mémoire pour l’OTA ou diminuer la mémoire pour le SPIFFS.

  • no_ota
    • Dans le cas ou nous prévoyons de ne pas utiliser la mise à jour sans fil. Aucune mémoire réservée pour l’OTA
    • Environ 50% pour le programme et 50% pour le SPIFFS
  • huge_app
    • Dans le cas ou nous prévoyons de ne pas utiliser la mise à jour sans fil. Aucune mémoire réservée pour l’OTA
    • Environ 76% pour le programme et 24% pour le SPIFFS
  • min_spiffs
    • Environ 47% pour le programme, 47% pour l’OTA et 5% pour le SPIFFS

Fichiers sources à placer dans le répertoire (s’ils sont absents) :
->
C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\partitions

https://github.com/espressif/arduino-esp32/tree/master/tools/partitions


PROCÉDURE

Le choix du partitionnement se fera à l’aide du menu outil, mais avant il faut ajouter des lignes de code dans le fichier boards.txt. Pour certains types de cartes, ces lignes sont déjà présentes, mais pour la carte «DOIT ESP32 DEVKIT V1» elles sont manquantes.

  • Aller dans le répertoire ->
    C:\Users\NomDutilisateur\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1
  • Copier le fichier boards.txt et renommer boards_default.txt pour en conserver une copie non modifiée
  • Ouvrir le fichier boards.txt
  • Trouver la partie esp32doit-devkit-v1.name=DOIT ESP32 DEVKIT V1
  • Ajouter les lignes qui suivent juste après la ligne
    • « esp32doit-devkit-v1.build.defines= »
esp32doit-devkit-v1.menu.PartitionScheme.default=Default (32-32-36)
esp32doit-devkit-v1.menu.PartitionScheme.default.build.partitions=default
esp32doit-devkit-v1.menu.PartitionScheme.no_ota=No OTA (Large APP) (50-00-50)
esp32doit-devkit-v1.menu.PartitionScheme.no_ota.build.partitions=no_ota
esp32doit-devkit-v1.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
esp32doit-devkit-v1.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA) (76-00-24)
esp32doit-devkit-v1.menu.PartitionScheme.huge_app.build.partitions=huge_app
esp32doit-devkit-v1.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
esp32doit-devkit-v1.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (Large APPS with OTA) (47-47-05)
esp32doit-devkit-v1.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
esp32doit-devkit-v1.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080
  • Sauvegarder le fichier boards.txt

Les nouveaux choix sont accessibles dans le menu «Outils» suite à la sélection de la carte «DOIT ESP32 DEVKIT V1»

Vous pouvez valider les changements en exécutant le programme d’affichage du partitionnement du ESP32