mikrocontroller.net

Forum: Compiler & IDEs switch() Merkwürdigkeiten


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist schon jemandem aufgefallen, daß switch() R26 und R27 auf 0 setzt und
dann aber nirgends verwendet:

eor     r26, r26
eor     r27, r27


Ist mir auch erst im Interrupt aufgefallen, als da plötzlich soviele
Register gepusht wurden.


Peter

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das muß eine GCC-spezifische Sache sein. Hab eben mal in mein
IAR-Programm geschaut. Der macht das nicht.
Michael

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Das muß eine GCC-spezifische Sache sein."

Ja stimmt, deshalb hab ichs ja im GCC-Forum geschrieben :-)

Um genau zu sein, es ist der AVR-GCC Version 3.3.2


Peter

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Register würde ich noch verstehen: der switch-Ausdruck wird als
`int' behandelt und daher auf 16 bits expandiert.  Es gibt (bislang)
keine Optimierung herauszufinden, ob das obere Byte dabei gar nicht
benötigt würde und daher ignoriert werden kann.

Zwei Register verstehe ich nicht wirklich.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal der komplette Sprungcode:

    switch( cmd  ){
 3d4:   99 27           eor     r25, r25
 3d6:   aa 27           eor     r26, r26
 3d8:   bb 27           eor     r27, r27
 3da:   fc 01           movw    r30, r24
 3dc:   4e 97           sbiw    r24, 0x1e
 3de:   08 f0           brcs    .+2
 3e0:   7e c0           rjmp    .+252
 3e2:   ed 5c           subi    r30, 0xCD
 3e4:   ff 4f           sbci    r31, 0xFF
 3e6:   09 94           ijmp


R24 = cmd und R25 ist für die Erweiterung auf 16 Bit.


Peter

Autor: MooseC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann ich nicht bestätigen

Compiler:   avr-gcc (GCC) 3.4.1


  95:be_cmd.c      ****
  96:be_cmd.c      **** UCHAR getaxisnumber(UCHAR c){
 185                 .LM7:
 186                 /* prologue: frame size=0 */
 187                 /* prologue end (size=0) */
  97:be_cmd.c      ****   switch( c ) {
 189                 .LM8:
 190 0028 9927          clr r25
 191 002a 8835          cpi r24,88
 192 002c 9105          cpc r25,__zero_reg__
 193 002e 71F0          breq .L10


MooseC

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das tritt auch nur bei vielen "case" Anweisungen auf, wo es für den
Compiler effektiver ist, eine Sprungtabelle zu verwenden (ijmp).


Peter

Autor: MooseC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gebe ich Dir Recht...

1975:be_cmd.c      ****   switch( ascii_cmd[0] ) {
 5870                 .LM680:
 5871 20a4 892F          mov r24,r25
 5872 20a6 9927          clr r25
 5873 20a8 AA27          clr r26
 5874 20aa BB27          clr r27
 5875 20ac FC01          movw r30,r24
 5876 20ae B897          sbiw r30,40
 5877 20b0 E333          cpi r30,51
 5878 20b2 F105          cpc r31,__zero_reg__
 5879 20b4 08F0          brlo .+2
 5880 20b6 4FC0          rjmp .L497
 5881 20b8 E050          subi r30,lo8(-(pm(.L498)))


MooseC
 5882 20ba F040          sbci r31,hi8(-(pm(.L498)))
 5

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.