Компилятор IAR

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Компилятор IAR

Сообщение pokk »

Здравствуйте, возникла такая ситуация, при пошаговом выполнении программы моя программа работает (отсылает пакет), а при циклическом или до точки остановке не работает.
Чем может отличается работы программы в пошаго режиме от выполнения в процессоре ? Вариант со скоростью убрал наставил после каждой строки задержку. Всё равно так же работает.
В чём ещё отличия? Думал что со стеком проблемы могут быть но они должны были быть и в пошаговом режиме.
Реклама
Шурики
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Re: Компилятор IAR

Сообщение Шурики »

Хотя бы исходники выложите, а то не понятно о чём речь.

А эмуляция всегда отличается от "физики".
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Компилятор IAR

Сообщение pokk »

А эмуляция всегда отличается от "физики".
Вот я и спрашиваю чем она отличатся может?
Зачем тут исходники то.
Шурики
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Re: Компилятор IAR

Сообщение Шурики »

Если входные сигналы периодические, тогда всё нормально. Если входные сигналы случайные, то по-другому.
А, по большому счёту, в эмуляторах всегда применяется "упрощённая модель".

Ну, например, подключаем графический экран 128х128 на АВР. На эмуляторе всё красиво работает. В физике нет. Наитого кто будет инициализировать экран? т.е. в эмуляторе были применены упрощённые модели устройства.

А насчёт кода, не хочите, не выкладывайте. Никто его не сопрёт. Вы, просто, задали вопрос с середины собственной мысли...
А когда у человека спрашивают "и что?", не всегда понятно о чём идёт речь.

Или Вы АВР, физически запустили в пошаговом режиме? Ну непонятно. Поэтому встречные вопросы...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Компилятор IAR

Сообщение BCluster »

Я думаю тут речь идет не об эмуляции, а о пошаговой отладке.
Сталкивался с подобной штукой, у меня дело было в оптимизации. Вы ее выключите вообще для теста, и посмотрите, будет ли работать. И лучше да, покажите код :)
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Компилятор IAR

Сообщение pokk »

BCluster, Благодарю за помощь. Скорее всего это так всё дело в оптимизации. недавно сталкнулся опять с такой же проблемой когда пытался писать во flash но там я наставил пару циклов while(1) что бы она всю память не перетёрла.
возможно оптимизатор их как-то по удалял. Код пока выложить не могу.

А что скажите на счёт этого?
http://radiokot.ru/forum/viewtopic.php? ... 2#p1866592
Реклама
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Компилятор IAR

Сообщение BCluster »

В той теме отписался. Насчет оптимизации - вы определите, все же причину. Я все функции которые глючили при включенной оптимизации проанализировал и понял в чем были проблемы.
Часто встречается такое, что, допустим ждем приема по уарт:

while (UARTRCVDFLAG);

а на самом деле этот while соптимизирован нахрен ))
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Компилятор IAR

Сообщение YS »

Если включение оптимизации рушит код, то это обычно значит, что код плохо написан. Например, не проставлены volatile где надо, беда с порядком условий и т.п.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Компилятор IAR

Сообщение BCluster »

YS писал(а):Если включение оптимизации рушит код, то это обычно значит, что код плохо написан
Совершенно согласен с вами, товарищ :) Но все же, иногда случаются весьма странные вещи, особенно если участвует FreeRTOS или другая ОС :)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Компилятор IAR

Сообщение YS »

особенно если участвует FreeRTOS или другая ОС
О-о-о, это совсем другая история... :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Компилятор IAR

Сообщение pokk »

На удивление опять каким-то магическим образом всё заработало. Так же как и перестало работать.
Например, не проставлены volatile где надо, беда с порядком условий и т.п.
Раза 3-4 начинал читать про volatile так и не доходит где это ставить. Одно понял что если есть переменные которые используются в прерывании и в главном цикле их надо объявить как volatile.
Иначе компилятор может просто выкинуть эту переменную из главного цикла.

Если например в функцию передаём указатель на массив в котором (формируется запрос/ответ) и он проходит много функций 5-6 то его надо объявлять как volatile?
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Компилятор IAR

Сообщение Psych »

pokk писал(а):Если например в функцию передаём указатель на массив в котором (формируется запрос/ответ) и он проходит много функций 5-6 то его надо объявлять как volatile?
Нет.
В основном дело касается прерываний. Так как прерывание нарушает порядок выполнения программы, а компилятор это в расчет не берет.
Последний раз редактировалось Psych Чт дек 26, 2013 18:42:29, всего редактировалось 1 раз.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Компилятор IAR

Сообщение BCluster »

Насчет volatile. Имеем такой код:

Код: Выделить всё

int v = 0;
int main()
{
  while(1)
  {
     if (v==1)
        { // do something
        }
  }
}

С точки зрения здравого смысла понятно, что v никогда и ни при каких условиях не может стать 1. Компилятор рассуждает примерно также, поэтому он вообще не будет компилировать заведомо ложное условие и все что под ним.

Однако представим себе ситуацию, что помимо этого кода у нас еще есть обработчик прерывания:

Код: Выделить всё

ISRRoutine()
{
 v = 1;
}
Т.е. допустим, произошло некое событие, которое вызвало обработчик прерывания, и наша переменная v уже стала равной 1.
То есть, наше заведомо ложное условие уже перестает быть таковым по факту, однако не для компилятора. Он точно также "соптимизирует" это условие. Это происходит потому, что обработчик прерывания ниоткуда напрямую из кода не вызывается.
Для того, чтобы компилятор не выполнял оптимизации такого толка переменную следует объявить как volatile. Это означает, что компилятор будет считать, что переменная может измениться в любой момент - а каким образом, его не интересует.
Есть еще один момент связанный с volatile. volatile переменные должны быть модифицируемыми атомарно. Иначе возможна ситуация, когда скажем, основной цикл считывает переменную, а прерывание в этот же момент ее меняет. Получим неопределенный результат.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Компилятор IAR

Сообщение YS »

Вообще, если начинается магия, то имеет смысл попробовать объявить все глобальные переменные как volatile.
Одно понял что если есть переменные которые используются в прерывании и в главном цикле их надо объявить как volatile.
Главный смысл volatile - запрет оптимизатору делать какие-либо предположения насчет значения такой переменной и оптимизировать код исходя из этого. Т.е. код, который включает такую переменную, 100% будет присутствовать, даже если с точки зрения оптимизатора он не несет смысла.

Psych, с автором цитаты ошиблись. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Компилятор IAR

Сообщение Psych »

YS писал(а):Psych, с автором цитаты ошиблись.
Done.

Есть еще тут кое-какой момент. Volatile заставляет компилятор считывать переменную заново при её обращении в регистр. Появляются дополнительные команды пересылки.
Ответить

Вернуться в «Разные вопросы по МК»