Страница 1 из 1

Регистровая переменная в IAR

Добавлено: Чт май 21, 2009 15:44:20
mackerel
Собственно, сабж. Как задать размещение локальной переменной в регистре (неважно в каком, лишь бы не в RAM!)?

Добавлено: Чт май 21, 2009 20:23:24
asteroid7
Есть ли смысл в этом? При включении оптимизации компилятор сам старается разместить все локальные в регистрах.
Глобальные и статические в регистрах ещё как то понятно, но локальные зачем указывать?

Добавлено: Пт май 22, 2009 08:53:41
mackerel
asteroid7 писал(а):Есть ли смысл в этом? При включении оптимизации компилятор сам старается разместить все локальные в регистрах.
Глобальные и статические в регистрах ещё как то понятно, но локальные зачем указывать?
Понятно, что старается... Но у меня есть функция с несколькими локальными переменными, от скорости обращения к которым зависит, собственно, работоспособность изделия. Вот и хотелось бы иметь твёрдую гарантию, что они обязательно будут регистровыми, независимо ни от чего.

Добавлено: Пт май 22, 2009 09:07:48
BCluster
В Си есть модификатор register для этого, то есть:
register int variable;

Кроме register для avr имеет место еще flash, eeprom (эти в кодвижне точно есть, в яре хз)

Добавлено: Пт май 22, 2009 11:15:57
xelos
в gcc volatile вроде помещает переменную в регистр.

Добавлено: Пт май 22, 2009 11:48:55
ARV
xelos писал(а):в gcc volatile вроде помещает переменную в регистр.
нет, volatile никогда нигде не давало гарантии того, что переменная окажется в регистре. volatile означает, что при любом использовании переменной надо обязательно считать ее значение. то есть для обычной переменной Var при вычислении X = Var * B + E * Var; компилятор генерирует код, который математически тождественен выражению X = Var * (B + E); а для volatile Var будет вычисляться именно так, как записано: оба упоминания переменной приведут к тому, что из памяти будут извлечены значения 2 раза.

Добавлено: Пт май 22, 2009 12:24:36
mackerel
BCluster писал(а):В Си есть модификатор register для этого
Я сейчас прочитал про него, он определяет, что переменная должна предпочтительно помещаться в регистр (если я правильно понял). Т.е. он как-бы советует... А мне хочется твёрдой уверенности...

Добавлено: Пт май 22, 2009 13:38:08
ARV
я бы советовал просто посмотреть листинг, чтобы увидеть, как с этими переменными компилятор поступает. локальные переменные компилятор стремится разместить в регистрах, и только слишком большое их обилие может помешать это сделать.

кроме того, по моему личному опыту, попытки перемудрить компилятор редко приводят к успеху - ваши попытки что-то улучшить при помощи модификатора register скорее всего либо не приведут вообще ни к какому эффекту (в плане увеличения быстродействия), либо дадут отрицательный результат. просто используйте максимально возможности оптимизатора по скорости - и все. во всяком случае, без анализа листинга не стоит и пытаться "оптимизировать" самостоятельно...

Добавлено: Пт май 22, 2009 15:34:37
BCluster
Советует то оно да - но если у вас нет более предпочитаемых по мнению компилятора переменных она будет записана в регистр.
В общем, у меня она всегда была в регистре. Ну... Других вариантов нет, звиняйте) Посмотрите, главное чтоб по скорости все работало - реально то все равно будет оно в регистре или нет.

Добавлено: Пт май 22, 2009 20:55:35
asteroid7
mackerel писал(а):... хотелось бы иметь твёрдую гарантию, что они обязательно будут регистровыми, независимо ни от чего.
Вас спасёт только ASM. IAR квалификатор "register", обычно, игнорирует.
Ну и как вариант, считаю его извращением, сделать переменную глобальной и объявить её через "__regvar".

Добавлено: Сб май 23, 2009 12:44:21
mackerel
Ну, глобальными эти переменные делать как-то не хочется... Наверно, всё-таки буду выходной листинг проверять, убеждаясь, что в нужной функции нужные переменные таки регистровые.
Всем спасибо за участие...

Добавлено: Сб май 23, 2009 18:05:38
BCluster
Вы бы проверяли просто достаточно ли производительности - если ее хватает не все ли равно где переменная?

Добавлено: Пн май 25, 2009 10:07:46
mackerel
BCluster писал(а):Вы бы проверяли просто достаточно ли производительности
При использовании переменных в RAM - однозначно недостаточно, в чём и фишка.
Вообще-то без дополнительных мер и этого не хватает - приходится ещё циклы линейными участками заменять кое-где... макросы там... и т. п. Но это всё понятно как сделать.