- posted
16 years ago
Maly problem
- Vote on answer
- posted
16 years ago
Klasyka... A packed nie pomaga?
- Vote on answer
- posted
16 years ago
- Vote on answer
- posted
16 years ago
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.
- Vote on answer
- posted
16 years ago
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
- Vote on answer
- posted
16 years ago
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).