Hallo!
Ich stolpere gerade zum x-ten mal über das Problem mit
den aligned Speicherzugriffen vom ARM7 und deren Behandlung in GCC.
Ich versuche mal zu erklären was genau passiert:
Es gibt einen Buffer von 128 Bytes länge in den
ein Gerät von ausserhalb seine Datenstrukturen ablegt.
Auf das "wieviel aufeinmal" und wo habe ich dabei keinen Einfluss.
Es handelt sich dabei um eine wild gewürfelte linked-list, deren
Elemente wahlfrei verschieden lang und typisiert sind.
Diese Datenstrukturen will ich nun auswerten.
Der Einfachheit halber natürlich über entsprechende structs.
Die Strukturen sind jeweils aus 8 und 16bit Werten zusammengsetzt
und sind in sich durchaus aligned. Allerdings wandern die auf Bytes
ausgerichtet in diesen Puffer.
Der erste Block beginnt auf buffer[0] , der zweite beispielsweise
auf buffer[9].
Wenn ich aber nun schreibe:
1 | char buffer[128]; // per DMA gefüllt
|
2 |
|
3 | strukturname *pointer;
|
4 | pointer = (strukturname*)&buffer[9];
|
geht das grandios in die Hose und er greift mit dem ersten
structure member auf Buffer[8] zu.
Und nicht wie erwartet etwa buffer[9].
Das er das mit einem WORD nicht können kann habe ich schon
herausgefunden. In diesem Falle besteht die Struktur aber ausschließlich
aus Bytes, was er Architekturbedingt können müsste.
Die Struktur selbst ist als typedef struct mit __attribute__((packed))
definiert. #pragma pack() habe ich auch schon versucht.
Wie überrede ich denn nun den Compiler dazu, dass er den Pointer
bitte nicht aligned setzten soll, sondern dahin wo ich ihn gerne hätte?
Tausend Dank schonmal!
Grüße,
Matthias