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

 
 
> IAR vs AVR GCC, Непрокомпилы
IXFN50N80Q2
сообщение Jul 21 2009, 21:54
Сообщение #1


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

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Профессионально пишу уже 2 года на ASMе и Cшке(AVR GCC) для AVRок.
На GCC есть одна вещь которая бесит порой. Оптимизатор.
Работаю на уровне Os(высший, by size).
Оптимизирует нехреново. В железе работает, в отладчике на уровне переменных практически не протрассируеш. Только в дизасм смотри.
Так вот этот GCC иногда считает многие участки кода не нужными.

Допустим запускаю ацп конверсию с прерыванием, в прерывании ставлю какой то флаг,
и по флагу этому в цикле, я должен что то сделать. Ну да ладно подробности.
Факт в том что компилятор теряет логические связи, считает участок кода не нужным.
Выбрасывает его, ставит бесконечный цикл.
Бороться с ним конечно всячески можно(извращениями).

Вот хотел спросить, как по части непрокомпилов(непонимании компилятора) IAR ?
При максимальном уровне оптимизации.
Ну и скажите свои за и против IAR.
Просто думаю, стоит его осваивать взамен AVR GCC иль нет.

To Moderators, если в не тот раздел попал, просьба сильно не пинать.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 18)
aaarrr
сообщение Jul 21 2009, 22:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(IXFN50N80Q2 @ Jul 22 2009, 01:54) *
Допустим запускаю ацп конверсию с прерыванием, в прерывании ставлю какой то флаг,
и по флагу этому в цикле, я должен что то сделать. Ну да ладно подробности.
Факт в том что компилятор теряет логические связи, считает участок кода не нужным.
Выбрасывает его, ставит бесконечный цикл.
Бороться с ним конечно всячески можно(извращениями).

Простите, а Вам знакомо слово volatile?

Цитата(IXFN50N80Q2 @ Jul 22 2009, 01:54) *
Вот хотел спросить, как по части непрокомпилов(непонимании компилятора) IAR ?

Даже неологизм изобрели. Нет такого понятия, есть неправильно написанный софт.
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Jul 21 2009, 22:06
Сообщение #3


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

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Volatile Знаю. Но искать скрытые подвохи по дизасму(а такие бывали) как то не хочется. И все Volatile объявлять тоже не хороше.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 21 2009, 22:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(IXFN50N80Q2 @ Jul 22 2009, 02:06) *
Volatile Знаю. Но искать скрытые подвохи по дизасму(а такие бывали) как то не хочется. И все Volatile объявлять тоже не хороше.

Если возможны "скрытые подвохи", значит знаете недостаточно. В 99.999% случаев в ошибке виноват программист, а не "глючный компилятор".
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Jul 21 2009, 23:06
Сообщение #5


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

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Хм. Интересна ваша логика. Виноват программист. Понятно, что он, если не знает всех подводных камней компилятора.
Вообще то топик я создал о сравнении компиляторов в данном плане. подводных камешков, а не о знании всех подводных камешков конкретного.
Хм. Виноват программист, еще скажите свой компилятор написать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 21 2009, 23:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(IXFN50N80Q2 @ Jul 22 2009, 03:06) *
Хм. Интересна ваша логика. Виноват программист. Понятно, что он, если не знает всех подводных камней компилятора.

Да, виноват программист. Но не знает он не "подводные камни компилятора" (которых нет), а просто язык "C".

Цитата(IXFN50N80Q2 @ Jul 22 2009, 03:06) *
Хм. Виноват программист, еще скажите свой компилятор написать

Нет, достаточно изучить язык и стандарт, которого придерживаются существующие.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jul 21 2009, 23:20
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(IXFN50N80Q2 @ Jul 22 2009, 03:06) *
подводных камешков, а не о знании всех подводных камешков конкретного.
Хм. Виноват программист, еще скажите свой компилятор написать.

У любого нормального компилятора оптимизатор просто обязан вести себя схожим образом. Не нравятся его действия? Отключите оптимизатор. smile.gif
Или все же почитайте про volatile - что это и зачем нужно.
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Jul 21 2009, 23:29
Сообщение #8


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

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Ладно. Не буду с вами "ругаться" и пытаться что доказывать что WinAVR не идеален.
Было бы все идеально и безошибочно предсказуемо, IAR бы помер.
HT-PIC например банки у меня путал (очень редко), пока сам не взял за правило прописывать где че будет лежать,
встречались проблемы. А где разместить переменную, как и Volatile, сложно отнести к самому СИ.
Это всего лишь приказ компилятору- ЭТО ТУДА, а не C.

Согласен. Грамотно применяй Volatile да будет счастье в этом мире.

Но Volatile не C, а для оптимизатора. То что любой оптимизатор будет резать че нить, что не понравится, согласен.
Мне интересно сравнение с IAR. Как он понимает сложные конструкции кода

И еще могу добавить. На PIC тоже на Cшке пишу. Там при работе оптимизатора, как не странно, не разу не обрезался код, по его субъективному мнению.
MPLAB C18 на мой взгляд вообще отличная вещь. Подвохов от вообще нет.

Сообщение отредактировал IXFN50N80Q2 - Jul 21 2009, 23:31
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 21 2009, 23:36
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(IXFN50N80Q2 @ Jul 22 2009, 03:21) *
Но Volatile не C, а для оптимизатора. То что любой оптимизатор будет резать че нить, что не понравится, согласен.
Мне интересно сравнение с IAR. Как он понимает сложные конструкции кода

Оптимизатор будет "резать" строго в соответствии со стандартом и только. Кто-то "режет" хуже, из-за чего могут "работать" и те
программы, которые по причине ошибочного построения работать не должны.
У IAR'а с пониманием все в порядке, не сомневайтесь.

Цитата(IXFN50N80Q2 @ Jul 22 2009, 03:29) *
И еще могу добавить. На PIC тоже на Cшке пишу. Там при работе оптимизатора, как не странно, не разу не обрезался код, по его субъективному мнению.

Как раз случай недоработки оптимизатора. Нет у компилятора "субъективного мнения", он не разумен.

Приведите пример, что у Вас WinAVR несправедливо режет.
Go to the top of the page
 
+Quote Post
IXFN50N80Q2
сообщение Jul 21 2009, 23:43
Сообщение #10


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

Группа: Свой
Сообщений: 138
Регистрация: 12-05-09
Пользователь №: 48 987



Безвыходных случаев с WINAVR не было.
Всяческими способами я его заставлял понимать как надо.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 22 2009, 04:34
Сообщение #11


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

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



Цитата(IXFN50N80Q2 @ Jul 22 2009, 03:06) *
Вообще то топик я создал о сравнении компиляторов в данном плане. подводных камешков, а не о знании всех подводных камешков конкретного.

Ну, если сравнивать IAR и GCC, то с ИАРом у меня отношения хуже складываются (для MSP430).
Полного взаимопонимания нет.
Иногда неправильно отрабатывает if, и на раскопки причины уходит несколько часов.
Наверно, это таки моя вина, а не компилятора, однако факт.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2009, 04:53
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IXFN50N80Q2 @ Jul 22 2009, 00:54) *
На GCC есть одна вещь которая бесит порой. Оптимизатор.

Могу только поддержать aaarrr - у Вас действительно обычные sad.gif проблемы с выражением мыслей на 'C'. Поиски "правильного" компилятора бесполезны - 99,9% Ваших проблем не в компиляторе sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
msalov
сообщение Jul 22 2009, 06:34
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



 
Цитата(IXFN50N80Q2 @ Jul 22 2009, 02:29) *
MPLAB C18 на мой взгляд вообще отличная вещь. Подвохов от вообще нет.


Ну не знаю, за свое недолгое общение с этим продуктом (около года), были найдены баги компилятора (неправильное отрабатывание битового поля нулевой ширины, предупреждения при преобразования указателей к const void* и т.п., всего уже не помню). Хорошо что служба поддержки на это реагирует, хоть и не с первого раза  unsure.gif

В других компиляторах ничего не нашёл smile.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 22 2009, 07:44
Сообщение #14


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Нет ничего идеального. Все создается людьми. Другое дело, что коммерческий IAR может быть лучше по некоторым критериям, чем бесплатный GCC. Просто рабочий коллектив получает за работу деньги и не один день специализуруется в отрасли средств разработки.
Уважаемый IXFN50N80Q2! А что Вы хотите сказать? Может быть приведете кусочек кода с листингом?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
tag
сообщение Jul 22 2009, 12:26
Сообщение #15


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(IXFN50N80Q2 @ Jul 22 2009, 02:29) *
Согласен. Грамотно применяй Volatile да будет счастье в этом мире.

Но Volatile не C, а для оптимизатора. То что любой оптимизатор будет резать че нить, что не понравится, согласен.
Мне интересно сравнение с IAR. Как он понимает сложные конструкции кода


...уверяю Вас IAR в таком случае порежет не хуже.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 22 2009, 15:06
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Задача компилятора - перевести описание с языка, понятного человеку (ЯВУ), на язык, "понятный" МК или CPU, используя формализованные правила. Причем формализованные правила составляет тоже человек или группа людей, те, которые компилятор писали. Если в дилемме: кто был первым яйцо или курица?, то бишь что первично компилятор или программист, его использующий?, считать первичным компилятор, то так и выходит - в 99,9% виноват программист, который не прочитал, не понял или недопонял правила по которым работает компилятор. 0,1% отнесем на ошибки, допущенные теми, кто писал компилятор или документацию для него, т.к. никто полностью от ошибок не застрахован.
Использование квалификатора volatile для описания глобальных переменных, модифицируемых в прерываниях, это всего лишь начальные азы понимания о том, по каким правилам работает компилятор. Но ради справедливости стоит уточнить, что на эти "грабли" наступает очень много начинающих программировать на Си, которые бегло прочитали стандарт Си, но не удосужились прочитать документацию на используемый ими компилятор. Поэтому программа вида
Код
unsigned int cntr;

void main(void)
{
  ...
  cntr=1000;
  while(cntr!=0);
  ...
}

#pragma vector=TIMER_VECTOR
#pragma type_attribute=__interrupt
void TIMER_ISR (void)
{ if (cntr>0)
    cntr--;
}

практически всегда будет компилироваться так, что оператор while скомпилируется в "вечный цикл", вне зависимости от правильности инициализации/функционирования таймера и описания функции обработчика его прерывания. А чтобы этого не произошло обычно достаточно пояснить компилятору, что именно вы от него хотите, объявив переменную cntr как
Код
volatile unsigned int cntr;
laughing.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 22 2009, 15:11
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(rezident @ Jul 22 2009, 19:06) *
Задача компилятора - перевести описание с языка, понятного человеку (ЯВУ), на язык, "понятный" МК или CPU, используя формализованные правила. Причем формализованные правила составляет тоже человек или группа людей, те, которые компилятор писали. Если в дилемме: кто был первым яйцо или курица?, то бишь что первично компилятор или программист, его использующий?

Формализованные правила все-таки создаются авторами стдандарта, который и является первичной сущностью.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 22 2009, 15:24
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(tag @ Jul 22 2009, 15:26) *
...уверяю Вас IAR в таком случае порежет не хуже.

Точнее порежет больше, по определению... smile.gif

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

Соответственно писать надо правильно.

Вы сами посудите... Есть у вас код к примеру...

flag=0;
for(;;)
{
if(flag)break;
}

А флаг устанавливается в каком-то постороннем прерывании. Прерывание, с точки зрения компилятора, просто процедура.
Откуда компилятор знает есть у вас прерывание или нет, разрешено оно или нет... Оно вообще может быть написано на ассемблере или на паскале и прилинковано на этапе сборки... То есть компилятор может вообще не знать о наличии движения по данной переменной.
И что сделает нормальный компилятор (например IAR) - он выбросит и этот цикл да и вообще весь текст ниже цикла. Ну и сообщит, что текст ниже "не имеет смысла". Если вы эту переменную объявите volatile, то этого не произойдёт.

И volatile - это не указание оптимизатору. Это указание что переменная является "внешней". Это надо понимать.

Представьте что у МК единое адресное пространство (целый ряд процов). И переферия, соответственно, читается не "особой" командой, а так как ячейка памяти. Да даже возьмите туже ATMega8515 и к внешней шине памяти прицепите какое нибудь внешнее устройство. Допустим это таймер с адресом 0xfff0. С точки зрения компилятора - обычная ячейка памяти. Теперь, для этой ячейки памяти операция типа extifr=extifr; будет иметь смысл. А для внутренней памяти - абсолютно бессмысленна, и её можно оптимизировать. И как их различить?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 22 2009, 15:40
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(aaarrr @ Jul 22 2009, 21:11) *
Формализованные правила все-таки создаются авторами стдандарта, который и является первичной сущностью.
Могу согласится, но с тем уточнением, что в стандарте Си многие правила недостаточно конкретизированы. А конкретная реализация их как раз в компиляторе проявляется.
Go to the top of the page
 
+Quote Post

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

 


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


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