Погуглив выяснил, что команда "bne.n" это переход, если z = 0, а команда "b" - безусловный переход. То есть получается, если flag = 0 и мы заходим в цикл ожидания, процессор сразу из него выходит, а если зайти в цикл, когда flag отличается от нуля, мы попадем в вечный цикл. Такая история появляется только в одной большой функции, где нужно после получения команды с юсарт подождать, пока не завершится какое-то действие. в программе у меня много где такой цикл используется, но никогда не было проблем. Объявление переменной:
Код:
volatile u8 flag = 0;
Волатильная, не волатильная - ничего не меняется. flag гарантировано возвращается в 0 по ходу работы программы (смотрел дебаггером). Среда CooCox 1.7.6, gcc 4.8 2014q3
_________________ Опыт приходит сразу после того, как он был нужен...
Проверьте "видимость" этой переменной. Не случается ли так, что меняется одна локальная, а опрашивается другая локальная переменная с тем же именем. Чудес не бывает. А подобные баги компилятора вылавливаются на уровне альфатестирования. И переменная должна быть волатильной, иначе оптимизатор её примет равной нулю всегда.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Заголовок сообщения: Re: While компилируется в вечный цикл
Добавлено: Пн апр 15, 2019 12:08:08
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 252
Зарегистрирован: Пн апр 14, 2008 12:54:35 Сообщений: 1289 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения:0
Еще раз. Флаг волатильный, = 0 в его инициализации, в процессе работы программы он меняется 10000000% У меня не только с этой переменной проблема.
Добавлено after 5 minutes 59 seconds: Так же этот косяк всплывает со строчкой
Код:
while (mseconds >= 98){};
Ассемблер тот же, проваливается в бесконечный цикл, если на момент попадания в цикл, mseconds больше или равен 98. Эту переменную так же делал волатильной, а инициализация нулем отсутствует.
_________________ Опыт приходит сразу после того, как он был нужен...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: While компилируется в вечный цикл
Добавлено: Пн апр 15, 2019 12:24:59
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Волосатый, Вы нам рассказываете про чудеса. volatile должен (даже обязан) решить эту проблему, причём независимо от того, чем инициализирована переменная.
Заголовок сообщения: Re: While компилируется в вечный цикл
Добавлено: Пн апр 15, 2019 12:48:46
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 252
Зарегистрирован: Пн апр 14, 2008 12:54:35 Сообщений: 1289 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения:0
Ну я же не придумываю... Вот нагляднее пример.
Код:
void usart(void){ volatile sec_tmp; ... ... switch (comand){ case TSET: sec_tmp = ds3231_rtc_data.seconds; // ТУТ ЗАПИСЫВАЕТСЯ ВРЕМЯ while (sec_tmp == ds3231_rtc_data.seconds); // ожидаем, пока в прерывании не поменяется время // ОТСЫЛАЕМ ОТВЕТ break; } }
На первый раз выполняется правильно, на второй раз виснет на ожидании. Спасибо за внимание, сделал ds3231_rtc_data.seconds тоже волатильной и оно заработало.
А с флагом хз что было)) но тоже работает. Магия какая-то.
_________________ Опыт приходит сразу после того, как он был нужен...
Спасибо за внимание, сделал ds3231_rtc_data.seconds тоже волатильной и оно заработало.
У тебя в цикле может меняться ds3231_rtc_data.seconds, а sec_tmp не может, она вообще локальная, ее извне никак не поменяешь, потому второй volatile лишний.
Заголовок сообщения: Re: While компилируется в вечный цикл
Добавлено: Пн апр 15, 2019 14:00:58
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 252
Зарегистрирован: Пн апр 14, 2008 12:54:35 Сообщений: 1289 Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения:0
У меня логика была такая, что sec_tmp мы только что приравняли к ds3231_rtc_data.seconds и тут же их сравниваем, компилятор то не знает, что ds3231_rtc_data.seconds может где-то измениться.
_________________ Опыт приходит сразу после того, как он был нужен...
Ваша беда в поголовном использовании while. Переходите на иную стилистику программирования - программные автоматы. Поясню на пальцах на вероятный "баг" в приведенном Вашем фрагменте кода.
Код:
// ТУТ ЗАПИСЫВАЕТСЯ ВРЕМЯ
Вы уверены, что тут изменилась переменная ds3231_rtc_data.seconds. Но т.к. работает с внешнем тайкиппером, то Вы должны допускать вероятность, что переменная может не измениться и Вы попадете в while .
_________________ Для связи email: info собака qbit.su
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения