Non perderci tempo a sistemare il codice non serve
Nessun problema per guardare il tuo codicelo posso vedere prima però facciamo alcune cose
(Scusami in anticipo probabilmente ti metto dei consigli scontati...)
Metti nei punti strategici questa istruzione così controlli lo stato dell'allocazione memoria
- Codice: Seleziona tutto
ESP_LOGI (TAG, "MEM2 %u", heap_caps_get_free_size(MALLOC_CAP_SPIRAM)) ;
Io la metto in entrata e in unscita da un determinato codice per capire se ho lasciato memoria allocata in giro.
Se apri e chiudi un socket la memoria non viene liberata subito ma dopo un po di tempo Quindi metti un achiamata periodica da qualche parte.
Già così se vedi che la memoria cala di continuo vuol dire che ti rimangono pezzi allocati e devi indagare sul perché
Altra cosa quando attivi il task prova a ridurre di molto lo stack dedicato al task Se il problema appare subito o iil task nemmeno riesce a partire forse stai utilizzando male la ram interna. La ram interna su ESP32 è poca io mi sono abituato ad utilizzare il più possibile puntatori e malloc (o calloc) anche per variabili che normalmente sono statiche e non servirebbe allocazione dinamica, ma in questo modo utilizzi poca ram interna.
per l'ota non ho capito bene come fai l'operazione su internet ho trovato questo
nel cmakelists del progetto ho messo all'inizio queste righe
set(PROJECT_VER "1.0.1")
set(PROJECT_VERU ${PROJECT_VER})
set(PROJECT_PREF "esp32_4k")
string (REPLACE "\." "_" PROJECT_VERU ${PROJECT_VERU})
set(PROJECT_BIN "${PROJECT_PREF}_${PROJECT_VERU}")
Ti salva un binario col numero della versione che male non fa e inserisce la versione nel codice binario. In questo modo puoi da client interrogare il server e chiedere se c'è una nuova versione.
il client fa partire il download solo se le versioni sono diverse ed è il client che decide quando, così ti sincronizzi meglio con le tue attività.
In pratica scarico prima dal server un file json che mi dice qual è la versioen sul server e qual è il percorso per ottenerla e agisco di conseguenza
Una cosa del genere molto sintetico ma giusto per capire
- Codice: Seleziona tutto
const esp_partition_t *running = esp_ota_get_running_partition();
esp_app_desc_t running_app_info;
if (esp_ota_get_partition_description(running, &running_app_info) == ESP_OK)
{
ESP_LOGI(TAG, "Running firmware version: %s", running_app_info.version);
}
e poi qui confronta la versione attuale con la nuova
if (memcmp(new_fw_version, running_app_info.version, strlen(new_fw_version)) == 0)
Altra trappola in cui spesso si cade (o meglio io cado) se hai coda di messaggi verifica che
La coda non saturi e che non ci sia più spazio per nuovi messaggi
I dati di un messaggio vengono sempre passati per copia quindi se passi buffer devi sempre liberarli quando elimini il messaggio. Se passi un puntatore libera la memoria del puntatore prima di liberare il messaggio.
E poi c'è il problerma inverso se ricevi un puntatore da un messaggio verifica sempre che i dati a cui punta siano consistenti Non tenere il puntatore e magari nel frattempo da un'altra parte quella memoria è stata rilasciata.
Ah dimenticavo hai modificato la partizione dlela memoria con le due aree ota tipo
- Codice: Seleziona tutto
# Name, Type, SubType, Offset, Size, Flags
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs, data, nvs, 0x009000, 0x6000,
otadata, data, ota, 0x00F000, 0x2000,
phy_init, data, phy, 0x011000, 0x1000,
storage, data, spiffs, , 900K
factory, app, factory, 0x100000, 2M,
ota_0, app, ota_0, , 2M,
ota_1, app, ota_1, , 2M,
e inserito il nome del file csv nell'sdkconfig