Zwei Schleifen über uint8_t oder eine über uint16_t mit AVR?

Gast #1399066
Lesenswert?

im do hast du einmal die werte x und y und einmal 'nur' z zur Verfügung.
Wenn du in der zweiten Variante die beiden Werte brauchst, dann mußt du 
sie erst durch Division und Modulo bei jedem Durchgang berechnen.
Wenn du einfach 6566 mal etwas machen willst, dann ist die 2. Variante 
übersichtlicher.
Wenn du 67 mal 98 mal etwas machen willst (also wenn x und y 
aussagekräftige namen haben und man daraus sieht warum eine Schleife 67 
mal, die andere 98 mal durchlaufen wird) dann ist die 1. Variante 
übersichtlicher.

Wenn du die Optimierung eingeschaltet hast würd ich mir für beide 
Codeschnipsel die selbe Übersetzung erwarten.
Moderator (Firma: Titel) Persönliche Seite #1399117
Lesenswert?

> Wenn du die Optimierung eingeschaltet hast würd ich mir für beide
> Codeschnipsel die selbe Übersetzung erwarten.
Da muß der Compiler aber hübsch optimieren, denn in der Variante 2 kann 
das LSB ungehindert auf 255 durch- und überlaufen. In der Variante 1 ist 
schon bei 98 Schluss...

Hier mit Schalter -Os
1
void variante1 (void) {
2
  f6:  30 e0         ldi  r19, 0x00  ; 0
3
  f8:  19 c0         rjmp  .+50       ; 0x12c <variante1+0x36>
4

5
  do(); 38 Bytes
6

7
 120:  2f 5f         subi  r18, 0xFF  ; 255
8
 122:  22 36         cpi  r18, 0x62  ; 98
9
 124:  51 f7         brne  .-44       ; 0xfa <variante1+0x4>
10
 126:  3f 5f         subi  r19, 0xFF  ; 255
11
 128:  33 34         cpi  r19, 0x43  ; 67
12
 12a:  11 f0         breq  .+4        ; 0x130 <variante1+0x3a>
13
 12c:  20 e0         ldi  r18, 0x00  ; 0
14
 12e:  e5 cf         rjmp  .-54       ; 0xfa <variante1+0x4>
15
}
16

17
void variante2 (void) {
18
 132:  20 e0         ldi  r18, 0x00  ; 0
19
 134:  30 e0         ldi  r19, 0x00  ; 0
20

21
 do(); 38 Bytes
22

23
 15c:  2f 5f         subi  r18, 0xFF  ; 255
24
 15e:  3f 4f         sbci  r19, 0xFF  ; 255
25
 160:  89 e1         ldi  r24, 0x19  ; 25
26
 162:  26 3a         cpi  r18, 0xA6  ; 166
27
 164:  38 07         cpc  r19, r24
28
 166:  39 f7         brne  .-50       ; 0x136 <variante2+0x4>
29
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren