mikrocontroller.net

Forum: Compiler & IDEs char ist größer als 8 bit?!


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, folgendes Problem

aus:
unsigned char charset(unsigned char val)
{

    switch (val)
    {
        case 0:
            return (~((1<<5)|(1<<7)|(1<<3)|(1<<1)|(1<<2)|(1<<6)));
        case 1:
            return (~((1<<7)|(1<<3)));
        case 2:
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<2)|(1<<1)));
        case 3:
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)));           

        case 4:
            return (~((1<<6)|(1<<4)|(1<<7)|(1<<3)));            
        case 5:
            return (~((1<<5)|(1<<6)|(1<<4)|(1<<3)|(1<<1)));           

        case 6:
            return (~((1<<5)|(1<<6)|(1<<4)|(1<<3)|(1<<1)|(1<<2)));     
      
        case 7:
            return (~((1<<5)|(1<<7)|(1<<3)));            
        case 8:
            return
(~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)|(1<<2)|(1<<6)));            
        case 9:
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)|(1<<6)));

    }
    
    return 0;
}

wird in der list datei (GEKÜRZT!):
 119 0040 9927          clr r25
 120 0042 8430          cpi r24,4
 121 0044 9105          cpc r25,__zero_reg__
 122 0046 81F1          breq .L16
 
 //SCHNITT (hier wären die ganzen andern switch cases..

 183                 .L16:
 184                 .LM19:
 185 00a8 87E2          ldi r24,lo8(39)
 186 00aa 90E0          ldi r25,hi8(39)
 187 00ac 0895          ret

Warum macht er aus dem Rückgabewert aufeinmal 16Bit? Der höchste
zurückgegebene Wert ist übrigens 133.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ne Eigenart der AVR-GCC.

Switches und Returnwerte werden immer auf 16 Bit erweitert.

Dadurch ergibt sich das Kuriosum, daß Funktionen mit unsigned int als
Returnwert kleineren Code erzeugen können als mit unsigned char.


Und auch tunlichst unsigned char verwenden, weil sonst noch zusätzlich
eine Vorzeichenexpansion gemacht wird.


Peter

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tz, hoffentlich ist diese "Verschlechterung" von Schnelligkeit nur
hier der Fall..

Warum wird das nicht behoben? Gibts nen Grund dafür, das so zu machen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Warum wird das nicht behoben? Gibts nen Grund dafür, das so zu
> machen?

Soll wohl aufgrund der Möglichkeit, dass der Aufrufer word-Befehle
benutzen kann, so gewollt sein.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

wobei für obigen Code eine kleine Look-Up-Tabelle im Flash deutlich
einfacher und vermutlich auch schneller wäre.

Matthias

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, guter Tipp !
Das mach ich doch direkt mal.

Autor: Kai Klenovsek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal "-mint8" als GCC Option. Dann sollten zumindest die
Switch-Cases als 8Bit Werte durchlaufen. Habe selber die Option noch
nie benutzt. Aber vorsicht dann mit Deinen Variablen die werden dann
auch gewandelt.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, kann er ja ruhig als int übergeben, ist ja jetzt nicht soooo viel
langsamer.

Trotzdem habe ich ne Lookup Table jetzt drin, finde ich auch besser.
Vielen Dank nochmal!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleine Frage noch.

Ist AVR-GCC so "aktuell" dass es den Hardware Multiplizierer der
Megas benutzt?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha scheint er zu machen. Im .lst sehe ich "mul rX, rX".

Wo kann ich erfahren wie dieses mul beim AVR funktioniert?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter AVR-GCC 4.0.2 (binutils 2.16.1, AVR-Libc 1.4.0) wird dieser Case
mittels ijmp implementiert.

Bei kleinerer Anzahl case Fälle wird korrekt ein byte getestet.
  de:  82 30         cpi  r24, 0x02  ; 2
  e0:  89 f0         breq  .+34       ; 0x104
  e2:  83 30         cpi  r24, 0x03  ; 3
  e4:  28 f4         brcc  .+10       ; 0xf0

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.