Hallo,
ich habe ein grundlegendes Verständnis-Problem bzg. if/else und
bedingtem uart-send eines Bytes.
Mein Programm nimmt MidiBytes über die uart in einen Ringbuffer und gibt
sie im mainloop wieder aus bis der Buffer leer ist (=Vorstufe zu etwas
Sinnvollem). Das funktioniert soweit theoretisch wie praktisch
fehlerfrei. Das aktuell bearbeitete Byte wird an die uart ausgegeben:
Funktion dazu:
1 | int uart_putc(unsigned char c) {
|
2 | while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich
|
3 |
|
4 | UDR = c;
|
5 | return 0;
|
6 | }
|
Ich will nun die MidiBytes unterscheiden. Dazu dachte ich mir:
1 | if (RxByte > 0x7F)
|
2 | {
|
3 | uart_putc(RxByte);
|
4 | } else {
|
5 | uart_putc(RxByte);
|
6 | }
|
Erstaunlicherweise kommt damit NICHT MEHR das Richtige hinten raus (u.A.
falsche Bytereihenfolge). Wenn ich dagegen Folgendes schreibe, dann
KOMMT das Richtige hinten raus:
1 | if (RxByte > 0x7F)
|
2 | {
|
3 | // tu dies
|
4 | } else {
|
5 | // tu das
|
6 | }
|
7 |
|
8 | uart_putc(RxByte);
|
Wird da etwas hin-/weg-optimiert (Optimierung ist ausgestellt)? Ich
dachte, nicht erfuellte Bedingungszweige sind 'unsichtbar' für den
Programmablauf? Kann es sein dass die Mainschleife SO schnell ist, dass
sie das uart-senden überholt weil der ggf. warten muss bis frei ist?
danke für Erhellung,
Gregor