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
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?
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
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.
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"
Klaus Wachtler schrieb:
> führst du Selbstgespräche? :-)
Ich versteh' mich so gut. ;-)
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
"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.
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.
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.