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:
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 mittelsCode:if (++interrrupt_num_10ms == IRQS_PER_10MS) {...}
Wenn ich das jetzt wieder vergleiche, macht er folgendes:Code:register uint8_t interrupt_num_10ms asm("r5");
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?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
Grüße,
Wulfi