Forum: Compiler & IDEs avr-gcc: Optimierung: mehrere RCALLs erzeugt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von N. G. (newgeneration) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

Testcode:
1
extern uint8_t x;
2
extern void bar(const uint8_t *cmd);
3
4
void foo(void) {
5
  uint8_t cmd[6];
6
  cmd[0] = x;
7
  cmd[1] = 0x00;
8
  cmd[2] = 0x00;
9
  cmd[3] = 0x00;
10
  cmd[4] = 0x00;
11
  cmd[5] = 0xFF;
12
  bar(cmd);
13
}
wird mit avr-gcc -s -Os -mmcu=avr6
1
foo:
2
  push r28
3
  push r29
4
  rcall .            // !
5
  rcall .            // !
6
  in r28,__SP_L__
7
  in r29,__SP_H__
8
/* prologue: function */
9
/* frame size = 6 */
10
/* stack size = 8 */
11
.L__stack_usage = 8
12
  lds r24,x
13
  std Y+1,r24
14
  std Y+2,__zero_reg__
15
  std Y+3,__zero_reg__
16
  std Y+4,__zero_reg__
17
  std Y+5,__zero_reg__
18
  ldi r24,lo8(-1)
19
  std Y+6,r24
20
  movw r24,r28
21
  adiw r24,1
22
  call bar
23
/* epilogue start */
24
  adiw r28,6
25
  in __tmp_reg__,__SREG__
26
  cli
27
  out __SP_H__,r29
28
  out __SREG__,__tmp_reg__
29
  out __SP_L__,r28
30
  pop r29
31
  pop r28
32
  ret
33
  .ident  "GCC: (GNU) 5.3.1 20160106"

Wie man sieht werden im Prolog der Funktion 2x RCALL . erzeugt.

Ich kann mir das nicht erklären.

mit freundlichen Grüßen und frohe Weihnachten,
N.G.

von Bilch (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Einfach durch den Simulator steppen, dann siehst du schon was passiert.

von Rolf M. (rmagnus)


Bewertung
2 lesenswert
nicht lesenswert
N. G. schrieb:
> Wie man sieht werden im Prolog der Funktion 2x RCALL . erzeugt.
>
> Ich kann mir das nicht erklären.

Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für 
dein lokales Array zu schaffen. Das dient der Optimierung der Codegröße, 
da es das mit lediglich zwei Instruktionen schafft. Alle anderen 
Möglichkeiten wären größer.

von N. G. (newgeneration) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für
> dein lokales Array zu schaffen. Das dient der Optimierung der Codegröße,
> da es das mit lediglich zwei Instruktionen schafft. Alle anderen
> Möglichkeiten wären größer.

Ach so okay, danke!

Diese Möglichkeit kannte ich noch nicht.

Das wäre dann schon geklärt, so einfach kanns manchmal sein.

Danke und frohe Weihnachten
N.G.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für
> dein lokales Array zu schaffen.

Da gilt aber nur für den ATmega2560/1. Auf kleineren AVRs pusht RCALL 
nur 2 Byte.

von N. G. (newgeneration) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
> Rolf M. schrieb:
>> Die zwei RCALLS dienen lediglich dazu, 6 Bytes Platz auf dem Stack für
>> dein lokales Array zu schaffen.
>
> Da gilt aber nur für den ATmega2560/1. Auf kleineren AVRs pusht RCALL
> nur 2 Byte.

Ja, das gilt nur für AVRs mit der avr6-Architektur (alle mit 256kB 
Flash, z.B. auch der ATmega256rfr2), da diese einen PC von > 16bit (= 3 
Byte) haben.
Auf einem kleineren AVR mit nur 2 Byte Program Counter sind es auch 
wirklich 3x RCALLs.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
N. G. schrieb:
> Ja, das gilt nur für AVRs mit der avr6-Architektur

Du hattest ja geschickterweise erwähnt, dass sich um so einen handelt:

N. G. schrieb:
> wird mit avr-gcc -s -Os -mmcu=avr6

Ich hatte anfangs auch gedacht, dass da doch eigentlich noch 2 Bytes 
fehlen, und dann hab ich obige Zeile gesehen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.