Перейти к содержанию
    

В принципе, я придерживаюсь мнения, что компилятору надо подсказывать, что делать. А также помнить об особеностях процессора - в данном случае не надо забывать, что у нас не аккумуляторная машина, и регистров валом. Имеет смысл написать так:

char TimeOut;            // ãëîáàëüíàÿ ïåðåìåííàÿ

__interrupt void TimerInt()
{
  char to=TimeOut;
  if (to) TimeOut=--to;
}

Да, я понимаю, хотелось бы, чтобы компилятор сам это делал... Но с другой стороны, если лень-матушка, программируйте на Делфи для большого брата, вообще не надо думать...

Хе-хе. И правда в таком случае IAR все делает грамотно. Вот только читабельность кода страдает. Наверно и вправду чем быстрее код - тем ближе к ассемблеру :-)

 

PS: всех с наступающим!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеет смысл написать так:

  char to=TimeOut;

Если уж подсказывать, то подсказывать по полной программе:

register char to=TimeOut;

Вообще-то, IAR игнорирует ключевое слово register. Или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то, IAR игнорирует ключевое слово register. Или нет?

Может игнорировать если нельзя обеспечить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то, IAR игнорирует ключевое слово register. Или нет?

Может игнорировать если нельзя обеспечить.

Причем игнорировать молча. Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая. Так сегодня поступает подавляющее большинство (если не все) компиляторов. От ключевого слова register ничего не зависит, оно является рудиментом и артефактом. Оставленным в языке для совместимости со старым кодом. Есть не просит, пусть будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая.

Верно, НО! если на всех регистров не хватает, то тут оно и сработает отдав предпочтение подсказке.

Использую довольно часто часто в сложных конструкциях - меня не затрудняет подсказать и компилятор тоже не напрягает :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то, IAR игнорирует ключевое слово register. Или нет?

Может игнорировать если нельзя обеспечить.

Причем игнорировать молча. Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая. Так сегодня поступает подавляющее большинство (если не все) компиляторов. От ключевого слова register ничего не зависит, оно является рудиментом и артефактом. Оставленным в языке для совместимости со старым кодом. Есть не просит, пусть будет.

Это не совсем так. Просто в IAR сделано именно так. Где размещать переменные решает только компилятор. В других средах (например, в Borland) имеется возможность выбора: не размещать переменные в регистрах, размещать автоматически или размещать по ключевому слову register. Сейчас, когда ресурсов в PC предостаточно, компиляторы стали достаточно "умными", то необходимость в использовании register как бы отпадает. Но в контроллерах с ограниченными ресурсами иногда желательно дать возможность решать вопрос о размещении переменных самому программисту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не совсем так. Просто в IAR сделано именно так. Где размещать переменные решает только компилятор. В других средах (например, в Borland) имеется возможность выбора: не размещать переменные в регистрах, размещать автоматически или размещать по ключевому слову register.

И как, например, запретить размещать переменную в регистре? Какое ключевое слово для этого используется?

 

Сейчас, когда ресурсов в 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И как, например, запретить размещать переменную в регистре? Какое ключевое слово для этого используется?

-r-

Про Builder, правда ничего не скажу и отключением никогда не пользовался и пользоваться не буду :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И как, например, запретить размещать переменную в регистре? Какое ключевое слово для этого используется?

Насколько мне известно в IAR такого вообще нет.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И как, например, запретить размещать переменную в регистре? Какое ключевое слово для этого используется?

 

Сейчас, когда ресурсов в 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Борланд - это PC. Неужто в нем недостаток регистров? Ни разу не встречал в коде для Борланда (начиная с версий оного 4 и выше) подобных попыток оптимизаций.

 

Похоже Вы немного пошутили или не то имели ввиду. :biggrin: По сравнению с AVR в PC регистров почти нет. :biggrin:

 

А если учитывать, что часть из них связано с определёнными функциями (CX - регистр счётчик, BX,EX -базы, AX - аккумулятор). То такая оптимизация вообще не имеет смысла. Да и при таком построении процессора, вопрос такой экономии не ставится. Там оптимизация строится на базе совершенно других принципов. Длина цикла - размер кэша - объём данных по работе с памятью, "грамотное обращение" к переферии и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Борланд - это PC. Неужто в нем недостаток регистров? Ни разу не встречал в коде для Борланда (начиная с версий оного 4 и выше) подобных попыток оптимизаций.

 

Похоже Вы немного пошутили или не то имели ввиду. :biggrin: По сравнению с AVR в PC регистров почти нет. :biggrin:

 

А если учитывать, что часть из них связано с определёнными функциями (CX - регистр счётчик, BX,EX -базы, AX - аккумулятор). То такая оптимизация вообще не имеет смысла. Да и при таком построении процессора, вопрос такой экономии не ставится. Там оптимизация строится на базе совершенно других принципов. Длина цикла - размер кэша - объём данных по работе с памятью, "грамотное обращение" к переферии и т.д.

Не стоит забывать, что эти регистры 32-разрядные. И есть возможность использовать их и как 16-, и как 8-разрядные. К тому же, у AVR есть определенные проблемы с использованием младших 16 регистров. Так что реально используются только 16 старших регистров. А если требуются данные типа long или float, так их останется на все про все всего 4. И опять же, у PC инструкции позволяют оперировать с ячейками памяти как с регистрами (при увеличении длины инструкции и времени ее выполнения). Так что вопросы оптимизации программы за счет использования регистров остаются весьма актуальными.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не стоит забывать, что эти регистры 32-разрядные. И есть возможность использовать их и как 16-, и как 8-разрядные. К тому же, у AVR есть определенные проблемы с использованием младших 16 регистров. Так что реально используются только 16 старших регистров. А если требуются данные типа long или float, так их останется на все про все всего 4. И опять же, у PC инструкции позволяют оперировать с ячейками памяти как с регистрами (при увеличении длины инструкции и времени ее выполнения). Так что вопросы оптимизации программы за счет использования регистров остаются весьма актуальными.

 

Ну это скорее желаемое чем действительное. :) Регистры действительно 32-ух битные, но их нельзя использовать, например как 2 16-ти битных или 4 - восьми битных. Если говорить о "определённых проблемах по использованию отдельных регистров", то здесь INTEL явно лидирует. Например сложить B и С Вам не удастся. Если же Вы попытаетесь написать реальную прогу, даже на ассемблере, длиной хотябы листа два, используя расширенные команды, то Вам врятли удастся съэкономить даже один регистр. А компилятор даже не будет пытаться это делать.

Но это и не нужно. Вы совершенно правы, во второй части. INTEL имеет развитой механизм работы с памятью. Учитывая все мыслимые способы адресации. А сама архитектура (кэш буфер данных) позволяет к значительным массивам используемых данных обращаться, фактически как к регистрам. Кроме кэша данных есть кэш программы, что накладывает свои особенности. Ну и наконец, наличие нескольких ALU (в пнях уже по-моему 2-целочисленных и 1 с плавающей запятой) - тоже имеет значение. Поэтому оптимизация программ там имеет совершенно другие принципы и особенности. Согласно литературе это всё учитывается компиляторами. Я читал, что в Windows используются циклы определённой длины, а компилятор прогу делает так, что бы распаралеливание было максимальным.

 

Но я, боже упаси, не собираюсь затевать спор в той области, где имею поверхностные знания. Я просто пошутил. :biggrin: Очевидно что само число регистров - просто крайне мало. dxp, думаю, явно имел ввиду не регистры, а сам принцип экономии таким способом. И я его тут полностью поддерживаю. Просто выразился неудачно. А я пошутил. :biggrin: Надеюсь никого не обидел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иными словами, если можно обеспечить, то и так задействует регистр, если нельзя, то не задействует, ничего не сообщая.

Верно, НО! если на всех регистров не хватает, то тут оно и сработает отдав предпочтение подсказке.

Именно, что верно. А "НО" не верно. Зато верно поскипанное:

От ключевого слова 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. Так что зря мы тут копья ломали, все ответы - они в доке, только нужно знать, где искать. А чтобы знать, нужно сначала ее прочитать. Только кто ж ее читает, от корки до корки :( ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Так что зря мы тут копья ломали, все ответы - они в доке, только нужно знать, где искать.

Ну положим совсем не зря:

-Ключевое слово существует.

-Некоторыми компиляторами игнорируется.

-Некоторыми - нет.

-Иcпользование как минимум не помешает.

А чтобы знать, нужно сначала ее прочитать. Только кто ж ее читает, от корки до корки ?

Ну а документацию - документацию надо читать именно упорно от корки до корки. Я обычно перед сном раньше читал, последние годы как-то и на сон не хватает :(.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...