Цитата(_artem_ @ May 27 2007, 05:00)

Оптимизация включена на скорость, выключить не могу. Фунцкию наверху привел как пример , к переменным/регистрам обрашаюсь в прерывании по INT0 (в прерывании обрашение к ним есть видн из асм листинга) и причем явно в C, декларировал как volatile - компайлеру начхать.
В асм листинге main() видно как компайлер поставил REQUIRE Register_Rx_is_global_var - то есть неспоптимизировал если правильно понял . Тоже самое в листинге для INT0 isr. В опциях проекта зарезервировал все регистры (от R4 до R15), номер регистра в декларации переменной из зарезервированного листа регистров.
Если включена оптимизация средняя или высокая, компилятор стремится все выполнить согласно этому указанию, поэтому, увидев, что нет никаких препятствий этому, он норовит использовать регистр верхней группы, экономя на одной команде. Только если будет очевидная необходимость в использовании назначенного регистра, тогда он не будет проигнорирован.
Пример скомпилированого кода для:
Код
__regvar __no_init char test @ 14;
//присвоение ей какого либо значения в функции main()
void main(void)
{
test = 3;
for(;;)
PORTB=test;
;
}
Оптимизация средняя или высокая:
Код
??main_0:
LDI R16, 3
OUT 0x18, R16
RJMP ??main_0
Нет оптимизации или малая оптимизация:
Код
main:
REQUIRE ?Register_R14_is_global_regvar
LDI R16, 3
MOV R14, R16
??main_0:
OUT 0x18, R14
RJMP ??main_0
Добавлю:
Если же установите:
Код
volatile __regvar __no_init char test @ 14;
то даже при высокой оптимизации регистровая переменная игнорирована не будет.