mikrocontroller.net

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


Autor: Neki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: ergee (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan May (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.