Например TDA7294

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



Текущее время: Ср июл 17, 2019 21:18:34

Часовой пояс: UTC + 3 часа [ Летнее время ]


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



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

Карма: 10
Рейтинг сообщений: 202
Зарегистрирован: Пн апр 14, 2008 13:54:35
Сообщений: 1222
Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения: 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 05:04:19 
Друг Кота
Аватар пользователя

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

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


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

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

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

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


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

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

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

Карма: 79
Рейтинг сообщений: 744
Зарегистрирован: Вт мар 16, 2010 23:02:27
Сообщений: 9294
Откуда: ДОНЕЦК (ЮГО-ВОСТОК ua/DPR)
Рейтинг сообщения: 0
Так правильно и скомпилировалось - ежли flag равно нулю - прыгаем за пределы цикла.
8)


Вернуться наверх
 
Плавкие предохранители LittelFuse. Грамотный подбор

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

Карма: 10
Рейтинг сообщений: 202
Зарегистрирован: Пн апр 14, 2008 13:54:35
Сообщений: 1222
Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения: 0
Еще раз. Флаг волатильный, = 0 в его инициализации, в процессе работы программы он меняется 10000000%
У меня не только с этой переменной проблема.

Добавлено after 5 minutes 59 seconds:
Так же этот косяк всплывает со строчкой
Код:
while (mseconds >= 98){};

Ассемблер тот же, проваливается в бесконечный цикл, если на момент попадания в цикл, mseconds больше или равен 98.
Эту переменную так же делал волатильной, а инициализация нулем отсутствует.

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


Вернуться наверх
 
Немногим дороже дискретного решения: новое поколение импульсных стабилизаторов Mornsun

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 13:24:59 
Модератор
Аватар пользователя

Карма: 77
Рейтинг сообщений: 782
Зарегистрирован: Пт мар 19, 2010 00:09:57
Сообщений: 4038
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Волосатый, Вы нам рассказываете про чудеса. volatile должен (даже обязан) решить эту проблему, причём независимо от того, чем инициализирована переменная.

_________________
Я мненью вашему вращенье придавал, а осью был - мой детородный орган.


Вернуться наверх
 


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

Карма: 10
Рейтинг сообщений: 202
Зарегистрирован: Пн апр 14, 2008 13:54:35
Сообщений: 1222
Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения: 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 14:00:57 
Опытный кот

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

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


Вернуться наверх
 
Prist.ru предлагает скидку всем частным лицам при покупке приборов АКИП, GW Instek, APPA (кроме осциллографов АКИП-4115/1А, GDS-71102)!

Интересные новинки уже на складе:

Осциллограф АКИП-4126Е

Многоканальные источники питания серии GPP

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

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


Вернуться наверх
 
Купить электронные компоненты в LCSC

Отправка со склада через 4 часа после заказа!
900 000 пользователей, 3000+ заказов в день!
Зарегистрируйтесь сегодня и получите скидку 8 долларов на первый заказ!
Не в сети
 Заголовок сообщения: Re: While компилируется в вечный цикл
СообщениеДобавлено: Пн апр 15, 2019 15:00:58 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 202
Зарегистрирован: Пн апр 14, 2008 13:54:35
Сообщений: 1222
Откуда: Город ГЕРОЙ Ленинград
Рейтинг сообщения: 0
У меня логика была такая, что sec_tmp мы только что приравняли к ds3231_rtc_data.seconds и тут же их сравниваем, компилятор то не знает, что ds3231_rtc_data.seconds может где-то измениться.

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


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

Карма: 4
Рейтинг сообщений: 12
Зарегистрирован: Вт апр 02, 2013 11:03:29
Сообщений: 70
Откуда: Санкт-Петербург
Рейтинг сообщения: 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