Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неправильная адресация полей в структуре efsl
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Dog Pawlowa
IAR ARM 520
При чтении поля длины файла происходит неправильное вычисление адреса поля. Смещение на 8 байт, как будто бы при считывании компилятор думает, что структура упакована через 1 байт, а на самом деле она упакована через 4.
Разве так может быть в одной программе? Как компилятор может не знать, как упакована структура?
aaarrr
Цитата(Dog Pawlowa @ Mar 27 2009, 16:59) *
Разве так может быть в одной программе? Как компилятор может не знать, как упакована структура?

Ну, компилятор всегда можно обмануть, если сказать в одном месте одно, а в другом - другое.
Dog Pawlowa
Цитата(aaarrr @ Mar 27 2009, 18:03) *
Ну, компилятор всегда можно обмануть, если сказать в одном месте одно, а в другом - другое.


Я так и подозревал, но по моему мнению, фигня какая-то. Ну ворнинг при линковке можно бы предусмотреть?
А по умолчанию ARM IAR pack=4?
aaarrr
По умолчанию поля структуры упаковываются в соответствии с собственным размером.
Dog Pawlowa
Цитата(aaarrr @ Mar 27 2009, 18:19) *
По умолчанию поля структуры упаковываются в соответствии с собственным размером.

Тогда еще плз поясните отличия между data_alignment и pragma pack?
data_alignment действует на все объявления подряд, а pragma pack только на структуры ?
aaarrr
Цитата(Dog Pawlowa @ Mar 27 2009, 17:29) *
data_alignment действует на все объявления подряд, а pragma pack только на структуры ?

Не спец я по ИАРу, но по логике вещей alignment существует у любого объекта, а паковать можно только структуры.
IgorMarx
Цитата(Dog Pawlowa @ Mar 27 2009, 18:29) *
Тогда еще плз поясните отличия между data_alignment и pragma pack?
data_alignment действует на все объявления подряд, а pragma pack только на структуры ?


IAR C/C++ Development Guide
Compiling and linking


#pragma data_alignment=expression
где expression = 1, 2, 4 и т.д.

data_alignment: "Используйте эту директиву для того, чтобы дать переменной более высокое (более строгое) выравнивание стартового адреса, которое в ином случае могло бы иметь место. Эта директива может быть использована для переменных static и auto".

"Примечание: обычно размер переменных пропорционален их выравниванию. data_alignment влияет только на стартовый адрес переменной, но не на её размер, и может, таким образом, использована создания ситуаций, когда размер не кратен выравниванию."

"#pragma pack влияет на структуры, декларированные после неё, до следующей #pragma pack или конца файла. Примечание: Может приводить к существенному увеличению и замедлению кода при доступе к элементам структуры."


Пардон за вольный перевод.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.