Неиспользуемые строки кода вызывают сбой программы
У меня есть проект, который по существу включает Wi-Fi, веб-сервер и светодиод. В данный момент я использую встроенный светодиод на моем ESP8266 для тестирования. Я использую Arduino IDE для программирования.
У меня возникла проблема, из-за которой мой код аварийно завершал работу после подключения к WiFi. Закомментировав функции в моем цикле, я сузил проблему сбоя до моей функции, которая обрабатывает светодиод. Тут я столкнулся с проблемой, комментируя каждый блок кода по отдельности, а то и сразу несколько, не смог предотвратить вылет. Должно быть более одной строки, вызывающей сбой. Единственное, что сработало, это закомментировать всю функцию.
После нескольких часов устранения неполадок я остался на этапе, когда у меня было закомментировано содержимое всех операторов if, циклов и т. д. Вот что привело меня в полное замешательство. Вот оператор if:
if(webSocketActive){
Serial.println("websocket is active, setting brightness");
analogWrite(LED_BUILTIN, 1024 - lightBrightnessAdjust);
} else {
//другие вещи с большим количеством пустых операторов if
}
С этого момента, если я закомментирую строку AnalogWrite, программа будет работать нормально. Но если я оставлю это так, он вылетает после подключения к WiFi. (Я не публиковал всю свою программу, потому что она занимает более 1000 строк).
Непонятная часть всего этого заключается в том, что webSocketActive никогда не устанавливается в true до этого момента в коде... Serial.println() никогда ничего не делает, а это означает, что ESP определенно не выполняет инструкции внутри if заявление. Но по какой-то необъяснимой причине простое раскомментирование AnalogWrite() приводит к сбою программы, даже если она никогда не выполняет эту строку.
У меня также были другие проблемы, когда добавление какой-либо функции Serial.print() в цикл для повторного запуска каким-то образом не приводило к сбою кода. Может ли кто-нибудь сообщить мне, что происходит?
@skillz21, 👍-1
Обсуждение3 ответа
Лучший ответ:
Оказывается, MDNS.begin() в настройке и MDNS.update() в цикле, по-видимому, вызывали какое-то неопределенное поведение, поскольку код не всегда давал сбой. Я закомментировал эти две строки, и теперь код работает нормально, за исключением MDNS.
Я думаю, что могу знать проблему (возможно, вы исправили ее через две недели), но ваш analogWrite(Pin, Val)
может оказаться за пределами допустимого диапазона, помните, что AnalogWrite принимает только int от 0 до 255, поэтому, если ваша переменная lightBrightnessAdjust
меньше 769, мы получим int выше принятого диапазона входных данных AnalogWrite().
Я знаю, что этот код на самом деле никогда не запускается, но он все равно компилируется, и, возможно, Arduino не любит даже возможную ошибку.
Возможно, я не очень хорошо объяснил, но здесь' s документацию Arduino для него.
Еще одним возможным решением может быть, возможно, вы могли бы попробовать определить переменную int amount = 1024-lightBrightnessAdjust;
заранее, а затем ввести переменную в AnalogRead, потому что это может быть суетливо при выполнении математики внутри параметров функции (просто мысль)
Оказывается, проблема была не в моем коде. MDNS.update() в цикле был причиной сбоя кода. Комментирование этого устранило проблему., @skillz21
- Перезапись массива может испортить адрес, возвращаемый функциями.
- Выделение из кучи памяти, достаточной для столкновения растущей кучи и нисходящего стека, может вызвать или создать условия для затирания локальных данных функции, адреса возврата функции или данных кучи, включая метаданные кучи, необходимые для освобождения этого блока кучи.
- Запись через неинициализированный или перезаписанный указатель может привести к любому повреждению памяти, какое только можно себе представить; и результат может зависеть от данных и/или карты памяти данных и, вполне возможно, неповторяем.
- Затирание вектора прерывания включенного прерывания может привести к неправильному переходу в любую часть вашего кода и, весьма вероятно, будет неповторимым.
Мы слишком многого не знаем о невидимой остальной части вашего кода, чтобы сделать что-то большее, чем строить догадки о возможных точках отказа.
Оказывается, проблема была не в моем коде. MDNS.update(), который у меня был в цикле, был причиной сбоя кода. Комментирование этого устранило проблему., @skillz21
- Как читать и записывать EEPROM в ESP8266
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Как определить размер Flash?
- Несколько клиентских серверов через Wi-Fi
- Передача функции-члена класса в качестве аргумента
- В ESP-12E NodeMCU, какой выход PIN A0?
- Esp8266 Vin контакт
Похоже, у вас может быть какая-то проблема с переполнением буфера или выравниванием переменных, а добавление/удаление кода случайным образом изменяет распределение переменных или констант. Вы должны включить отладку и посмотреть, что на самом деле происходит сбой., @Majenko
@Majenko Итак, я включил отладку для WIFI + CORE и некоторых других вещей. Когда мой первый тест сработал, я раскомментировал все остальное в функции. Оно работает. Почему? Что меняет включение отладки?, @skillz21
По сути, он добавляет загрузку серийных отпечатков... так что он делает что-то похожее на изменения вашей программы. При отключенной отладке и сбое вы получаете код исключения на серийный номер?, @Majenko
Да, это сброс аппаратного сторожевого таймера, поэтому дампа стека нет. первая причина: 4, режим загрузки: (3,6), сброс wdt. Дело в том, что, как я указал в своем посте, когда я добавлял Serial print в свой цикл (или просто в свою функцию, которая находится в цикле), программа не вылетала. Почему это произошло?, @skillz21
Невозможно сказать., @Majenko
@Majenko, есть ли какое-либо влияние Serial.print() на программу вообще?, @skillz21
Ну да. Это изменило бы внутреннюю структуру кода. Инструкции будут перемещать локации. Постоянные структуры данных будут находиться в разных местах. Многое может измениться., @Majenko
Вы ставите одинаковые комментарии к ответам, говоря, что вы решили проблему. Пожалуйста, сделайте это ответом и отметьте его, чтобы мы все знали, что ваша проблема решена, **и как**. Это поможет другим с похожей проблемой., @the busybee