Forum: Compiler & IDEs Datentypen bei AVR-GCC


von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Hallo,

ich fange gerade mit der Programmierung von AVR-µCs an und verwende dazu 
AVR-Studio und AVR-GCC. Bisher habe ich immer Programme für PC erstellt 
oder für PIC-Mikrocontroller.

Mein Problem: Ich finde für den AVR-GCC nirgends in der Dokumentation 
eine Tabelle aller verfügbaren Datentypen und ihre jeweilige Länge.

gibt es z.B. bei AVR-GCC die Datentypen int, double und char? Und wenn 
ja, wie viele bits sind es jeweils???

Habe nur sowas wie uint_8 in der inttypes.h gefunden, aber das kann es 
ja nicht sein...

Schöne Grüße,
Alex

von Patrick (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Alex Bürgel wrote:
>
> gibt es z.B. bei AVR-GCC die Datentypen int, double und char?

int, double, char, long sind die C-Standarddatentypen, die jede
C Implementierung mitbringen muss.

> Und wenn
> ja, wie viele bits sind es jeweils???

Kannst du auf deinem µC schon Ausgaben über die serielle
Schnittstelle machen, oder zumindest eine Ausgabe an einen
Port?
Wenn ja, diese Frage kann dir der Compiler (fast) selbst beantworten.
In C werden Datentypen in char-Einheiten gemessen. Der Datentyp char
hat also per Definition die Größe 1. Normalerweise (ist aber
nicht zwingend) umfasst ein char 8 Bit - also 1 Byte.

Und jetzt kommt der Compiler ins Spiel:

Am Beispiel eines Ports.

#include <avr/io.h>

int main()
{
  DDRB = 0xFF;      // PORT B: alles auf Ausgang

  PORTB = sizeof( int );

  while( 1 )
  {
  }
}

Der µC legt dir also als Zahlenwert am Port B raus, wie gross
für ihn ein int ist.


Für den AVR-GCC ergibt sich

   char       1
   int        2
   long       4
   float      4
   double     4

Ein long umfasst also 4 char Einheiten, also 4*8 = 32 Bit

> Habe nur sowas wie uint_8 in der inttypes.h gefunden, aber das kann es
> ja nicht sein...

Oh doch. Das kanns sehr wohl sein. Auf einem µC sind diese
Datentypen mit definierten Bitzahlen nämlich meist wesentlich
interessanter als die generischen Typen int und long, die je
nach Rechnerarchitektur andere Größen haben.

von coldtobi (Gast)


Lesenswert?

> gibt es z.B. bei AVR-GCC die Datentypen int, double und char? Und wenn
> ja, wie viele bits sind es jeweils???

DAS sind C-Standard-Typen. Breite ist wie im Standard definiert (oder 
wie im Fall von z.B int eben nicht definiert).

> Habe nur sowas wie uint_8 in der inttypes.h gefunden, aber das kann es
> ja nicht sein...

Doch, das ist was Du willst und wie es sein soll. Und überasch damit 
weisst Du auch die Breite -- ohne die Definitionslücken von C als Falle 
zu haben.

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Ist das echt so, dass der Compiler "serienmäßig" keine "normalen" 
Datentypen wie int, double, char, bool, byte etc. kennt?

Im Moment muss ich sagen finde ich das sehr sehr armselig... Was soll 
das denn?

von Andreas K. (a-k)


Lesenswert?

coldtobi wrote:

> DAS sind C-Standard-Typen. Breite ist wie im Standard definiert

Im Standard sind nur Mindestwerte definiert.

von Karl H. (kbuchegg)


Lesenswert?

Alex Bürgel wrote:
> Ist das echt so, dass der Compiler "serienmäßig" keine "normalen"
> Datentypen wie int, double, char, bool, byte etc. kennt?

Das hat sich jetzt wohl zeitlich überschnitten.
Natürlich gibt es diese Standardtypen. Jeder C Compiler
kennt sie!

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:

> Für den AVR-GCC ergibt sich
>
>    char       1
>    int        2
>    long       4
>    float      4
>    double     4

Ah ja, super! Genau so etwas suchte ich. Warum ist das in der 
Dokumentation nirgendwo aufgelistet?


> Oh doch. Das kanns sehr wohl sein. Auf einem µC sind diese
> Datentypen mit definierten Bitzahlen nämlich meist wesentlich
> interessanter als die generischen Typen int und long, die je
> nach Rechnerarchitektur andere Größen haben.

Naja, ich habe es mir inzwischen angewöhnt bei jedem neuen Compiler den 
ich verwende mir zu allererst die Datentypen anzuschauen um zu sehen was 
ich wo reinpacken kann...

Vielen Dank!
Schöne Grüße,
Alex

von Andreas K. (a-k)


Lesenswert?

Alex Bürgel wrote:

> Ist das echt so, dass der Compiler "serienmäßig" keine "normalen"
> Datentypen wie int, double, char, bool, byte etc. kennt?

Doch, int/double/char schon, bool je nach Version des Standards. Nur 
byte gibt's nicht. Und im C-Standard steht auch drin, welche 
Wertebereiche bzw. Genauigkeiten dafür mindestens eingehalten werden 
müssen. Und daran hält sich auch GCC/AVR. Mit einer Ausnahme: "double" 
ist identisch mit "float", müsste aber mindestens 10 Stellen hergeben.

Allerdings hält sich GCC, was die Dokumentation angeht, hier an das 
bekannte Freeware-Motto "der Quelltext ist die beste Doku" und überlässt 
es dem Anwender, die Typen durch Rückschluss aus stdint.h rauszukriegen.

von Karl H. (kbuchegg)


Lesenswert?

Alex Bürgel wrote:
> Karl heinz Buchegger wrote:
>
>> Für den AVR-GCC ergibt sich
>>
>>    char       1
>>    int        2
>>    long       4
>>    float      4
>>    double     4
>
> Ah ja, super! Genau so etwas suchte ich. Warum ist das in der
> Dokumentation nirgendwo aufgelistet?

Ohne den Beweis jetzt antreten zu können: Ich bin mir fast sicher
das es irgendwo in der Doku steht.
Ansonsten: Jeder Programmierer kann sich das mit wenig Aufwand
leicht selbst bestimmen. Ausserdem gibt es noch die limits.h
in der die daraus resultierenden Maximal und Minimalwerte für
jeden Datentypen stehen.

> Naja, ich habe es mir inzwischen angewöhnt bei jedem neuen Compiler den
> ich verwende mir zu allererst die Datentypen anzuschauen um zu sehen was
> ich wo reinpacken kann...

... und dann alles umzuprogrammieren, wenn die Typen zu klein sind.
Na denn, viel Spass dabei.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger wrote:

> leicht selbst bestimmen. Ausserdem gibt es noch die limits.h
> in der die daraus resultierenden Maximal und Minimalwerte für
> jeden Datentypen stehen.

Ooops. Die gibts bei WinAvr ja gar nicht! Ist mir noch nie
aufgefallen.

von die ??? (Gast)


Lesenswert?

Karl wrote:
> Ooops. Die gibts bei WinAvr ja gar nicht! Ist mir noch nie aufgefallen.

Doch, die gibt es. Bei mir hier:

  ...\WinAVR-20070525\lib\gcc\avr\4.1.2\include

von Karl H. (kbuchegg)


Lesenswert?

die ??? wrote:
> Karl wrote:
>> Ooops. Die gibts bei WinAvr ja gar nicht! Ist mir noch nie aufgefallen.
>
> Doch, die gibt es. Bei mir hier:
>
>   ...\WinAVR-20070525\lib\gcc\avr\4.1.2\include

Hab im falschen Verzeichnis gesucht. Mea culpa.
Hatte mich schon gewundert, dass die nicht da sein soll.

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.