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


von Simon K. (simon) Benutzerseite


Lesenswert?

Hey, folgendes Problem

aus:
1
unsigned char charset(unsigned char val)
2
{
3
4
    switch (val)
5
    {
6
        case 0:
7
            return (~((1<<5)|(1<<7)|(1<<3)|(1<<1)|(1<<2)|(1<<6)));
8
        case 1:
9
            return (~((1<<7)|(1<<3)));
10
        case 2:
11
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<2)|(1<<1)));
12
        case 3:
13
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)));           
14
15
        case 4:
16
            return (~((1<<6)|(1<<4)|(1<<7)|(1<<3)));            
17
        case 5:
18
            return (~((1<<5)|(1<<6)|(1<<4)|(1<<3)|(1<<1)));           
19
20
        case 6:
21
            return (~((1<<5)|(1<<6)|(1<<4)|(1<<3)|(1<<1)|(1<<2)));     
22
      
23
        case 7:
24
            return (~((1<<5)|(1<<7)|(1<<3)));            
25
        case 8:
26
            return
27
(~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)|(1<<2)|(1<<6)));            
28
        case 9:
29
            return (~((1<<5)|(1<<7)|(1<<4)|(1<<3)|(1<<1)|(1<<6)));
30
31
    }
32
    
33
    return 0;
34
}

wird in der list datei (GEKÜRZT!):
1
 119 0040 9927          clr r25
2
 120 0042 8430          cpi r24,4
3
 121 0044 9105          cpc r25,__zero_reg__
4
 122 0046 81F1          breq .L16
5
 
6
 //SCHNITT (hier wären die ganzen andern switch cases..
7
8
 183                 .L16:
9
 184                 .LM19:
10
 185 00a8 87E2          ldi r24,lo8(39)
11
 186 00aa 90E0          ldi r25,hi8(39)
12
 187 00ac 0895          ret

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

von Peter Dannegger (Gast)


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

von Simon K. (simon) Benutzerseite


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

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

Matthias

von Simon K. (simon) Benutzerseite


Lesenswert?

Oh, guter Tipp !
Das mach ich doch direkt mal.

von Kai Klenovsek (Gast)


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.

von Simon K. (simon) Benutzerseite


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!

von Simon K. (simon) Benutzerseite


Lesenswert?

Kleine Frage noch.

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Oha scheint er zu machen. Im .lst sehe ich "mul rX, rX".

Wo kann ich erfahren wie dieses mul beim AVR funktioniert?

von Simon K. (simon) Benutzerseite


Lesenswert?


von Peter Fleury (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.