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

Gast #1399066
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
> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.