Неиспользуемые строки кода вызывают сбой программы

У меня есть проект, который по существу включает 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() в цикл для повторного запуска каким-то образом не приводило к сбою кода. Может ли кто-нибудь сообщить мне, что происходит?

, 👍-1

Обсуждение

Похоже, у вас может быть какая-то проблема с переполнением буфера или выравниванием переменных, а добавление/удаление кода случайным образом изменяет распределение переменных или констант. Вы должны включить отладку и посмотреть, что на самом деле происходит сбой., @Majenko

@Majenko Итак, я включил отладку для WIFI + CORE и некоторых других вещей. Когда мой первый тест сработал, я раскомментировал все остальное в функции. Оно работает. Почему? Что меняет включение отладки?, @skillz21

По сути, он добавляет загрузку серийных отпечатков... так что он делает что-то похожее на изменения вашей программы. При отключенной отладке и сбое вы получаете код исключения на серийный номер?, @Majenko

Да, это сброс аппаратного сторожевого таймера, поэтому дампа стека нет. первая причина: 4, режим загрузки: (3,6), сброс wdt. Дело в том, что, как я указал в своем посте, когда я добавлял Serial print в свой цикл (или просто в свою функцию, которая находится в цикле), программа не вылетала. Почему это произошло?, @skillz21

Невозможно сказать., @Majenko

@Majenko, есть ли какое-либо влияние Serial.print() на программу вообще?, @skillz21

Ну да. Это изменило бы внутреннюю структуру кода. Инструкции будут перемещать локации. Постоянные структуры данных будут находиться в разных местах. Многое может измениться., @Majenko

Вы ставите одинаковые комментарии к ответам, говоря, что вы решили проблему. Пожалуйста, сделайте это ответом и отметьте его, чтобы мы все знали, что ваша проблема решена, **и как**. Это поможет другим с похожей проблемой., @the busybee


3 ответа


Лучший ответ:

0

Оказывается, MDNS.begin() в настройке и MDNS.update() в цикле, по-видимому, вызывали какое-то неопределенное поведение, поскольку код не всегда давал сбой. Я закомментировал эти две строки, и теперь код работает нормально, за исключением MDNS.

,

0

Я думаю, что могу знать проблему (возможно, вы исправили ее через две недели), но ваш analogWrite(Pin, Val) может оказаться за пределами допустимого диапазона, помните, что AnalogWrite принимает только int от 0 до 255, поэтому, если ваша переменная lightBrightnessAdjust меньше 769, мы получим int выше принятого диапазона входных данных AnalogWrite().

Я знаю, что этот код на самом деле никогда не запускается, но он все равно компилируется, и, возможно, Arduino не любит даже возможную ошибку.

Возможно, я не очень хорошо объяснил, но здесь' s документацию Arduino для него.

Еще одним возможным решением может быть, возможно, вы могли бы попробовать определить переменную int amount = 1024-lightBrightnessAdjust; заранее, а затем ввести переменную в AnalogRead, потому что это может быть суетливо при выполнении математики внутри параметров функции (просто мысль)

,

Оказывается, проблема была не в моем коде. MDNS.update() в цикле был причиной сбоя кода. Комментирование этого устранило проблему., @skillz21


0
  • Перезапись массива может испортить адрес, возвращаемый функциями.
  • Выделение из кучи памяти, достаточной для столкновения растущей кучи и нисходящего стека, может вызвать или создать условия для затирания локальных данных функции, адреса возврата функции или данных кучи, включая метаданные кучи, необходимые для освобождения этого блока кучи.
  • Запись через неинициализированный или перезаписанный указатель может привести к любому повреждению памяти, какое только можно себе представить; и результат может зависеть от данных и/или карты памяти данных и, вполне возможно, неповторяем.
  • Затирание вектора прерывания включенного прерывания может привести к неправильному переходу в любую часть вашего кода и, весьма вероятно, будет неповторимым.

Мы слишком многого не знаем о невидимой остальной части вашего кода, чтобы сделать что-то большее, чем строить догадки о возможных точках отказа.

,

Оказывается, проблема была не в моем коде. MDNS.update(), который у меня был в цикле, был причиной сбоя кода. Комментирование этого устранило проблему., @skillz21