Еще непонятки с оптимизацией, правда в IAR AVR 4.30
3 варианта одного и того-же
Код
54 *ptr=b;
\ 00000026 8310 ST Z, R17
55 ptr-=7;
56 if(*(ptr++)!=0xE0) return;//ptr++;
\ 00000028 9737 SBIW R31:R30, 7
\ 0000002A 01DF MOVW R27:R26, R31:R30
\ 0000002C 9631 ADIW R31:R30, 1
\ 0000002E 910C LD R16, X
\ 00000030 3E00 CPI R16, 224
\ 00000032 F459 BRNE ??RSRecByte_0
57 if(*(ptr++)!=0x00) return;//ptr++;
\ 00000034 9101 LD R16, Z+
\ 00000036 2300 TST R16
\ 00000038 F441 BRNE ??RSRecByte_0
Код
54 *ptr=b;
\ 00000022 8310 ST Z, R17
55 // ptr-=7;
56 if(*(ptr++)!=0xE0) return;//ptr++;
\ 00000024 9101 LD R16, Z+
\ 00000026 3E00 CPI R16, 224
\ 00000028 F459 BRNE ??RSRecByte_0
57 if(*(ptr++)!=0x00) return;//ptr++;
\ 0000002A 9101 LD R16, Z+
\ 0000002C 2300 TST R16
\ 0000002E F441 BRNE ??RSRecByte_0
Код
54 *ptr=b;
\ 00000022 8310 ST Z, R17
55 ptr-=7;
\ 00000024 9737 SBIW R31:R30, 7
56 if(*(ptr)!=0xE0) return;ptr++;
\ 00000026 9101 LD R16, Z+
\ 00000028 3E00 CPI R16, 224
\ 0000002A F471 BRNE ??RSRecByte_0
57 if(*(ptr)!=0x00) return;ptr++;
\ 0000002C 9101 LD R16, Z+
\ 0000002E 2300 TST R16
\ 00000030 F459 BRNE ??RSRecByte_0
Кроме того появляется сохранение/восстановление R26:27.
Вроде немного, но совершенно непонятная разница.
Получается, лучше дробить длинные выражения по кускам?
Цитата(zltigo @ May 19 2008, 22:09)

В общем-то не слишком и сложно, если подумать, то не сложнее писания врукопашную на ASM. Опыт и навыки естественно нужны.
К сожалению, опыт приходится наживать свой и только мало-мало чужого, в отличие от писюкового программизма. Нет литературы, ориентированной на
оптимальное написание на С.
P.S. Это пока только заготовка
Код
void RSRecByte(){
if(!IsRecByteRS())return;
byte b=GetByteRS();
if(RSStatus==RS_RECCMD){//ïðèåì êîìàíäû
byte *ptr=RSRecCmdBuffer; for(byte i=0;i<7;i++,ptr++)*ptr=*(ptr+1);
*ptr=b;
ptr-=7;
if(*ptr!=0xE0) return;ptr++;
if(*ptr!=0x00) return;ptr++;
if(*ptr!=SysNum) return;ptr++;
if(*ptr!=0x01) return;ptr++;
RSStatus=1;
}else{//ïðèåì äàííûõ
}
}
Знать-бы какие подсказки компилер понимает