Цитата(xelax @ Sep 7 2007, 09:21)

Есть задача перенести код с avr на arm (компилятор gcc). Люди, которые писали программу на avr активно использовали атрибут packed для структур, затем передавали данные структуры по сериальному интерфейсу.
При переходе на arm вот с чем столкнулся. Компилятор с дериктивой packed честно пакует данные без выравнивания, а далее при попытки записать и прочитать 16, 32 - разрядные переменные, запакованные по нечётным адресам вызывает переходя ядра arm в abort mode.
Есть ли какая возможность обойти данную особенность архитектуры с помощью компилятора. Например деректива какая-нибудь. Что бы он например при обращении по нечётным адресам, делал вычитывание побайтно, а затем собирал из них short или long.
Вообще кто-нибудь сталкивался с такой проблемой? И как решал её?

Код
typedef struct _ustr {
char c;
int i;
} __attribute__ ((packed)) ustr_t;
int x;
ustr_t str;
str.i = 5;
x = str.i;
GCC 3.4.5 AT91SAM7S256 - все работает.
В догонку дизассемблируем прведенный выше код
Код
str.i = 5;
8180: e59f2060 ldr r2, [pc, #96]; 81e8 <.text+0x1cc>
8184: e3a03000 mov r3, #0; 0x0
8188: e3833005 orr r3, r3, #5; 0x5
818c: e5c23001 strb r3, [r2, #1]
8190: e3a03000 mov r3, #0; 0x0
8194: e5c23002 strb r3, [r2, #2]
8198: e3a03000 mov r3, #0; 0x0
819c: e5c23003 strb r3, [r2, #3]
81a0: e3a03000 mov r3, #0; 0x0
81a4: e5c23004 strb r3, [r2, #4]
x = str.i;
81a8: e59f003c ldr r0, [pc, #60]; 81ec <.text+0x1d0>
81ac: e59f2034 ldr r2, [pc, #52]; 81e8 <.text+0x1cc>
81b0: e5d21001 ldrb r1, [r2, #1]
81b4: e5d23002 ldrb r3, [r2, #2]
81b8: e1a03403 mov r3, r3, lsl #8
81bc: e1831001 orr r1, r3, r1
81c0: e5d23003 ldrb r3, [r2, #3]
81c4: e1a03803 mov r3, r3, lsl #16
81c8: e1831001 orr r1, r3, r1
81cc: e5d23004 ldrb r3, [r2, #4]
81d0: e1a03c03 mov r3, r3, lsl #24
81d4: e1833001 orr r3, r3, r1
81d8: e5803000 str r3, [r0]
Как видим - доступ побайтный и OR со сдвигом.
Все в порядке.