Hallo, ich bin total am verzweifeln. Ich hab als OS Ethernut. Mit ICC AVR 6.28 versuche ich den Code für die MMC Karte zu kompilieren. Leider bekomm ich bei dieser Definition: ... // Typendeklarationen typedef signed char S8; // Wertebereich: -128..127 typedef signed char S08; typedef signed char tS08; typedef unsigned char U8; // Wertebereich: 0..255 typedef unsigned char U08; typedef unsigned char tU08; typedef signed int S16; // Wertebereich: -32768..32767 typedef signed int tS16; typedef unsigned int U16; // Wertebereich: 0..65535 typedef unsigned int tU16; typedef signed long S32; // Wertebereich: -2147483648..2147483647 typedef signed long tS32; typedef unsigned long U32; // Wertebereich: 0..4294967295 typedef unsigned long tU32; typedef signed long long S64; typedef signed long long tS64; typedef unsigned long long U64; typedef unsigned long long tU64; typedef S08 *pS8; typedef S08 *pS08; typedef U08 *pU8; typedef U08 *pU08; typedef S16 *pS16; typedef U16 *pU16; typedef S32 *pS32; typedef U32 *pU32; typedef S64 *pS64; typedef U64 *pU64; typedef float *pfloat; typedef double *pdouble; typedef U32 BOOL; typedef U32 bool; typedef BOOL *pBOOL; typedef U08 volatile *pREG08; typedef U16 volatile *pREG16; typedef U32 volatile *pREG32; typedef union uMEM08 // 8-Bit Datentyp mit Byte- und Bitzugriff { // Zugriff auf Byte var.U08 = 0xFF; U08 U08 ; // Zugriff auf Bit var.bit._7 = 1; struct { U08 _0: 1; //Error: `unsigned char' is an illegal bit-field type U08 _1: 1; U08 _2: 1; U08 _3: 1; U08 _4: 1; U08 _5: 1; U08 _6: 1; U08 _7: 1; } bit; } tMEM08; ... Was mach ich falsch? Liegt es daran, das ich als OS Ethernut habe und ich daraus die Libs neheme ? Vielen Dank für Eure Hilfe Thomas
Falls du dich wundern solltest, warum du hier auf das Posting keine Antwort bekommst: Man versteht überhaupt nichts.
Hallo, ich meine, die typedef union uMEM08 und uMEM16 braucht man nicht zwingend für den Code. Hatte damit auch meine Probs bei ICC AVR. Letzlich habe ich die "typedefs.h" ganz raus genommen und in den Funktionen alles auf ICC angepasst (also z.B. voll ausgeschrieben unsigned int x statt u16 x). Gruß, Dennis
Hi Thomas, versuchs mal mit unsigned int Elementen in dem Bitfield, also: typedef union uMEM08 // 8-Bit Datentyp mit Byte- und Bitzugriff { // Zugriff auf Byte var.U08 = 0xFF; U08 U08 ; // Zugriff auf Bit var.bit._7 = 1; struct { U16 _0: 1; U16 _1: 1; U16 _2: 1; U16 _3: 1; U16 _4: 1; U16 _5: 1; U16 _6: 1; U16 _7: 1; } bit; } tMEM08; In C99, sind soweit ich weiss für Bitfields nur die Datentypen _Bool, signed int, und unsigned int erlaubt. char aber jedenfalls nicht. Am Speicherverbrauch sollte das übrigens auch nichts ändern. Die Bitlänge ist ja vorgegeben. Gruß, Christian
Danke, sorry wenns etwas konfus aussieht. Ich werd mals Christians Tipp ausprobieren. Danke schonmal Gruß Thomas
Und, wie siehts aus? Hats was geholfen oder gibts immer noch Probleme? Christian
Kanns leider erst veruschen wenn ich daheim bin. Danke für die Hilfe Thomas
Ok ich habs nun antstatt mit typedef unsigned char U08; typedef union uMEM08; ausprobiert. Leider bekomm ich nun einen Compilerfehler bei der Verwendung von typedef uMEM08 *pU8; //: syntax error; found `*' expecting `;' Aber da bin ich noch dabei. Ich glaube dank deiner Hilfe bin ich mal nen Schritt weiter. Vielen Dank Gruß Thomas
Hi, war ne Weile im Urlaub, daher erst jetzt meine Antwort. Wie siehts denn aus, haben sich die Probleme geklärt? Ich verstehe nicht ganz was du mit typedef uMEM08 *pU8; erreichen willst. tMEM08 ist nach der vorherigen Typdefinition mit "typedef union uMEM08 ...." ein neu definierter Datentyp, genauso wie int, long, ... Mit "typedef uMEM08 *pU8" versuchst du einen Typ zu definieren, der (*pU8) heisst. Das alleine könnte glaube ich funktionieren. Der 2. Wert nach dem typedef legt den Datentyp fest auf dem der neu angelegte basiert (siehe "typedef unsigned char U8;"). uMEM08 ist allerdings nicht der Typname, sondern eine in der zuvor verwendeten Notation bereits erstellte Variable vom Typ tMEM08. Wenn du einen Zeiger vom Typ tMEM08 anlegen willst dann so: tMEM08 *pU8; // Zeiger auf eine Union vom Typ tMEM08 tMEM08 *pU8 = &uMEM08; // Zeiger auf die Union uMEM08 Auf die bereits erstellte Union vom Typ tMEM08 kannst du folgendermassen zugreifen: uMEM08.U08 = 0xFF; uMEM08.bit._0 = 0; uMEM08.bit._1 = 1; uMEM08.bit._2 = 0; ... Vielleicht ist alles aber auch viel einfacher und du hast dich vertippt und versuchst es einfach mal mit typedef tMEM08 *pU8; Das ganze kannst du dann z.B. so verwenden: pU8 pntrU8; // pointer auf tMEM08 pntrU8 = &uMEM08; pntrU8->U08 = 0xFF; Christian
Wow danke für die sehr ausführliche Antwort. Leider hab ich gerade an einer anderen Baustelle zu tun, hab aber deine 1. Möglichkeit schon ausprobiert. Nur bekomm ich nun an anderen Stellen Errors. Die Sache ist die, das ich die Code von U. Radig einfach mal in meinen Projekt geladen habe. Ich bin noch daran zu verstehen, warum er so viele neue Typedefs angelegt hat. Deine Zugriffsart leuchtet mir ein. Ich werde Fortschritte berichten. Vielen Dank für die Antwort. Grüße Thomas
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.