|
IAR AVR - когда вредна оптимизация... |
|
|
|
 |
Ответов
|
Apr 24 2009, 12:08
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 6-04-09
Из: Донецк
Пользователь №: 47 247

|
Цитата(Dog Pawlowa @ Apr 24 2009, 14:50)  В общем случае все это так, но если глянуть, с чего все начиналось у топикстартера, и какие же там переменные используются, то лично у меня вопрос остается. При записи вида: Код WDTCSR |= (1 << WDCE) | (1 << WDE); Компилятор действительно генерит код не укладывающийся в 4 такта... Я решал проблему, описываемую автором темы, записью нужного числа непосредственно в регистр, типа того: Код WDTCSR |= 0x01; При этом (как ни странно) код получается нормальный, даже с полной оптимизацией, и число попадает в регистр без лишних тедлодвижений... ИМХО автор перемудрил с отключением оптимизации для функции...
Сообщение отредактировал tourist - Apr 24 2009, 12:13
--------------------
|
|
|
|
|
May 5 2009, 12:01
|

Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 6-01-05
Пользователь №: 1 830

|
Цитата(tourist @ Apr 24 2009, 15:08)  При записи вида: Код WDTCSR |= (1 << WDCE) | (1 << WDE); Компилятор действительно генерит код не укладывающийся в 4 такта... Я решал проблему, описываемую автором темы, записью нужного числа непосредственно в регистр, типа того: Код WDTCSR |= 0x01; При этом (как ни странно) код получается нормальный, даже с полной оптимизацией, и число попадает в регистр без лишних тедлодвижений... ИМХО автор перемудрил с отключением оптимизации для функции... Вот именно, что все это очень странно. Насколько меня учили, порты в МК - это volatile-переменные, поэтому компилятор при оптимизации должен позаботиться о всех сторонних эффектах, если он претендует на совместимость со стандартом "С". Т.е. явное игнорирование разработчиками компилятора стандарта. Попросту говоря, баг. Или не так?
|
|
|
|
|
May 5 2009, 13:07
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Dir @ May 5 2009, 15:21)  но, по памяти, стандарт прямо запрещает оптимизацию ДАЖЕ по времени, если в этом принимают участие volatile-переменные. Освежите. В стандарте нет ни слова о времени. Компилятор обязан выполнить все указанные в программе обращения (на чтения и запись) к volatile-переменным и не имеет права нарушить их последовательность. Все. НА этом обязанности компилятора заканчиваются. Цитата(Dir @ May 5 2009, 15:21)  А тут работу препроцессора взял на себя компилятор и оптимизировал как хотел... Компилятор НЕ ИМЕЛ ПРАВА на такие вольности. Где оптимизация? Где работа препроцессора? Где вольности в конце концов? Компилятор сделал чтение-наложение маски-запись. Все как заказывали. С точки зрения стандарта никаких нарушений.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 5 2009, 14:12
|

Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 6-01-05
Пользователь №: 1 830

|
Цитата(Сергей Борщ @ May 5 2009, 16:07)  Освежите. В стандарте нет ни слова о времени. Компилятор обязан выполнить все указанные в программе обращения (на чтения и запись) к volatile-переменным и не имеет права нарушить их последовательность. Все. НА этом обязанности компилятора заканчиваются.Где оптимизация? Где работа препроцессора? Где вольности в конце концов? Компилятор сделал чтение-наложение маски-запись. Все как заказывали. С точки зрения стандарта никаких нарушений. Тогда вообще ничего не понятно. Почему, как указывалось в http://electronix.ru/forum/index.php?showt...st&p=583723"Код WDTCSR |= (1 << WDCE) | (1 << WDE); Компилятор действительно генерит код не укладывающийся в 4 такта... Я решал проблему, описываемую автором темы, записью нужного числа непосредственно в регистр, типа того: Код WDTCSR |= 0x01; При этом (как ни странно) код получается нормальный, даже с полной оптимизацией, и число попадает в регистр без лишних тедлодвижений..." Ведь после препроцессора компилятору попадает один и тот же код! Понятно, что препроцессор в стандарт не входит, но ведь получается, что "с точки зрения стандарта" компилятор вполне может разбить константное выражение и использовать его часть для своих оптимизационных ухищрений.
|
|
|
|
Сообщений в этой теме
Alechin IAR AVR - когда вредна оптимизация... Oct 15 2007, 13:55 scifi Мне кажется, тут двух мнений быть не может: если н... Oct 15 2007, 17:54 PSP И еще не забыть запретить прерывания. Иначе баг из... Oct 15 2007, 19:56 IgorKossak Цитата(Alechin @ Oct 15 2007, 16:55) Побо... Oct 16 2007, 09:23 Alechin ЦитатаВ руководстве сказано:
это означает, что дан... Oct 16 2007, 15:22 xemul Код#pragma optimize=none
inline static void foo... Oct 16 2007, 16:36 Runner Цитата(xemul @ Oct 16 2007, 18:36) Код#pr... Apr 23 2009, 15:41  IgorMarx Цитата(Runner @ Apr 23 2009, 19:41) Вопро... Apr 23 2009, 20:05   Сергей Борщ Цитата(IgorMarx @ Apr 23 2009, 23:05) буд... Apr 24 2009, 06:53    MrYuran Цитата(Сергей Борщ @ Apr 24 2009, 10:53) ... Apr 24 2009, 07:06     Сергей Борщ Цитата(MrYuran @ Apr 24 2009, 10:06) Это ... Apr 24 2009, 10:00      Dog Pawlowa Цитата(Сергей Борщ @ Apr 24 2009, 13:00) ... Apr 24 2009, 10:50  sergeeff Цитата(Runner @ Apr 23 2009, 18:41) Вопро... Apr 23 2009, 21:37  Dog Pawlowa Цитата(Runner @ Apr 23 2009, 18:41) Вопро... Apr 24 2009, 08:38 Dog Pawlowa Вот, наткнулся на свои макросы...
Хм, запрета прер... Apr 29 2009, 16:46   Dog Pawlowa Я бы сформулировал по другому:
Имеет ли право Атме... May 5 2009, 12:13      Сергей Борщ Цитата(Dir @ May 5 2009, 17:12) Ведь посл... May 5 2009, 16:12       Dir Цитата(Сергей Борщ @ May 5 2009, 19:12) Н... May 5 2009, 17:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|