Цитата(Сергей Борщ @ May 5 2009, 19:12)

Нет, разный. В одном случае установлен 1 бит, и компилятор генерит инструкцию sbi, во втором случае 2 бита, и иначе как через in, or, out не получится. А еще проще не использовать в этой конструкции "или" вообще - сразу писать нужное число. Потому что состояние остальных битов, как правило, известно заранее:
Код
WDTCR = (1<<WDCE)|(1<<WDE);
WDTCR = (1<<WDP2)|(1<<WDP1);
Ну, я воспринял это просто как пример. Типа автору стало лень считать HEX-содержание своего кода.... и понесся обосновывать

А вот сейчас в спокойной обстановке дома решил исследовать что же на самом деле происходит и ... чешу затылок. Мне никак не удается при любых уровнях оптимизации и вообще без нее добиться того, чтобы компилятор по разному оттранслировал процедуру инициализации WDT.
Т.е. вот такой код независимо от того стоит перед ним #pragma optimize=none или нет, написаны команды инициализации в виде команд препроцессору или в виде чисел (закоментарено) все равно транслируются одинаково.
Код
void test_WDT(void)
{
__watchdog_reset();
WDTCSR=(1<<WDCE)|(1<<WDE)|(1<<WDP0);
WDTCSR=(1<<WDE)|(1<<WDP0);
// WDTCSR=0x19;
// WDTCSR=0x09;
}
ассемблерный код
Код
7 __watchdog_reset();
\ 00000000 95A8 WDR
8 WDTCSR=(1<<WDCE)|(1<<WDE)|(1<<WDP0);
\ 00000002 E109 LDI R16, 25
\ 00000004 93000060 STS 96, R16
9 WDTCSR=(1<<WDE)|(1<<WDP0);
\ 00000008 E009 LDI R16, 9
\ 0000000A 93000060 STS 96, R16
Наверное поэтому никогда раньше не задумывался над этим вопросом, хотя по привычке всегда использовал #pragma optimize=none
Может быть с оптимизацией таки можно заставить компилятор генерировать вызовы функций посредине двух WDTCSR = ..., но надо таки постараться не по детски

PS. Компилятор последний, 5.20, для примера взята mega48