sunjob писал(а):хорошо, а чуть более подробно, если не сложно?
во-первых,
oleg110592, как обычно, не учитывает, что все развивается, и советы 10-летней давности сегодня могут оказаться бесполезными. современные версии avr-gcc имеют такие механизмы оптимизации, что советы, данные в рекомендованной статье, далеко не в каждом случае оказывают эффект. более того, в упомянутой статье не рассмотрены многие ключи оптимизации, дающие заметный эффект на "маленьких" микроконтроллерах. об использовании регистровых переменных в той статье сказано далеко не все важное, в связи с чем сегодня пользоваться рекомендациями скорее нежелательно, чем полезно.
во-вторых, использование регистровых переменных делает одновременно две вещи:
1. упрощает доступ к хранимым в них данных
2. затрудняет работу компилятора
поскольку компилятор использует распределение регистров по определенным встроенным правилам, то, принудительно исключая из списка доступных ему регистров некоторые под регистровую переменную, вы можете сломать встроенные оптимизации, и, вместо положительного, получить отрицательный элемент. например, вы затребовали регистр
r6 (я беру наугад, на самом деле существуют довольно жесткие ограничения по использованию регистров для таких целей - вот тут ссылку в статье, рекомендованной
oleg110592, все-таки следует изучить), а компилятор хочет (по своей встроенной логике) использовать этот регистр для каких-то вычислений. в этом случае компилятор запросто может сначала запихать
r6 в стек, затем занести в него новое значение, провести вычисления, а затем извлечь из стека. ну и где тут выигрыш в скорости?! а ведь если вы не предпримите специальных действий (см. далее), компилятор вообще может наплевать на то, что в
r6 ваши данные, и затереть их своими! и вы поимеете такой гемор при отладке, что я за вас не порадуюсь.
в третьих, вы обязаны блокировать использование регистров, выделенных вами под регистровые переменные, при помощи флага
-ffixed-xx (для предыдущего примера это
-ffixed-r6), чтобы компилятор всегда помнил, что этот регистр нельзя использовать в своих целях.
sunjob писал(а):т.е. нет смысла оптимизировать глобальную переменную?
не всегда, но чаще всего нет.
мне приходилось это делать в нескольких проектах с одной целью: мне нужно было обеспечить наибыстрейшую обработку переменной в прерывании. пришлось заводить регистровую переменную, чтобы при входе в обработчик не нужно было сохранять/восстанавливать регистры для работы с нею. ну и в аналогичных случаях еще в паре проектов пришлось так же поступать. и мой опыт позволяет мне утверждать, что если с одной однобайтной переменной еще можно чего-то добиваться разумными усилиями, то две и более однобайтных регистровых глобальных переменных, или, тем более, две или более двухбайтных регистровых переменных - это уже нескончаемый геморрой с непредсказуемыми последствиями.
уже лет 5 не делаю даже попыток подобного рода, полагаясь на оптимизации компилятора.