Например TDA7294

Форум РадиоКот • Просмотр темы - While компилируется в вечный цикл
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт мар 29, 2024 00:27:56

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 01:50:10 
Сверлит текстолит когтями
Аватар пользователя

Карма: 12
Рейтинг сообщений: 252
Зарегистрирован: Пн апр 14, 2008 12:54:35
Сообщений: 1289
Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения: 0
Доброго времени суток. Cтолкнулся с такой проблемой, код вида
Код:
while (flag){};
компилируется в вечный цикл, ассемблерный код этой строчки выглядит так:
Код:
08004242: ldrb r3, [r4, #0]
08004244: cmp r3, r5
08004246: bne.n 0x800424a
08004248: b.n 0x8004248

Погуглив выяснил, что команда "bne.n" это переход, если z = 0, а команда "b" - безусловный переход.
То есть получается, если flag = 0 и мы заходим в цикл ожидания, процессор сразу из него выходит, а если зайти в цикл, когда flag отличается от нуля, мы попадем в вечный цикл. Такая история появляется только в одной большой функции, где нужно после получения команды с юсарт подождать, пока не завершится какое-то действие. в программе у меня много где такой цикл используется, но никогда не было проблем.
Объявление переменной:
Код:
volatile u8 flag = 0;

Волатильная, не волатильная - ничего не меняется. flag гарантировано возвращается в 0 по ходу работы программы (смотрел дебаггером).
Среда CooCox 1.7.6, gcc 4.8 2014q3

_________________
Опыт приходит сразу после того, как он был нужен...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 04:04:19 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7212
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Проверьте "видимость" этой переменной. Не случается ли так, что меняется одна локальная, а опрашивается другая локальная переменная с тем же именем. Чудес не бывает. А подобные баги компилятора вылавливаются на уровне альфатестирования. И переменная должна быть волатильной, иначе оптимизатор её примет равной нулю всегда.

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 06:33:12 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2057
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18024
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
:facepalm:

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

скушно, бабоньки!


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 11:03:24 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1349
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14019
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Так правильно и скомпилировалось - ежли flag равно нулю - прыгаем за пределы цикла.
8)


Вернуться наверх
 
Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.

Подробнее>>
Не в сети
 Заголовок сообщения: 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 для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 12:24:59 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (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;
}
}

На первый раз выполняется правильно, на второй раз виснет на ожидании.
:facepalm: Спасибо за внимание, сделал ds3231_rtc_data.seconds тоже волатильной и оно заработало.

А с флагом хз что было)) но тоже работает. Магия какая-то.

_________________
Опыт приходит сразу после того, как он был нужен...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 13:00:57 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Спасибо за внимание, сделал ds3231_rtc_data.seconds тоже волатильной и оно заработало.

У тебя в цикле может меняться ds3231_rtc_data.seconds, а sec_tmp не может, она вообще локальная, ее извне никак не поменяешь, потому второй volatile лишний.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 13:15:24 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Ну вот, так всегда, как начинают код светить, так чудеса куда-то сами растворяются...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: 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 может где-то измениться.

_________________
Опыт приходит сразу после того, как он был нужен...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Вт апр 16, 2019 22:23:06 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 13
Зарегистрирован: Вт апр 02, 2013 10:03:29
Сообщений: 100
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Ваша беда в поголовном использовании while. Переходите на иную стилистику программирования - программные автоматы.
Поясню на пальцах на вероятный "баг" в приведенном Вашем фрагменте кода.
Код:
   // ТУТ ЗАПИСЫВАЕТСЯ ВРЕМЯ

Вы уверены, что тут изменилась переменная ds3231_rtc_data.seconds. Но т.к. работает с внешнем тайкиппером, то Вы должны допускать вероятность, что переменная может не измениться и Вы попадете в while .

_________________
Для связи email: info собака qbit.su


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y