|
Выравнивание в gcc, Обращение по нечётным адресам |
|
|
|
Sep 7 2007, 06:21
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

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

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Код #define PACK __attribute__ ((__packed__))
typedef struct { uint8_t a; uint16_t b; uint32_t d; uint8_t c; } PACK my_packed_struct;
void test(void) { my_packed_struct str; my_packed_struct* pstr; uint8_t* pa; uint16_t* pb; uint32_t* pd; uint8_t* pc; uint16_t q = 1; pstr = &str; pa = &(pstr->a); pb = &(pstr->b); pd = &(pstr->d); pc = &(pstr->c); *pb = q; } Пухнет и дохнет. uint32_t и uint16_t. Расположенны по нечётным адресам. Смотрел дебагером. А ваш пример действительно работает, так как он начало структуры кладёт по нечётному адресу. GCC-4.1.1 sam7x256 З.Ы. Только что проверил такой код Код pstr = &str; pa = &(pstr->a); pstr->b = q; pb = &(pstr->b); pd = &(pstr->d); pc = &(pstr->c); *pb = q; pstr->b = q; ---- работает, хотя pb после присваивания указывает на нечётный адрес. вот дизасм кода. Код pstr->b = q; 100d80: e51b0024 ldr r0, [fp, #-36] 100d84: e55b100e ldrb r1, [fp, #-14] 100d88: e3a03000 mov r3, #0; 0x0 100d8c: e1a02003 mov r2, r3 100d90: e1a03001 mov r3, r1 100d94: e1823003 orr r3, r2, r3 100d98: e5c03001 strb r3, [r0, #1] 100d9c: e55b100d ldrb r1, [fp, #-13] 100da0: e3a03000 mov r3, #0; 0x0 100da4: e1a02003 mov r2, r3 100da8: e1a03001 mov r3, r1 100dac: e1823003 orr r3, r2, r3 100db0: e5c03002 strb r3, [r0, #2] Отрадно конечно, но всё равно половина присваиваний в коде идёт через разыменование указателей.
Сообщение отредактировал xelax - Sep 7 2007, 08:21
|
|
|
|
|
Sep 7 2007, 08:18
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата А ваш пример действительно работает, так как он начало структуры кладёт по нечётному адресу. Нет. Структура расположена расположена по адресу 0x000083f4. А int поле - по нечетному соответственно. Смотри вложение. Сейчас посмотрю Ваш вариант.
Сообщение отредактировал amw - Sep 7 2007, 08:19
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 7 2007, 08:32
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(xelax @ Sep 7 2007, 11:24)  видимо зависит от проектной реализации. У меня наоборот начало структуры по нечётному было, а переменная по чётному. Не понял. Код *pb = q; 81c0: e51b2020 ldr r2, [fp, #-32] 81c4: e15b32ba ldrh r3, [fp, #-42] 81c8: e1c230b0 strh r3, [r2] pstr->b = q; 81cc: e51b0018 ldr r0, [fp, #-24] 81d0: e55b102a ldrb r1, [fp, #-42] 81d4: e3a03000 mov r3, #0; 0x0 81d8: e1a02003 mov r2, r3 81dc: e1a03001 mov r3, r1 81e0: e1823003 orr r3, r2, r3 81e4: e5c03001 strb r3, [r0, #1] 81e8: e55b1029 ldrb r1, [fp, #-41] 81ec: e3a03000 mov r3, #0; 0x0 81f0: e1a02003 mov r2, r3 81f4: e1a03001 mov r3, r1 81f8: e1823003 orr r3, r2, r3 81fc: e5c03002 strb r3, [r0, #2] Да, с разименованием работает, а через указатель - нет. Потому как typedef unsigned short uint16_t - требует расположения по четному адресу.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Сообщений в этой теме
xelax Выравнивание в gcc Sep 7 2007, 06:21 Puzan Директивами не исправить.
Попробуй сделать битовым... Sep 7 2007, 06:36 xelax Цитата(Puzan @ Sep 7 2007, 10:36) Директи... Sep 7 2007, 07:13 abcdefg Цитата(Puzan @ Sep 7 2007, 10:36) Директи... Sep 7 2007, 08:16 amw Цитата(xelax @ Sep 7 2007, 09:21) Есть за... Sep 7 2007, 07:44 Puzan С указателями на поля по-любому не получится. С ук... Sep 7 2007, 08:42 scifi Если при попытке сделать чтение или запись по неро... Sep 7 2007, 08:47 xelax Цитата(scifi @ Sep 7 2007, 12:47) Если пр... Sep 7 2007, 09:08  scifi Цитата(xelax @ Sep 7 2007, 13:08) Это г... Sep 7 2007, 09:19 xelax Цитата(scifi @ Sep 7 2007, 12:47) Если пр... Sep 10 2007, 07:09  Alex03 Цитата(xelax @ Sep 10 2007, 13:09) А если... Sep 10 2007, 07:34   xelax Цитата(Alex03 @ Sep 10 2007, 11:34) Эт кт... Sep 10 2007, 07:39    Gemm Подскажите, пожалуйста, как делать выравненные стр... Sep 11 2007, 10:39     Alex03 Цитата(Gemm @ Sep 11 2007, 16:39) Подскаж... Sep 12 2007, 05:40     scifi Цитата(Gemm @ Sep 11 2007, 14:39) Подскаж... Sep 12 2007, 07:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|