|
Компилятор в IAR, ньюансы обращения к переменным |
|
|
|
Dec 27 2006, 08:44
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 14-08-06
Пользователь №: 19 528

|
Цитата(Rst7 @ Dec 26 2006, 16:09)  В принципе, я придерживаюсь мнения, что компилятору надо подсказывать, что делать. А также помнить об особеностях процессора - в данном случае не надо забывать, что у нас не аккумуляторная машина, и регистров валом. Имеет смысл написать так: Код char TimeOut; // ãëîáàëüíàÿ ïåðåìåííàÿ
__interrupt void TimerInt() { char to=TimeOut; if (to) TimeOut=--to; } Да, я понимаю, хотелось бы, чтобы компилятор сам это делал... Но с другой стороны, если лень-матушка, программируйте на Делфи для большого брата, вообще не надо думать... Хе-хе. И правда в таком случае IAR все делает грамотно. Вот только читабельность кода страдает. Наверно и вправду чем быстрее код - тем ближе к ассемблеру :-) PS: всех с наступающим!
|
|
|
|
|
Dec 27 2006, 10:27
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(zltigo @ Dec 26 2006, 16:27)  Цитата(Rst7 @ Dec 26 2006, 15:09)  Имеет смысл написать так: Код char to=TimeOut; Если уж подсказывать, то подсказывать по полной программе: Код register char to=TimeOut; Вообще-то, IAR игнорирует ключевое слово register. Или нет?
|
|
|
|
|
Dec 27 2006, 14:48
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(IgorKossak @ Dec 27 2006, 17:18)  Цитата(_Bill @ Dec 27 2006, 09:27)  Вообще-то, IAR игнорирует ключевое слово register. Или нет?
Может игнорировать если нельзя обеспечить. Причем игнорировать молча. Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая. Так сегодня поступает подавляющее большинство (если не все) компиляторов. От ключевого слова register ничего не зависит, оно является рудиментом и артефактом. Оставленным в языке для совместимости со старым кодом. Есть не просит, пусть будет.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 27 2006, 15:41
|

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

|
Цитата(dxp @ Dec 27 2006, 13:48)  Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая. Верно, НО! если на всех регистров не хватает, то тут оно и сработает отдав предпочтение подсказке. Использую довольно часто часто в сложных конструкциях - меня не затрудняет подсказать и компилятор тоже не напрягает  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 27 2006, 19:03
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(dxp @ Dec 27 2006, 14:48)  Цитата(IgorKossak @ Dec 27 2006, 17:18)  Цитата(_Bill @ Dec 27 2006, 09:27)  Вообще-то, IAR игнорирует ключевое слово register. Или нет?
Может игнорировать если нельзя обеспечить. Причем игнорировать молча. Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая. Так сегодня поступает подавляющее большинство (если не все) компиляторов. От ключевого слова register ничего не зависит, оно является рудиментом и артефактом. Оставленным в языке для совместимости со старым кодом. Есть не просит, пусть будет. Это не совсем так. Просто в IAR сделано именно так. Где размещать переменные решает только компилятор. В других средах (например, в Borland) имеется возможность выбора: не размещать переменные в регистрах, размещать автоматически или размещать по ключевому слову register. Сейчас, когда ресурсов в PC предостаточно, компиляторы стали достаточно "умными", то необходимость в использовании register как бы отпадает. Но в контроллерах с ограниченными ресурсами иногда желательно дать возможность решать вопрос о размещении переменных самому программисту.
|
|
|
|
|
Dec 28 2006, 07:32
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(_Bill @ Dec 27 2006, 22:03)  Это не совсем так. Просто в IAR сделано именно так. Где размещать переменные решает только компилятор. В других средах (например, в Borland) имеется возможность выбора: не размещать переменные в регистрах, размещать автоматически или размещать по ключевому слову register. И как, например, запретить размещать переменную в регистре? Какое ключевое слово для этого используется? Цитата(_Bill @ Dec 27 2006, 22:03)  Сейчас, когда ресурсов в PC предостаточно, компиляторы стали достаточно "умными", то необходимость в использовании register как бы отпадает. Но в контроллерах с ограниченными ресурсами иногда желательно дать возможность решать вопрос о размещении переменных самому программисту. Борланд - это PC. Неужто в нем недостаток регистров? Ни разу не встречал в коде для Борланда (начиная с версий оного 4 и выше) подобных попыток оптимизаций. Имхо, уже давным давно прошла необходимость рулить такими оптимизациями из С-кода. Компилятор с этим разберется лучше. Программисту надо состредоточиться на алгоритме, а уж как по регистрам совать - тут все карты на руках у компилятора. Если хочется адекватного результата ручному контролю, то это ассемблер (вызов функции или вставки). Кроме IAR, еще несколько компиляторов не замечены во внимании к ключевому слову register: CCS/TMS320F28xx, VDSP++/Blackfin, avr-gcc (правда, с последним знакомство поверхностное). P.S. Посмотрел в доку на Билдер: Цитата Category
Storage class specifiers
Syntax
register <data definition> ;
Description
Use the register storage class specifier to store the variable being declared in a CPU register (if possible), to optimize access and reduce code.
Note: The C++Builder compiler can ignore requests for register allocation. Register allocation is based on the compiler’s analysis of how a variable is used.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 2 2007, 22:33
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(dxp @ Dec 28 2006, 07:32)  И как, например, запретить размещать переменную в регистре? Какое ключевое слово для этого используется? Цитата(_Bill @ Dec 27 2006, 22:03)  Сейчас, когда ресурсов в PC предостаточно, компиляторы стали достаточно "умными", то необходимость в использовании register как бы отпадает. Но в контроллерах с ограниченными ресурсами иногда желательно дать возможность решать вопрос о размещении переменных самому программисту.
Борланд - это PC. Неужто в нем недостаток регистров? Ни разу не встречал в коде для Борланда (начиная с версий оного 4 и выше) подобных попыток оптимизаций. Имхо, уже давным давно прошла необходимость рулить такими оптимизациями из С-кода. Компилятор с этим разберется лучше. Программисту надо состредоточиться на алгоритме, а уж как по регистрам совать - тут все карты на руках у компилятора. Если хочется адекватного результата ручному контролю, то это ассемблер (вызов функции или вставки). Кроме IAR, еще несколько компиляторов не замечены во внимании к ключевому слову register: CCS/TMS320F28xx, VDSP++/Blackfin, avr-gcc (правда, с последним знакомство поверхностное). P.S. Посмотрел в доку на Билдер: Цитата Category
Storage class specifiers
Syntax
register <data definition> ;
Description
Use the register storage class specifier to store the variable being declared in a CPU register (if possible), to optimize access and reduce code.
Note: The C++Builder compiler can ignore requests for register allocation. Register allocation is based on the compiler’s analysis of how a variable is used. В Borland C++ в проекте можно указания опции для использования регистровых переменных: None, Automatic и Register keyword. Т.е. в первом случае компилятор не будет размещать переменные в регистрах, во втором случае он будет размещать переменные в регистрах автоматически как только он сочтет это нужным. В третьем случае в регистрах будут размещаться только те переменные, для которых указан класс памяти register.
|
|
|
|
|
Jan 4 2007, 00:22
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(dxp @ Dec 28 2006, 08:32)  Борланд - это PC. Неужто в нем недостаток регистров? Ни разу не встречал в коде для Борланда (начиная с версий оного 4 и выше) подобных попыток оптимизаций. Похоже Вы немного пошутили или не то имели ввиду.  По сравнению с AVR в PC регистров почти нет. А если учитывать, что часть из них связано с определёнными функциями (CX - регистр счётчик, BX,EX -базы, AX - аккумулятор). То такая оптимизация вообще не имеет смысла. Да и при таком построении процессора, вопрос такой экономии не ставится. Там оптимизация строится на базе совершенно других принципов. Длина цикла - размер кэша - объём данных по работе с памятью, "грамотное обращение" к переферии и т.д.
|
|
|
|
|
Jan 4 2007, 23:20
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(SasaVitebsk @ Jan 4 2007, 00:22)  Цитата(dxp @ Dec 28 2006, 08:32)  Борланд - это PC. Неужто в нем недостаток регистров? Ни разу не встречал в коде для Борланда (начиная с версий оного 4 и выше) подобных попыток оптимизаций.
Похоже Вы немного пошутили или не то имели ввиду.  По сравнению с AVR в PC регистров почти нет. А если учитывать, что часть из них связано с определёнными функциями (CX - регистр счётчик, BX,EX -базы, AX - аккумулятор). То такая оптимизация вообще не имеет смысла. Да и при таком построении процессора, вопрос такой экономии не ставится. Там оптимизация строится на базе совершенно других принципов. Длина цикла - размер кэша - объём данных по работе с памятью, "грамотное обращение" к переферии и т.д. Не стоит забывать, что эти регистры 32-разрядные. И есть возможность использовать их и как 16-, и как 8-разрядные. К тому же, у AVR есть определенные проблемы с использованием младших 16 регистров. Так что реально используются только 16 старших регистров. А если требуются данные типа long или float, так их останется на все про все всего 4. И опять же, у PC инструкции позволяют оперировать с ячейками памяти как с регистрами (при увеличении длины инструкции и времени ее выполнения). Так что вопросы оптимизации программы за счет использования регистров остаются весьма актуальными.
|
|
|
|
|
Jan 5 2007, 03:58
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(_Bill @ Jan 5 2007, 00:20)  Не стоит забывать, что эти регистры 32-разрядные. И есть возможность использовать их и как 16-, и как 8-разрядные. К тому же, у AVR есть определенные проблемы с использованием младших 16 регистров. Так что реально используются только 16 старших регистров. А если требуются данные типа long или float, так их останется на все про все всего 4. И опять же, у PC инструкции позволяют оперировать с ячейками памяти как с регистрами (при увеличении длины инструкции и времени ее выполнения). Так что вопросы оптимизации программы за счет использования регистров остаются весьма актуальными. Ну это скорее желаемое чем действительное.  Регистры действительно 32-ух битные, но их нельзя использовать, например как 2 16-ти битных или 4 - восьми битных. Если говорить о "определённых проблемах по использованию отдельных регистров", то здесь INTEL явно лидирует. Например сложить B и С Вам не удастся. Если же Вы попытаетесь написать реальную прогу, даже на ассемблере, длиной хотябы листа два, используя расширенные команды, то Вам врятли удастся съэкономить даже один регистр. А компилятор даже не будет пытаться это делать. Но это и не нужно. Вы совершенно правы, во второй части. INTEL имеет развитой механизм работы с памятью. Учитывая все мыслимые способы адресации. А сама архитектура (кэш буфер данных) позволяет к значительным массивам используемых данных обращаться, фактически как к регистрам. Кроме кэша данных есть кэш программы, что накладывает свои особенности. Ну и наконец, наличие нескольких ALU (в пнях уже по-моему 2-целочисленных и 1 с плавающей запятой) - тоже имеет значение. Поэтому оптимизация программ там имеет совершенно другие принципы и особенности. Согласно литературе это всё учитывается компиляторами. Я читал, что в Windows используются циклы определённой длины, а компилятор прогу делает так, что бы распаралеливание было максимальным. Но я, боже упаси, не собираюсь затевать спор в той области, где имею поверхностные знания. Я просто пошутил.  Очевидно что само число регистров - просто крайне мало. dxp, думаю, явно имел ввиду не регистры, а сам принцип экономии таким способом. И я его тут полностью поддерживаю. Просто выразился неудачно. А я пошутил.  Надеюсь никого не обидел.
|
|
|
|
|
Jan 7 2007, 01:33
|

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

|
Цитата(zltigo @ Dec 27 2006, 14:41)  Цитата(dxp @ Dec 27 2006, 13:48)  Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая.
Верно, НО! если на всех регистров не хватает, то тут оно и сработает отдав предпочтение подсказке. Именно, что верно. А "НО" не верно. Зато верно поскипанное: Цитата(dxp @ Dec 27 2006, 13:48)  От ключевого слова register ничего не зависит Читая документацию случайно наткнулся. EWAVR_Compiler reference-> Implementation-defined behavior-> REGISTERS: Цитата Honoring the register keyword (6.5.1) User requests for register variables are not honored. То же самое и в доке на ARM. P.S. Так что зря мы тут копья ломали, все ответы - они в доке, только нужно знать, где искать. А чтобы знать, нужно сначала ее прочитать. Только кто ж ее читает, от корки до корки  ?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 7 2007, 02:03
|

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

|
Цитата(Сергей Борщ @ Jan 7 2007, 00:33)  P.S. Так что зря мы тут копья ломали, все ответы - они в доке, только нужно знать, где искать. Ну положим совсем не зря: -Ключевое слово существует. -Некоторыми компиляторами игнорируется. -Некоторыми - нет. -Иcпользование как минимум не помешает. Цитата А чтобы знать, нужно сначала ее прочитать. Только кто ж ее читает, от корки до корки ? Ну а документацию - документацию надо читать именно упорно от корки до корки. Я обычно перед сном раньше читал, последние годы как-то и на сон не хватает  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|