Погуглив выяснил, что команда "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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения