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

 
 
> Вопрос на счет выравнивания переменных
AirDevil
сообщение Oct 19 2009, 15:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 98
Регистрация: 3-03-09
Пользователь №: 45 590



Всем привет!

Код
u32 func(char * array, u32 * A)
{
    *A = 2;
    return *A;
}


Иногда возникает такая проблема, если А не выравнена по слову, попадает смещенная величина.
Вот пример:

В самом начале:
____word___________wordA____
| 00 00 00 00 |____| 00 00 00 00 |

Должно получиться после присваивания:
____word___________wordA____
| 00 00 00 00 |____| 02 00 00 00 |

А получается так:
____word___________wordA____
| 00 00 00 02 |____| 00 00 00 00 |

Кто как борет это?
Компилятор GCC.

Сообщение отредактировал AirDevil - Oct 19 2009, 15:06
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Oct 19 2009, 17:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(AirDevil @ Oct 19 2009, 18:05) *
Кто как борет это?

Первое и самое главное не писать "говнокод" работу которого компилятор не сможет проконтролировать.
Второе, если уж где-то реально нужно, то контролировать полученный адрес на выравненность и использовать для таких случаев (или тупо всегда) копирование областей памяти.


Цитата(demiurg_spb @ Oct 19 2009, 18:28) *
Для какой архитектуры компилятор?

ARM, например. Не AVR, не x86....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 19 2009, 19:44
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zltigo @ Oct 19 2009, 23:05) *
Первое и самое главное не писать "говнокод" работу которого компилятор не сможет проконтролировать.


В чём "говнокодность" присваивания *A = 2 при условии, что A - это указатель на u32? Автор наверняка умолчал о хитром способе вызова функции - это да. А в приведённом коде не вижу никакого криминала.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2009, 20:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(AHTOXA @ Oct 19 2009, 22:44) *
при условии, что A - это указатель на u32

Да, это указатель на u32, но не выровненный, а находящийся, например, в каком-нибудь буфере передачи.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 19 2009, 20:40
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Oct 20 2009, 02:13) *
Да, это указатель на u32, но не выровненный, а находящийся, например, в каком-нибудь буфере передачи.

Для этого в IARе нужно было всего-то объявить невыравненный тип u32_unalign и вообще не напрягаться
Код
#pragma pack(push, 1)
typedef u32 u32_unalign;
#pragma pack(pop)

u32 func(u08 * array, u32_unalign * A)
{
    u32 tmp = *(u32_unalign *)array;
    *A = tmp;
    return tmp;
}


Работает ли это в GCC ? Ессно изменив прагму.

Сообщение отредактировал GetSmart - Oct 19 2009, 21:17


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2009, 21:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(GetSmart @ Oct 19 2009, 23:40) *
Для этого..
#pragma pack(push, 1)
typedef u32 u32_unalign;
#pragma pack(pop)

Цитата(_Pasha @ Oct 20 2009, 00:04) *
Например:
typedef unsigned int u32_unalign __attribute__ ((aligned (1)));


Даже не знаю, сметься, плакать, или спросить где Вы оба берете такую траву? Можно я помолчу?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AirDevil   Вопрос на счет выравнивания переменных   Oct 19 2009, 15:05
- - demiurg_spb   Для какой архитектуры компилятор? Вы что-то путает...   Oct 19 2009, 15:28
|- - AirDevil   Цитата(zltigo @ Oct 19 2009, 20:05) Перво...   Oct 19 2009, 19:27
|- - _Pasha   Цитата(GetSmart @ Oct 19 2009, 23:40) Раб...   Oct 19 2009, 21:04
- - GetSmart   От зараза, не сработала Я обычно через структуру ...   Oct 19 2009, 22:43
|- - zltigo   Цитата(GetSmart @ Oct 20 2009, 01:43) Но ...   Oct 19 2009, 23:14
||- - GetSmart   Цитата(zltigo @ Oct 20 2009, 05:14) Чем д...   Oct 19 2009, 23:39
|- - rezident   Цитата(GetSmart @ Oct 20 2009, 04:43) Хот...   Oct 19 2009, 23:54
- - GetSmart   Отдельные переменные не всегда выравнены. В посте ...   Oct 20 2009, 00:21
|- - rezident   Цитата(GetSmart @ Oct 20 2009, 06:21) Впо...   Oct 20 2009, 00:32
- - SasaVitebsk   Была аналогичная проблема. Данные "готовились...   Oct 20 2009, 09:17
- - zltigo   Цитата(SasaVitebsk @ Oct 20 2009, 12:17) ...   Oct 20 2009, 09:23
- - SasaVitebsk   Цитата(zltigo @ Oct 20 2009, 12:23) Наибо...   Oct 20 2009, 16:21


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

 


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


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