... schrieb:
>>Man beachte, daß nicht jeder Prozessor mit Zugriffen auf Variablen
>>mit falschem Alignment zurecht kommt.
> Mit so einem Kommentar macht man sich zwar wichtig, aber...... aach
> herje.
Der Kommentar war zutreffend, da ...
> Bei ordnungsgemäßer Struktur-deklaration (packed)
... dies nicht erfolgte und der Cortex M0 bei misalignten Zugriffen
aussteigt ...
> Das missalginment ist dem Compiler doch bekannt.......
... weil es dem Compiler ohne "packed" eben nicht bekannt ist. Ganz zu
schweigen von der falschen Adresse.
Erschwerend kommt hinzu, dass auch "packed" nicht in jedem Fall hilft.
Das sorgt nämlich nur dafür, dass er bei Inhalten, die ihm nun innerhalb
der Structur als misaligned bekannt sind, entsprechend vorgeht. Auf
innerhalb der Struktur korrekt alignte Komponenten kann auch bei
"packed" normal zugegriffen werden.
Wenn also die gesamte Struktur schon misaligned ist, dann hilft auch
"packed" nicht unbedingt. Und genau das kann hier der Fall sein, da ein
Ethernet-Header kein Vielfaches von 4 lang ist und die Struktur per Cast
aus einem Byte-Array an Offset 14 gefischt wird.
Manche Leute platzieren den Ethernet-Frame deshalb so, dass er bei
(addr % 4) == 2
beginnt, weil dann die TCP/IP Header aligned sind. Bei PC-Prozessoren
kann das sogar einen beträchtlichen Unterschied in der Performance
ausmachen, da denen das Alignment zwar formal egal ist, aber misalingte
Schreibzugriffe aufgrund der Arbeitsweise der CPU sehr langsam sein
können.