Info su Memoria getFreeHeap

Salve a tutti
nel compilare lo sketch mi appare il solito e seguente messaggio

Le variabili globali usano 79816 byte (24%) di memoria dinamica, 
lasciando altri 247864 byte liberi per le variabili locali. Il massimo è 327680 byte.

Per controllare i valori, al giro di una routine che uso spesso ho messo il comando

     Serial.print("Memoria getFreeHeap ");
     Serial.println(ESP.getFreeHeap());

che in pratica mi restituisce il valore aggiornato di “247864” visto prima.
Noto che ogni utilizzo questo spazio scende, per uso (ancora da sistemare) della odiata-amata String e che per il momento non posso eliminare perchè usata da un webserver.

Chiedo : quale è il valore minimo che ci deve essere e per il quale non si incorre in eventuali blocchi ?
In altre parole : a che valore si accende la spia della riserva ?

Fintanto che non si blocca tutto! Un pelo più seriamente, dovresti guardare il datasheet per capire come viene gestito appunto lo spazio Heap.

non ricordo quando e dove, avevo letto che oltre l’80% le variabile iniziavano in modo random a dare di matto…
ma non ricordo se si parlava di arduino r3 o di un esp32 (che è quello relativo all’oggetto di questo thread).

… guardare il datasheet per capire …

sinceramente, ahimè, non arrivo a tanta interpretazione … Magari fosse :frowning:

Con sistemi ESP in realtà è necessario stare più attenti allo stack piuttosto che all’heap perché di default è piuttosto limitato (4K con ESP8266 e 8K con ESP32) mentre lo spazio per l’heap è più che abbondante e prima di arrivare a situazioni critiche ce ne vuole.
Comunque, più che monitorare la quantità di memoria heap libera, dovresti controllare se il tuo codice produce frammentazione e quindi monitorare il rapporto tra il totale della memoria libera e la dimensione massima del blocco di memoria “contigua” libera. Se quest’ultimo diminuisce costantemente nel tempo c’è qualcosa che non va nel codice.

Altra cosa da evitare come la peste, molto più che la classe String, è l’uso di algoritmi bloccanti che fanno inalberare in men che non si dica il watchdog.

c’è una istruzione che permette di fare questo check ?

per quanto riguarda la String ho imparato proprio qui che debbo evitarla ma ci sono librerie che usano String a-go-go. Nel mio caso specifico la ESP32WEBSERVER crea una String immensa per riempire le pagine html e quindi so bene che si vengono a creare possibili blocchi.
Cosa faccio ?
Nella mia completa ignoranza chiedo : cosa si intende per ALGORITMI BLOCCANTI ?

Si con ESP32 le istruzioni

heap_caps_get_free_size(0);
heap_caps_get_largest_free_block(0);

restituiscono (tipo dati size_t) rispettivamente la quantità massima di memoria libera e il blocco di dati più largo.

Non la usare… Ci sono ottimi esempi già inclusi nel core, parti da uno di quelli. Il mio preferito è FSBrowser o l’analogo SDWebServer.

Per bloccanti intendo che “costringono” il micro in un loop dove non può fare nulla.
Siccome l’esp nel frattempo deve far girare anche altro oltre alla funzione loop, superato un certo tempo massimo va in eccezione a causa del watchdog.
L’esp32 infatti usa il kernel FreeRTOS: void loop(){} è solo un task che gira in parallelo ad altri non direttamente visibili all’utente Arduino.

a tal proposito mi consigli un link valido dove capire come impostare una routine di controllo o altrimenti, in caso, un copia incolla di qualcosa di tuo, vista la tua eccellente conoscenza dei meandri dell’esp32.
In confronto la preparazione del sottoscritto su questo discorso - basandosi sulla quasi totale “ignorantia argumenti” - praticamente è paragonabile al “blink.ino” prima versione…

Non credo di aver capito cosa intendi… i meccanismi di “controllo” del watchdog ci sono già a livello di core ed anche se è possibile in qualche modo modificarli, nel 99% dei casi non è necessario anzi è decisamente sconsigliabile.

Comunque tutte le informazioni necessarie sono sul sito espressif ed anche se fanno riferimento al loro framework di sviluppo ESP-IDF il discorso è valido anche in ambiente “Arduino” in quanto l’Arduino core for ESP32 è sviluppato sulla base delle istruzioni disponibili nell’ESP-IDF

parlavo di un esempio tipo questo (uno tra i tanti che prima di chiedere qui avevo visto) :
check wdt su esp32
e capire se è la strada giusta da seguire per il controllo.
Grazie per il sito il sito express if, che avevo già visto altre volte, ma è troppo teorico per la mia preparazione e mi perdo dopo due righe :pensive:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.