Maly problem

Loading thread data ...

Klasyka... A packed nie pomaga?

formatting link
Mister

Reply to
Mister

Artur pisze:

[...]

Zdecydowana większość procesorów z jądrem ARM7TDMI nie może zapisać lub odczytać niewyrównanej danej do/z pamięci. Czyli słowa 32-bitowe muszą być zawsze umieszczone pod adresem z zerowymi 2 najmłodszymi bitami, słowa 16-bitowe pod adresem z wyzerowanym najmłodszym bitem (parzystymi). Próba dostępu pod niewyrównany adres kończy się wyjątkiem.

Kompilator próbuje temu zaradzić (tam gdzie może) i odpowiednio rozpycha struktury. Na przykład struktura:

struct { unsigned char a; unsigned long b; }

zajmie 8 bajtów, bo pole b musi być wyrównane do wielokrotności 4 bajtów licząc od początku struktury. Oczywiście można wymusić dostęp do dowolnego adresu przez rzutowanie i inne zabiegi, ale skończy się on wyjątkiem (np. w AT91SAM7S256 czy AT91RM9200). Nie wiem, jakiego używasz ARMa, w którym nie dostajesz wyjątku tylko błędne działanie programu.

Reply to
Adam Dybkowski

Adam Dybkowski schrieb:

czyli dupa nie kompilator. Kompilator powinien, w przypadku użycia packed structure przerobić kod na mało efektywny, ale prawidłowy kod dostępu. Znaczy czytanie słowa i dostęp do bajtu/uint16 itd. Przy wpisywaniu tak samo: czytaj słowo, wpisz bajt na odpowiednie miejsce, wpisz spowrotem słowo.

Waldek

Reply to
Waldemar

Waldemar pisze:

Nie próbowałem dodawać atrybutu 'packed'. Napisałem w jaki sposób kompilator zachowuje się domyślnie (arm-elf-gcc 3.4.3).

Reply to
Adam Dybkowski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.