Компилятор IAR
Компилятор IAR
Здравствуйте, возникла такая ситуация, при пошаговом выполнении программы моя программа работает (отсылает пакет), а при циклическом или до точки остановке не работает.
Чем может отличается работы программы в пошаго режиме от выполнения в процессоре ? Вариант со скоростью убрал наставил после каждой строки задержку. Всё равно так же работает.
В чём ещё отличия? Думал что со стеком проблемы могут быть но они должны были быть и в пошаговом режиме.
Чем может отличается работы программы в пошаго режиме от выполнения в процессоре ? Вариант со скоростью убрал наставил после каждой строки задержку. Всё равно так же работает.
В чём ещё отличия? Думал что со стеком проблемы могут быть но они должны были быть и в пошаговом режиме.
- Реклама
Re: Компилятор IAR
Хотя бы исходники выложите, а то не понятно о чём речь.
А эмуляция всегда отличается от "физики".
А эмуляция всегда отличается от "физики".
Re: Компилятор IAR
Вот я и спрашиваю чем она отличатся может?А эмуляция всегда отличается от "физики".
Зачем тут исходники то.
Re: Компилятор IAR
Если входные сигналы периодические, тогда всё нормально. Если входные сигналы случайные, то по-другому.
А, по большому счёту, в эмуляторах всегда применяется "упрощённая модель".
Ну, например, подключаем графический экран 128х128 на АВР. На эмуляторе всё красиво работает. В физике нет. Наитого кто будет инициализировать экран? т.е. в эмуляторе были применены упрощённые модели устройства.
А насчёт кода, не хочите, не выкладывайте. Никто его не сопрёт. Вы, просто, задали вопрос с середины собственной мысли...
А когда у человека спрашивают "и что?", не всегда понятно о чём идёт речь.
Или Вы АВР, физически запустили в пошаговом режиме? Ну непонятно. Поэтому встречные вопросы...
А, по большому счёту, в эмуляторах всегда применяется "упрощённая модель".
Ну, например, подключаем графический экран 128х128 на АВР. На эмуляторе всё красиво работает. В физике нет. Наитого кто будет инициализировать экран? т.е. в эмуляторе были применены упрощённые модели устройства.
А насчёт кода, не хочите, не выкладывайте. Никто его не сопрёт. Вы, просто, задали вопрос с середины собственной мысли...
А когда у человека спрашивают "и что?", не всегда понятно о чём идёт речь.
Или Вы АВР, физически запустили в пошаговом режиме? Ну непонятно. Поэтому встречные вопросы...
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Компилятор IAR
Я думаю тут речь идет не об эмуляции, а о пошаговой отладке.
Сталкивался с подобной штукой, у меня дело было в оптимизации. Вы ее выключите вообще для теста, и посмотрите, будет ли работать. И лучше да, покажите код
Сталкивался с подобной штукой, у меня дело было в оптимизации. Вы ее выключите вообще для теста, и посмотрите, будет ли работать. И лучше да, покажите код
- Реклама
Re: Компилятор IAR
BCluster, Благодарю за помощь. Скорее всего это так всё дело в оптимизации. недавно сталкнулся опять с такой же проблемой когда пытался писать во flash но там я наставил пару циклов while(1) что бы она всю память не перетёрла.
возможно оптимизатор их как-то по удалял. Код пока выложить не могу.
А что скажите на счёт этого?
http://radiokot.ru/forum/viewtopic.php? ... 2#p1866592
возможно оптимизатор их как-то по удалял. Код пока выложить не могу.
А что скажите на счёт этого?
http://radiokot.ru/forum/viewtopic.php? ... 2#p1866592
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Компилятор IAR
В той теме отписался. Насчет оптимизации - вы определите, все же причину. Я все функции которые глючили при включенной оптимизации проанализировал и понял в чем были проблемы.
Часто встречается такое, что, допустим ждем приема по уарт:
while (UARTRCVDFLAG);
а на самом деле этот while соптимизирован нахрен ))
Часто встречается такое, что, допустим ждем приема по уарт:
while (UARTRCVDFLAG);
а на самом деле этот while соптимизирован нахрен ))
Re: Компилятор IAR
Если включение оптимизации рушит код, то это обычно значит, что код плохо написан. Например, не проставлены volatile где надо, беда с порядком условий и т.п.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Компилятор IAR
Совершенно согласен с вами, товарищYS писал(а):Если включение оптимизации рушит код, то это обычно значит, что код плохо написан
Re: Компилятор IAR
О-о-о, это совсем другая история...особенно если участвует FreeRTOS или другая ОС
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Компилятор IAR
На удивление опять каким-то магическим образом всё заработало. Так же как и перестало работать.
Иначе компилятор может просто выкинуть эту переменную из главного цикла.
Если например в функцию передаём указатель на массив в котором (формируется запрос/ответ) и он проходит много функций 5-6 то его надо объявлять как volatile?
Раза 3-4 начинал читать про volatile так и не доходит где это ставить. Одно понял что если есть переменные которые используются в прерывании и в главном цикле их надо объявить как volatile.Например, не проставлены volatile где надо, беда с порядком условий и т.п.
Иначе компилятор может просто выкинуть эту переменную из главного цикла.
Если например в функцию передаём указатель на массив в котором (формируется запрос/ответ) и он проходит много функций 5-6 то его надо объявлять как volatile?
Re: Компилятор IAR
Нет.pokk писал(а):Если например в функцию передаём указатель на массив в котором (формируется запрос/ответ) и он проходит много функций 5-6 то его надо объявлять как volatile?
В основном дело касается прерываний. Так как прерывание нарушает порядок выполнения программы, а компилятор это в расчет не берет.
Последний раз редактировалось Psych Чт дек 26, 2013 18:42:29, всего редактировалось 1 раз.
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Компилятор IAR
Насчет volatile. Имеем такой код:
С точки зрения здравого смысла понятно, что v никогда и ни при каких условиях не может стать 1. Компилятор рассуждает примерно также, поэтому он вообще не будет компилировать заведомо ложное условие и все что под ним.
Однако представим себе ситуацию, что помимо этого кода у нас еще есть обработчик прерывания:
Т.е. допустим, произошло некое событие, которое вызвало обработчик прерывания, и наша переменная v уже стала равной 1.
То есть, наше заведомо ложное условие уже перестает быть таковым по факту, однако не для компилятора. Он точно также "соптимизирует" это условие. Это происходит потому, что обработчик прерывания ниоткуда напрямую из кода не вызывается.
Для того, чтобы компилятор не выполнял оптимизации такого толка переменную следует объявить как volatile. Это означает, что компилятор будет считать, что переменная может измениться в любой момент - а каким образом, его не интересует.
Есть еще один момент связанный с volatile. volatile переменные должны быть модифицируемыми атомарно. Иначе возможна ситуация, когда скажем, основной цикл считывает переменную, а прерывание в этот же момент ее меняет. Получим неопределенный результат.
Код: Выделить всё
int v = 0;
int main()
{
while(1)
{
if (v==1)
{ // do something
}
}
}
Однако представим себе ситуацию, что помимо этого кода у нас еще есть обработчик прерывания:
Код: Выделить всё
ISRRoutine()
{
v = 1;
}
То есть, наше заведомо ложное условие уже перестает быть таковым по факту, однако не для компилятора. Он точно также "соптимизирует" это условие. Это происходит потому, что обработчик прерывания ниоткуда напрямую из кода не вызывается.
Для того, чтобы компилятор не выполнял оптимизации такого толка переменную следует объявить как volatile. Это означает, что компилятор будет считать, что переменная может измениться в любой момент - а каким образом, его не интересует.
Есть еще один момент связанный с volatile. volatile переменные должны быть модифицируемыми атомарно. Иначе возможна ситуация, когда скажем, основной цикл считывает переменную, а прерывание в этот же момент ее меняет. Получим неопределенный результат.
Re: Компилятор IAR
Вообще, если начинается магия, то имеет смысл попробовать объявить все глобальные переменные как volatile.
Psych, с автором цитаты ошиблись.
Главный смысл volatile - запрет оптимизатору делать какие-либо предположения насчет значения такой переменной и оптимизировать код исходя из этого. Т.е. код, который включает такую переменную, 100% будет присутствовать, даже если с точки зрения оптимизатора он не несет смысла.Одно понял что если есть переменные которые используются в прерывании и в главном цикле их надо объявить как volatile.
Psych, с автором цитаты ошиблись.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Компилятор IAR
Done.YS писал(а):Psych, с автором цитаты ошиблись.
Есть еще тут кое-какой момент. Volatile заставляет компилятор считывать переменную заново при её обращении в регистр. Появляются дополнительные команды пересылки.


