Почему WinAVR по разному компилирует? И какие типы данных использовать? Абстрактный вопрос, просто интересно. Чем вызвана необходимость использования
лишнего регистра при вычислении ~(expr) вместо !(expr), ведь результат одинаков?
000000fa <putc>:
}
/***** Передача символа через УАПП. */
void putc(uint8_t data_to_send)
{
fa: 98 2f mov r25, r24
while (!(UCSR1A & _BV(UDRE1)));
fc: 80 91 c8 00 lds r24, 0x00C8
100: 85 ff sbrs r24, 5
102: fc cf rjmp .-8 ; 0xfc <putc+0x2>
UDR1 = data_to_send;
104: 90 93 ce 00 sts 0x00CE, r25
108: 08 95 ret
0000010a <getc>:
}
/***** Приём символа через УАПП */
uint8_t getc()
{
10a: 80 91 c8 00 lds r24, 0x00C8
10e: 99 27 eor r25, r25
110: 80 78 andi r24, 0x80 ; 128
112: 90 70 andi r25, 0x00 ; 0
114: 8f 5f subi r24, 0xFF ; 255
116: 9f 4f sbci r25, 0xFF ; 255
118: c1 f7 brne .-16 ; 0x10a <getc>
while (~(UCSR1A & _BV(RXC1)));
return UDR1;
11a: 80 91 ce 00 lds r24, 0x00CE
}
11e: 99 27 eor r25, r25
120: 08 95 ret
А насчёт типов, что лучше писать, обычные char/int/long или WinAVR'овские xINTnn_t? Мне кааца, что обычные.