Hallo,

ich sehe mir in letzter Zeit gern mal die assemblierten Varianten des C-Codes an und da ist mir eines aufgefallen. Vielleicht weiß jemand, wie man das umgehen kann?

Ich habe folgendes: Einen globlen (also statischen) Zähler in uint8_t, der mir die Anzahl der bisherigen Interrupts zählt. Ab einer bestimmten Interruptzahl möchte ich Code ausführen. Also kommt logischerweise sowas hier zum Einsatz:
Code:
if (++interrrupt_num_10ms == IRQS_PER_10MS) {...}
Wenn ich das simuliere und analysiere (also den ASM-Code anschaue), kommt dabei viel Code zum Vorschein. Nun habe ich die erste Optimierung über google gefunden: Ich mache diesen globalen Interrupt-Zähler zu einem Register mittels
Code:
register uint8_t interrupt_num_10ms asm("r5");
Wenn ich das jetzt wieder vergleiche, macht er folgendes:
Code:
72:           if (++interrupt_num_1ms == IRQS_PER_10MS)
+0000005C:   2D85        MOV     R24,R5           Copy register
+0000005D:   3081        CPI     R24,0x01         Compare with immediate
+0000005E:   F4C9        BRNE    PC+0x1A          Branch if not equal
D.h. er kopiert erst R5 in sein temporäres Register und vergleicht es dann. Kann man ihm irgendwie sagen, dass er gleich R5 vergleichen soll/kann?

Grüße,
Wulfi