У меня есть цикл, который проходит через мои датчики (элементы), а затем отправляет их состояние через MQTT. Я запускаю этот код на платах разработчиков ESP8266, и на некоторых из них этот код работает, тогда как на других он выдает исключение через случайное время.
Теперь, пытаясь отладить это, я обнаружил, что, если я раскомментирую Serial.println() в строке, как показано ниже (это должно быть именно это место, помещая его в любую другую строку, это не помогает), код работает совершенно стабильно. несколько дней. Но как только я удаляю этот println, он начинает вылетать примерно через 100 секунд. Что здесь происходит? Что делает Serial.println(), что делает мой код стабильным?
void _loop(String priority)
{
for(std::vector<IItem*>::iterator it = items.begin(); it != items.end(); ++it)
{
if ((*it)->loopPriority == priority)
{
(*it)->loop();
for (std::map<String, String>::iterator pubChannel = (*it)->pubChannels.begin(); pubChannel != (*it)->pubChannels.end(); pubChannel++ )
{
//Serial.println(pubChannel->second);
mqtt.sendMsg(pubChannel->second, (*it)->command(pubChannel->first));
}
}
}
}
Я уже сделал. Это не то. Спящий режим по-прежнему вызывает исключения, в отличие от println. Я даже увеличивал количество сна на 100 мс с каждой итерацией, но все же было исключение.
Поскольку мы ловим загадочную ошибку, _loop, вероятно, является незаконным идентификатором. Все, что начинается с подчеркивания в глобальном пространстве имен, зарезервировано для использования реализацией библиотеки. Подробнее об этом читайте в Каковы правила использования символа подчеркивания в идентификаторе C++?.
Вы должны показать полный код. Проблема может быть не в том, где вы думаете. Я видел множество примеров, когда переполнение буфера в одной части кода приводит к его разрыву, а добавление строки печати в какое-то, казалось бы, случайное место перемещает объекты в памяти в достаточной степени, чтобы заставить их работать.
Спасибо, вот мой код, без ссылки, так как я не думал, что кто-то захочет прочитать эту кучу кода;) github.com/ojek/OpenHabHomeAutomation/blob/master/arduino/…





Serial.println () тратит время на отправку данных по последовательному каналу. Попробуйте заменить его на сон.