Эти проанализированные исключения дают мне следующий результат:
Exception 0: Illegal instruction
Если заглянуть глубже в погрешность, обнаруживается:
std::basic_string , std::allocator >::basic_string(char const*, std::allocator const&)
Этот тип ошибки типичен для класса String.
Замените все строки фиксированными массивами символов (а не динамически создаваемыми (!))
Причина: класс String имеет тенденцию разрушать кучу, что приводит к тому, что ESP создают cra sh (а также 8266 ESP32).
Почему те ? Потому что мы используем их (в отличие от «обычных» Arduinos до 99% в сценарии WiFi ios (IoT). Так что в памяти происходит много событий.
Что делать? Избавиться от класса String (и delay ()) если используется)
String firebaseWriteAddress;
String firebaseReadAddress;
String weight; // Stored in a string to accomodate the "loading" text
Это выше в сочетании с такими функциями, как (динамически определяемые строковые переменные)
String data = firebaseData.stringData();
String command = data.substring(0,4);
if (command == "read"){
firebaseReadAddress = "/UserData/" + data.substring(4);
readWeights();
firebaseWriteAddress = "/UserData/" + data.substring(4)
+ "/Weight";
обеспечит очень быстрое аварийное завершение ESP. Так как сбор мусора отсутствует ( и все равно не хватило бы памяти) вы в какой-то момент записываете в занятую память - смотрите первую строку моего анализа ошибок - cra sh.
Зачем нужны фиксированные символы? - они скомпилированы в fla sh, и вы работаете большую часть времени с указателями. Таким образом, все «фиксированные» текстовые сообщения go в fla sh (пример)
char firebaseReadAddress[64] = {'\0'}; //Takes 63 chars
используются как
strcpy(firebaseReadAddress, "/UserData/");
strcat(firebaseReadAddress, dataContent);
для проверки, является ли символ Массив начинается с «чтения», вы используете этот метод:
if (strncmp( command, "read", 4) == 0) { /** Compare the first 4 characters - returns 0 if they are equal */
Обработка так же проста, как класс String, но позволяет вашему приложению работать вечно (по крайней мере, пока есть источник питания)
Проверьте также используемые библиотеки для тяжелых строк использовать (особенно если они не предназначены для ESP). Если они это сделают - отбросьте их или перепишите их ;-)
Firebase lib является положительным примером, не использующим динамические элементы c Строки и интенсивное использование массивов символов.
Извините за плохие новости
Перепишите свои Если вам нужны стабильные приложения, я могу помочь вам, если возникнут особые вопросы - просто оставьте комментарий здесь.