Forum: Mikrocontroller und Digitale Elektronik Dirty C Tricks in vielen Compilern nicht möglich?


von Neki (Gast)


Lesenswert?

Hallo,

Kann es sein das viele der dirty C Tricks in vielen Compiliern nicht
funktionieren?
Was ich konkret meine ist z.B. ein Array von Chars anzulegen und gleich
zeitig einer unsigend long Variable die gleiche Startadresse zu geben um
mir das Rumschieben zu ersparen.
Konkret meine ich die den CCS (in Verbindung mit PICs) und den IAR (in
Verbindung mit dem MSP430) Compiler.

von Rufus T. Firefly (Gast)


Lesenswert?

Nö. Sowas geht - notfalls mit einer union.

  union
  {
    char bla[4];
    long fusel;
  } CDU;

  CDU.fusel = 0x1234567;

  CDU.bla[0] = 0;

Allerdings geht das auch mit einem -brutalen und ganz und gar nicht
portierbaren- Pointer-Typecast:

  char bla[4];

  *((unsigned long *) bla) = 0x1234567;

Welches Byte wo landet ist implementierungsspezifisch.

von Benedikt (Gast)


Lesenswert?

Ich habe dasselbe bei einem Compiler für den M16C gemacht:
Im Hauptprogramm ein char Array char Puffer[16384] erstellt, und in
einem anderem Programm (das anschließend über den Linker angefüft wird)
über extern unsigned int Puffer [8192] dasselbe Array erstellt. Das
funktioniert einwandfrei, nur wie macht man das in einem Programm ?
Eine Alternative die sicher funktioniert: Über Pointer...

von ergee (Gast)


Lesenswert?

typedef union
{
  int valint;
  struct
  {
    char vh;
    char vl;
  } val
}_myint;

val (2 * char) und valint liefen auf der gleichen Adresse.
ob erst high-Byte oder low-Byte haengt vom Compiler und Controller ab.

Ciao, rg

von André Kronfeldt (Gast)


Lesenswert?

Hi,

liegt BigEndian oder LittleEndian echt vom Compiler ab? Ich dachte die
Architektur bestimmt dies (z.B. Intel / Motorola sind ja auch
verschieden). Denke nicht, daß ein Compiler da Bytes vertauscht. Wäre
ja höchst ineffizient.

Grüße,
André

von Stefan May (Gast)


Lesenswert?

Also der "Trick" mit dem Union ist alles andere als Dirty und manchmal
sehr nützlich. So kann man das sehr schön für Datenpakete verwenden, in
denen ein Byte den Typ und die restlichen Bytes das jeweilige Datum
angeben.

typedef struct
{
   char typ;
   union
   {
      int valint;
      float valfloat;
   }
} data_t;

BigEndian und LittleEndian hängen tatsächlich von der Architektur ab.
Der Compiler mischt sich da meist nicht ein, bzw. macht es so, wie die
Architektur das definiert.

Die AVRs machen LittleEndian, ebenso die MSP430. Die meisten (alle?)
Motorola-CPUs sind BigEndian, ebenso alle Sparcs.

ciao, Stefan.

von A.K. (Gast)


Lesenswert?

AVR little-endian? Meistens, aber nicht immer:

ROM: little-endian.
Register: little-endian.
I/O lesen: little-endian.
I/O schreiben: big-endian.
Stack: big-endian.

von Stefan May (Gast)


Lesenswert?

Ok, das stimmt. Ist das eigentlich irgendwo an einer Stelle
dokumentiert? Die IOs stehen bei den jeweiligen 16-Bit Registern. Was
ist mit dem Stack? Dazu habe ich nix gefunden.

ciao, Stefan.

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.