Естественно об этом я тоже думал. Вот такой код:
CODE
//Функция проверки кадра
//Возвращает 0 если все ОК
//#pragma inline=forced
unsigned char modbus_frame_check(void)
{
//Ошибки физического уровня (в usart0_received)
if((usart_flags&(1<<mberr))!=0){return 1;}
//Длина кадра (не менее 4 символов)
unsigned char num=usart_count;
if(num<4){return 2;}
//Контрольная сумма
num-=2;
//if(crc16(&usart_stack[0],num)!=(usart_stack[num]+(usart_stack[num+1]<<8))){return 3;}
//
return 0;//num;
}
Генерит то же самое:
CODE
@00000096: modbus_slave_routine
285: ClearBits(usart_flags,(1<<t15)|(1<<t35)|(1<<mberr)|(1<<rxok));
+00000096: B100 IN R16,0x00 In from I/O location
+00000097: 700F ANDI R16,0x0F Logical AND with immediate
+00000098: B900 OUT 0x00,R16 Out to I/O location
286: TCNT1H=0;
+00000099: E000 LDI R16,0x00 Load immediate
+0000009A: BD0D OUT 0x2D,R16 Out to I/O location
287: TCNT1L=0;
+0000009B: BD0C OUT 0x2C,R16 Out to I/O location
288: TCCR1B=(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10);
+0000009C: E008 LDI R16,0x08 Load immediate
+0000009D: BD0E OUT 0x2E,R16 Out to I/O location
292: while((usart_flags&(1<<rxok))==0){;}
+0000009E: 9B02 SBIS 0x00,2 Skip if bit in I/O register set
+0000009F: CFFE RJMP PC-0x0001 Relative jump
294: while((usart_flags&(1<<t15))==0){;}
+000000A0: 9B00 SBIS 0x00,0 Skip if bit in I/O register set
+000000A1: CFFE RJMP PC-0x0001 Relative jump
296: if(modbus_frame_check()!=0){goto start;}
+000000A2: B100 IN R16,0x00 In from I/O location
+000000A3: CFF2 RJMP PC-0x000D Relative jump