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.
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.
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...
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
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é
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.