Forum: Compiler & IDEs 64bit datentypen avr


von Jens B. (sio2)


Lesenswert?

Ich versuche auf dem m88 mit 64bit daten zu hantieren. aber ein sizeof 
gibt bei long long, uint64_t und uintmax_t nur 0 aus. <inttyoes.h> ist 
inludiert, und der compiler hat auch nicht die option "-mint8" ausser 
ich uebersehe da was.

avr-gcc -c -mmcu=atmega88 -I. -gstabs   -Os -Wall -Wstrict-prototypes 
-std=gnu99  cmd.c -o cmd.o


Wie kann ich mit 64bit arbeiten?
thnx.

: Verschoben durch Admin
von Stefan E. (sternst)


Lesenswert?

Jens B. schrieb:
> Ich versuche auf dem m88 mit 64bit daten zu hantieren. aber ein sizeof
> gibt bei long long, uint64_t und uintmax_t nur 0 aus.

Bei mir nicht.
Wie sieht der Code dazu genau aus?
Welche avr-gcc-Version?

von Jens B. (sio2)


Lesenswert?

Der Code sieht so aus:
lcd_putchar(sizeof(uintmax_t)+'0');
uint32_t und uint16_t zeigen es richtig.

avr-gcc (Gentoo 4.4.3 p1.0) 4.4.3

von Grrrr (Gast)


Lesenswert?

Jens B. schrieb:
> lcd_putchar(sizeof(uintmax_t)+'0');

Öhm. Räusper. Hust. Röchel. Würg.
Das ist also der Code der Dir das Ergebnis von sizeof anzeigt? Aha. 
Interessant.

Willst Du noch mal raten? Dreimal darfst Du.

von Stefan E. (sternst)


Lesenswert?

Jens B. schrieb:

> avr-gcc (Gentoo 4.4.3 p1.0) 4.4.3

Ein avr-gcc auf Basis des gcc 4.4.3?
Das dürfte dann wohl mal wieder ein avr-gcc sein, der nur aus den 
offiziellen gcc-Quellen entstanden ist, ohne die zusätzlichen avr 
spezifischen Patches.

Hier findest du Infos, wo du einen "vernünftigen" avr-gcc für Linux 
bekommst:
Beitrag "Interrupt wird beim linken nicht in den interrupt vektor eingetragen"

von Grrrr (Gast)


Lesenswert?

Grrrr schrieb:
> '0'
Verdammt. Ich brauche Urlaub. Sorry.

von Klaus W. (mfgkw)


Lesenswert?

führst du Selbstgespräche? :-)

von Grrrr (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> führst du Selbstgespräche? :-)

Ich versteh' mich so gut. ;-)

von Peter D. (peda)


Lesenswert?

Jens B. schrieb:
> Ich versuche auf dem m88 mit 64bit daten zu hantieren.

Dann darfst Du Dich aber nicht wundern, wenn der Flash explodiert und 
die CPU keucht.

64Bit ist zwar implementiert, aber nicht für den AVR optimiert und daher 
deutlich codefressender und deutlich langsamer als float.


Versuch mal mit Arrays aus 8, 16 oder 32Bit-Variablen auszukommen. 
Insbesondere wenn immer nur ein Bit manipuliert werden soll, ist ein 
"uint8_t foo[8]" am schnellsten und codesparendsten.


Peter

von SiO2 (Gast)


Lesenswert?

"Dann darfst Du Dich aber nicht wundern, wenn der Flash explodiert und
die CPU keucht."

Explodieren? Das ist noch untertrieben. 10 Zeilen=> 2-4KB (ok, war auch 
float mit bei)

Im endeffekt wollte ich 64bit, weil ich nicht mit float hantieren wollte 
und genauigkeit brauchte.

Das Problem lag wirklich an der GCC version. KA was sich die 
crossdevleute gedacht haben, aber ich werde denen mal schreiben oder bug 
aufmachen.

Besten Dank.

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


Lesenswert?

SiO2 schrieb:
> Das Problem lag wirklich an der GCC version.

Das wiederum ist allerdings wichtig zu wissen!  Bitte frage die
Leute von Crossdev mal, ob der Compiler ungepatcht war.  Wenn der
"aus der Dose raus" sowas falsch macht, ist was faul, und du solltest
unbedingt bei GCC einen Bugreport loslassen.

Der AVR-GCC 4.4.x ist bislang noch sehr wenig getestet, um so wichtiger
aber ist es, dass erkannte Bugs auch gemeldet werden.  Wenn ich mich
recht erinnere, benutzt er einen neuen Registerallokator, sodass
zumindest schlechter optimierter Code durchaus im Rahmen des Erwarteten
liegt, aber ein nicht funktionierender long long bzw. uint64_t ist
nicht im Rahmen des Erwarteten.

von Jens B. (sio2)


Lesenswert?

"Der AVR-GCC 4.4.x ist bislang noch sehr wenig getestet, um so wichtiger
aber ist es, dass erkannte Bugs auch gemeldet werden."

Es scheint nicht direkt am 4.4.* zuliegen. Nach einer Installation nach 
http://www.nongnu.org/avr-libc/user-manual/install_tools.html#install_avr_gcc

klappt es auch mit 4.4.3. Natuerlich ohne extra zu patchen.

Also werde ich mal die crossdevler anschreiben.

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.