Я думаю, для многих будет новостью, КАК устроена обработка ошибок в WiFi драйвере ESP32
Никак.
Например, полно кода, который вызывает malloc() и, если результат - NULL, то
-
отправляется сообщение во внутренний лог (кольцевой буффер в памяти, при записи в которую так же может вызваться malloc()!!!) и..
-
уходит в бесконечный цикл.
Мудро. Тут даже watchdog, я думаю, может не помочь. Просто тихо повисает, без возможности прочитать тот же самый лог. Который прочитать можно только из памяти - не существует функций чтения лога. Только руками.
Короче, это плохо очень. Если железка необслуживаемая повиснет, придется ехать в командировку и перезагружать вручную, что-ли.
Типичный код:
if ((uVar5 >> 4 & 0xf) != uVar4) {
wifi_log(6,0x800,1,"%s %u\n",&DAT_0001027a,0x38f);
do {
/* WARNING: Do nothing block with infinite loop */
} while( true );
}
Половина кода такого, половина - хорошего. И стиль разный, что намекает на две группы разработчиков. Код написанный программистами Espressif - хороший. Чуваки знают, что делают. А вот другой код (например, packet processing engine) - корявый. Судя по всему, помимо лицензированного железа WiFi они еще и купили чей-то софт, дописали прослойку и склеили все вместе китайским клеем самым лучшим
Забавно еще то, что все вызовы wifi_log() - безусловные. А их там миллион. На каждый пакет, на каждый буффер, на каждый чих. Это адский оверхед. Понятно теперь, почему ЕСП32 не может выжать максимум из своего WiFi - код так написан. В добавок там один глобальный лок на ВСЕ операции. На медленные, на быстрые, на какие попало.
Какая неожиданная жесть.
Зато глобальных переменных миллион. Все, как мы любим. (у глобальных переменных остается их имя, и это удобно + дает кое-какую информацию о назначении переменной)