Forum: Mikrocontroller und Digitale Elektronik Probleme mit ICC und Ulrich Radigs MMC Code


von Thomas O. (tommyo)


Lesenswert?

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

von Niels H. (monarch35)


Lesenswert?

Falls du dich wundern solltest, warum du hier auf das Posting keine
Antwort bekommst: Man versteht überhaupt nichts.

von Dennis Kleine-Beck (Gast)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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

von Thomas O. (Gast)


Lesenswert?

Danke,
sorry wenns etwas konfus aussieht.
Ich werd mals Christians Tipp ausprobieren.
Danke schonmal
Gruß
Thomas

von Christian (Gast)


Lesenswert?

Und, wie siehts aus? Hats was geholfen oder gibts immer noch Probleme?

Christian

von Thomas O. (Gast)


Lesenswert?

Kanns leider erst veruschen wenn ich daheim bin.
Danke für die Hilfe
Thomas

von Thomas O. (tommyo)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.