реклама на сайте
подробности

 
 
> IAR AVR - когда вредна оптимизация...
Alechin
сообщение Oct 15 2007, 13:55
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Убил несколько часов на выключение WDT в Mega88 в программе на Си.
Вот такой код
__watchdog_reset();
MCUSR &= ~(1 << WDRF);
WDTCSR |= (1 << WDCE) | (1 << WDE);
WDTCSR = 0x00;
IAR при оптимизации умудрился разбить на процедуры (cross call), в результате чего между последовательными записями в WDTCSR проходило более 4 тактов, и выключенный изначально WDT включался, не давая нормально загрузиться системе.
Побороть смог только вынеся данный код в процедуру с выключением оптимизации для нее (#pragme optimize=none).
Возник вопрос - ни какими ключевыми словами нельзя изменить уровень оптимизации для фрагмента кода С ВОЗВРАТОМ к текущему уровню оптимизации (через #pragma optimize можно только установить требуемый уровень оптимизации, но не вернуться к установленному в свойствах проекта, по крайней мере я не нашел другого)?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xemul
сообщение Oct 16 2007, 16:36
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Код
#pragma optimize=none
inline static void foo(void)
{
   __watchdog_reset();
   MCUSR &= ~(1 << WDRF);
   cli();
   WDTCSR |= (1 << WDCE) | (1 << WDE);
   WDTCSR = 0x00;
   sei();
}
Go to the top of the page
 
+Quote Post
Runner
сообщение Apr 23 2009, 15:41
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 18-06-05
Пользователь №: 6 117



Цитата(xemul @ Oct 16 2007, 18:36) *
Код
#pragma optimize=none
inline static void foo(void)
{
   __watchdog_reset();
   MCUSR &= ~(1 << WDRF);
   cli();
   WDTCSR |= (1 << WDCE) | (1 << WDE);
   WDTCSR = 0x00;
   sei();
}


Вопрос знатокам: в указаном примере функция foo будет встраиваться? Мне inlining удается только когда поставлена опция оптимизации - high, а иначе RCALL foo. Не помогает даже #pragma inline=forced. (IARAVR 5.11B) unsure.gif
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Apr 23 2009, 20:05
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268



Цитата(Runner @ Apr 23 2009, 19:41) *
Вопрос знатокам: в указаном примере функция foo будет встраиваться? Мне inlining удается только когда поставлена опция оптимизации - high, а иначе RCALL foo. Не помогает даже #pragma inline=forced. (IARAVR 5.11B) unsure.gif


Самая вероятная ситуация: будет в релизе со включенной оптимизацией (а может и нет), в дебажной - будет отдельной процедурой.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 24 2009, 06:53
Сообщение #5


Гуру
******

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



Цитата(IgorMarx @ Apr 23 2009, 23:05) *
будет в релизе со включенной оптимизацией (а может и нет), в дебажной - будет отдельной процедурой.
А что, у компилятора или линкера есть какая то магическая опция "релизная версия"?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 24 2009, 07:06
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Сергей Борщ @ Apr 24 2009, 10:53) *
А что, у компилятора или линкера есть какая то магическая опция "релизная версия"?

Есть переключение target-а на release/debug
Это опция не компилятора/линкера, а такой жёлтенькой оболочки IAR EWB
Причём и в том, и в другом можно задать любой уровень оптимизации, но по умолчанию в дебаге включен по-моему, "Best debug support", который отключает оптимизацию вообще


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 24 2009, 10:00
Сообщение #7


Гуру
******

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



Цитата(MrYuran @ Apr 24 2009, 10:06) *
Это опция не компилятора/линкера, а такой жёлтенькой оболочки IAR EWB
В том то и дело. Это название совокупности галочек в настройках, расставленных оболочкой по умолчанию. Т.е. нельзя говорить о том, что поведение будет зависеть от выбора в оболочке target release или target debug. Поведение будет полностью определяться положением галочек, расставленных в оболочке, но никак не названием этого target.


Цитата(Dog Pawlowa @ Apr 24 2009, 11:38) *
Поскольку может быть встроена функция только в том же файле, где определена, встает вопрос вообще о правильности пути для более-менее серьезного проекта.
Путь однозначно правильный. Если нужно, функции с квалификатором inline, также как и static, могут быть вынесены в заголовочный файл. Объявление в виде функции (в отличие от макроса) возлагает на компилятор заботу о контроле правильности типов, а также о создании временных переменных для хранения параметров. Просто надо разобраться, почему не работает #pragma inline=forced. Возможно, они перешли на _Pragma("inline = forced"). И зачем вообще компилировать с оптимизацией, отличной от high - тоже совсем другой разговор.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 24 2009, 10:50
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Сергей Борщ @ Apr 24 2009, 13:00) *
Объявление в виде функции (в отличие от макроса) возлагает на компилятор заботу о контроле правильности типов, а также о создании временных переменных для хранения параметров.

В общем случае все это так, но если глянуть, с чего все начиналось у топикстартера, и какие же там переменные используются, то лично у меня вопрос остается.
Это просто разный инструмент, как вилка и ложка. Ложкой безопаснее, но вилкой в умелых то руках можно за два удара восемь дырок.... biggrin.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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
- - tourist   Цитата(Dog Pawlowa @ Apr 24 2009, 14:50) ...   Apr 24 2009, 12:08
- - Dog Pawlowa   Вот, наткнулся на свои макросы... Хм, запрета прер...   Apr 29 2009, 16:46
- - Dir   Цитата(tourist @ Apr 24 2009, 15:08) При ...   May 5 2009, 12:01
- - Сергей Борщ   Цитата(Dir @ May 5 2009, 15:01) Т.е. явно...   May 5 2009, 12:03
- - Dog Pawlowa   Я бы сформулировал по другому: Имеет ли право Атме...   May 5 2009, 12:13
- - Dir   Цитата(Сергей Борщ @ May 5 2009, 15:03) В...   May 5 2009, 12:21
- - Сергей Борщ   Цитата(Dir @ May 5 2009, 15:21) но, по па...   May 5 2009, 13:07
- - Dir   Цитата(Сергей Борщ @ May 5 2009, 16:07) О...   May 5 2009, 14:12
- - Сергей Борщ   Цитата(Dir @ May 5 2009, 17:12) Ведь посл...   May 5 2009, 16:12
- - Dir   Цитата(Сергей Борщ @ May 5 2009, 19:12) Н...   May 5 2009, 17:57


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 15:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016