mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC generiert unnötigen(?) ISR overhead


Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin grad dabei eine möglichst schnelle SPI interrupt routine zu 
schreiben und hab mir zu dem Zweck mal das listing (lss) vom avr-gcc 
angeguckt. Ich verwende einen ATmega168P. Optimierung -Os

Hier der C-Code:
uint8_t rxd;
uint8_t txd;

ISR(SPI_STC_vect)
{
  rxd = SPDR;
  SPDR = txd;
}

und hier das Resultat (ASM + C mix):
uint8_t rxd;
uint8_t txd;

ISR(SPI_STC_vect)
{
  90:  1f 92         push  r1
  92:  0f 92         push  r0
  94:  0f b6         in  r0, 0x3f  ; 63
  96:  0f 92         push  r0
  98:  11 24         eor  r1, r1
  9a:  8f 93         push  r24
  rxd = SPDR;
  9c:  8e b5         in  r24, 0x2e  ; 46
  9e:  80 93 01 01   sts  0x0101, r24
  SPDR = txd;
  a2:  80 91 00 01   lds  r24, 0x0100
  a6:  8e bd         out  0x2e, r24  ; 46
}
  a8:  8f 91         pop  r24
  aa:  0f 90         pop  r0
  ac:  0f be         out  0x3f, r0  ; 63
  ae:  0f 90         pop  r0
  b0:  1f 90         pop  r1
  b2:  18 95         reti

So, Quizfragen:
1. Was wird da  mit r1 gemacht? Das ergibt keinen Sinn für mich.
2. Könnte man nicht anstelle von r24 auch r0 verwenden oder umgekehrt. 
Das würde dann ein Register weniger machen.
3. Wozu push und pop von r0 bei Adresse 96 und aa?

Mag mich vielleicht jemand erleuchten?

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu 3. An den Stellen wird SREG gerettet und restauriert.

Grundsätzlich würde ein Register ausreichen. Erzeugen andere 
Optimierungsstufen besseren oder schlechteren Code?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ISR-Prolog wird auch bei anderen Optimierungen gleich bleiben.

Er ist i.W. statisch, zumindest was zero_reg (R1) und tmp_reg (R0) und 
das Sichern von SREG angeht.

Wenn's wirklich auf das letzte Tick ankommt --> (Inline) Assembler

Autor: Andre R. (ryan87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Serieller schrieb:
> Zu 3. An den Stellen wird SREG gerettet und restauriert.
>
> Grundsätzlich würde ein Register ausreichen. Erzeugen andere
> Optimierungsstufen besseren oder schlechteren Code?

Bei 94 wird doch SREG in r0 geladen. Bei AC wiederhergestellt. 
Dazwischen liegt ein push r0 und pop r0. Ohne das in dem Bereich r0 
geändert wird. Das verwundert mich.

Andere Optimierungsstufen bringen wie bereits vermutet keine Änderungen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Entwicklung des AVR-GCC wurden irrtümlich R0, R1 als Null und 
SREG-Sicherung festgelegt.
Sie sind aber verbrannte Register, da einige Befehle sie zerstören (LPM, 
SPM, MUL).
Es traut sich aber keiner, das zu korrigieren (z.B. auf R2, R3), daher 
ist dieser Overhead bis in alle Ewigkeit drin.
Und auch nach jedem MUL-Befehl muß das Nullregister schnell wieder 
gelöscht werden.


Peter

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Bei Entwicklung des AVR-GCC wurden irrtümlich R0, R1 als Null und
> SREG-Sicherung festgelegt.

Das ist kein Irrtum.

> Sie sind aber verbrannte Register, da einige Befehle sie zerstören (LPM,
> SPM, MUL).

Wenn tmp_reg anders läge und ein MUL ausgeführt würde, müssten noch mehr 
GPRs gesichert werden (R0, R1, R2, R3). Dann wär das Geschrei noch 
größer.

> Es traut sich aber keiner, das zu korrigieren (z.B. auf R2, R3), daher
> ist dieser Overhead bis in alle Ewigkeit drin.

Wegen 2 push/pop das ABI ändern???

Andre R. schrieb:

> Andere Optimierungsstufen bringen wie bereits vermutet keine Änderungen

Das ist keine Vermutung, es steht in den GCC-Quellen.

Johann

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wurde ja weiter oben schon geschrieben, wenn es tatsächlich auf diese 
2 Zyklen weniger ankommt, muß man die ISR halt in Assembler schreiben.

Oliver

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.