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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> IAR vs AVR GCC, Непрокомпилы
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 - 01:36
Рейтинг@Mail.ru


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