Значения Nano V3 «перезаписываются» случайным образом

Когда я присваиваю глобальную переменную определенному значению внутри if-блока, оно меняется на другое значение в следующем операторе. Каким-то образом адрес переменной перезаписывается каким-то другим процессом. Он также не останавливается на значении 1, это происходит со следующими переменными, которым тоже присвоено другое значение. Переменные не определены подряд, но должны быть близки. Я уже установил более новую версию Arduino IDE, никаких изменений. Пример:

menuActive=1;
Serial.print(menuActive);

насколько я видел до сих пор, дает результаты в диапазоне от 40 до 57. Дальнейшие действия всегда присваивают ТО ЖЕ значение следующим переменным, которые я назначаю после этого. Кто-нибудь знает, что может вызвать это? У меня мало памяти для локальных переменных? Это сообщение компиляции:

Sketch uses 21790 bytes (70%) of program storage space. Maximum is 30720 bytes.
Global variables use 1454 bytes (70%) of dynamic memory, leaving 594 bytes for local variables. Maximum is 2048 bytes.

изменить:

Как я уже сказал, это 21 тысяча кода. Но я покажу вам ту часть кода, которая работает неправильно:

while ((digitalRead(rotSwPin) == 0) && lpress <= 200) {
    delay(10);
    lpress++;
    if (lpress > 200) {
        menuActive++;
        menuLvl=0;
        menuPos=0;
        subPos=0;
    }
}

Обычно я использую MenuActive=1. В фигурных скобках это по-прежнему 1, дальше оно меняется. Возможно, измените байтовое значение на логическое.

, 👍0

Обсуждение

Для меня это похоже на переполнение буфера., @Majenko

Согласованный! Но где я могу найти распределение памяти в файле/списке, чтобы понять, какая переменная перезаписывает?, @hoekbrwr

Вы не сможете этого сделать, если не создадите файл «карты», для которого вам необходимо изменить параметры компилятора в файлах конфигурации IDE. Проверьте свой код на наличие используемых вами массивов и убедитесь, что вы не пытаетесь использовать больше, чем следует. Одним из распространенных случаев неправильного использования является объявление int foo[10], а затем попытка использовать foo[10] в качестве среза., @Majenko

Учитывая диапазон чисел, который он вам дает, скорее всего, это массив символов, в который вы печатаете числа, возможно, со знаками препинания, такими как скобки., @Majenko

или покажите свой код, и кто-нибудь заметит проблему, @Juraj

Спасибо за ваши предложения, но я уже тщательно проверил эти вещи. Я думаю перейти на Eclipse для этого проекта Arduino и узнать больше путем отладки?, @hoekbrwr

Как я уже сказал, это 21к кода. Но я покажу вам ту часть кода, которая работает неправильно: <код> while ((digitalRead(rotSwPin) == 0) && lpress <= 200) { Delay(10);lpress++; if (lpress > 200) {menuActive++;menuLvl=0;menuPos=0;subPos=0;} } </код> Обычно я использую MenuActive=1. В фигурных скобках это по-прежнему 1, дальше оно меняется. Возможно, измените байт на bool., @hoekbrwr

Если ваша программа повреждает память (что, по-видимому, имеет место в данном случае), часть кода, которая ведет себя неправильно, может быть довольно далеко от той части, которая вызывает повреждение памяти. В коде, который вы здесь показываете, нет ничего плохого. Ваша проблема заключается в какой-то части кода, которую вы не показываете. Никто не сможет вам помочь, не видя ошибки., @Edgar Bonet

Я нашел проблему. Я мог видеть, что ложное значение — это код символа минуты, которую я показываю. Я показываю часы и минуты, и там было объявление, в котором не хватало 3 символов для строки, которую я получил в результате для часов, добавленных к минутам. Да, это было повреждение памяти. Поэтому будьте осторожны, определите размеры достаточного количества мест для ваших строк, включая 1 дополнительную вместо 0., @hoekbrwr

@hoekbrwr Возможно, вы захотите опубликовать это как ответ, а не как комментарий., @sempaiscuba

Комментарии не рекомендуются к любому из следующих действий: [Ответ на вопрос или предоставление альтернативного решения существующего ответа; вместо этого опубликуйте фактический ответ (или отредактируйте, чтобы расширить существующий)](https://arduino.stackexchange.com/help/privileges/comment); Вместо этого не стесняйтесь опубликовать ответ. Спасибо., @Greenonline


1 ответ


1

Я нашел проблему. Я мог видеть, что ложное значение — это код символа минуты, которую я показываю. Я показываю часы и минуты, и там было объявление, в котором не хватало 3 символов для строки, которую я получил в результате для часов, добавленных к минутам. Да, это было повреждение памяти. Поэтому будьте очень осторожны, чтобы определить достаточное количество мест для ваших C-строк, включая 1 дополнительный для 0. Если у вас не так мало оперативной памяти, то еще несколько символов не принесут вреда, концом строки будет символ перед 0 в Память. Когда происходят странные вещи, начните обращать внимание на это дело!

,