реклама на сайте
подробности

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


Местный
***

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



Есть задача перенести код с avr на arm (компилятор gcc). Люди, которые писали программу на avr активно использовали атрибут packed для структур, затем передавали данные структуры по сериальному интерфейсу.

При переходе на arm вот с чем столкнулся. Компилятор с дериктивой packed честно пакует данные без выравнивания, а далее при попытки записать и прочитать 16, 32 - разрядные переменные, запакованные по нечётным адресам вызывает переходя ядра arm в abort mode.

Есть ли какая возможность обойти данную особенность архитектуры с помощью компилятора. Например деректива какая-нибудь. Что бы он например при обращении по нечётным адресам, делал вычитывание побайтно, а затем собирал из них short или long.

Вообще кто-нибудь сталкивался с такой проблемой? И как решал её? help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xelax
сообщение Sep 7 2007, 07:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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]


Отрадно конечно, но всё равно половина присваиваний в коде идёт через разыменование указателей.
crying.gif

Сообщение отредактировал xelax - Sep 7 2007, 08:21
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 7 2007, 08:18
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата
А ваш пример действительно работает, так как он начало структуры кладёт по нечётному адресу.


Нет. Структура расположена расположена по адресу 0x000083f4. А int поле - по нечетному соответственно. Смотри вложение.
Сейчас посмотрю Ваш вариант.

Сообщение отредактировал amw - Sep 7 2007, 08:19
Прикрепленные файлы
Прикрепленный файл  alignment.zip ( 22.88 килобайт ) Кол-во скачиваний: 51
 


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 7 2007, 08:24
Сообщение #4


Местный
***

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



Цитата(amw @ Sep 7 2007, 12:18) *
Нет. Структура расположена расположена по адресу 0x000083f4. А int поле - по нечетному соответственно. Смотри вложение.
Сейчас посмотрю Ваш вариант.

видимо зависит от проектной реализации. У меня наоборот начало структуры по нечётному было, а переменная по чётному.
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 7 2007, 08:32
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016