Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неправильный размер упакованной структуры?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
kichkine
Есть структура вида:

#pragma pack(1)
typedef struct{
int a;
int b;
char c;
}card_conf_t;

Ожидаю, что ее размер 9 байт и, действительно, sizeof() именно такое число и дает. А вот в ассемблерном листинге компилятор пишет:

// 19 card_conf_t card_conf;
card_conf:
DS8 12

Вопрос, почему он (компилятор) резервирует 12 байт?

Я пытаюсь разместить во flash впритык две структуры и получается, что они друг на друга наезжают

#pragma location=CONF_UDAT_ADDR
__no_init card_conf_t card_conf;
#pragma location=(CONF_UDAT_ADDR+sizeof(card_conf_t))
__no_init user_data_t user_data[3];

// 18 #pragma location=CONF_UDAT_ADDR
ASEGN DATA_AN:DATA:NOROOT,0132a00H
// 19 __no_init card_conf_t card_conf;
card_conf:
DS8 12

// 20 #pragma location=(CONF_UDAT_ADDR+sizeof(card_conf_t))
ASEGN DATA_AN:DATA:NOROOT,0132a09H <-- Правильный адрес, вычисленный при пом. sizeof()
// 21 __no_init user_data_t user_data[3];
user_data:
DS8 21692

Пользуюсь IAR EWARM v4.40А
IAR C/C++ Compiler for ARM 4.40.1.201
zltigo
Цитата(kichkine @ Feb 27 2007, 10:12) *
Вопрос, почему он (компилятор) резервирует 12 байт?

Контроллер 32битный - помните?
Цитата
Я пытаюсь разместить во flash впритык две структуры и получается, что они друг на друга наезжают

Не надо насиловать контроллер. А для "нормального" размещения существует понятие массив, в том числе и структур. И структуры со вложенными структурами тоже.
rezident
Любой нормальный компилятор выравнивает расположение структуры в адресном пространстве в соответствии с разрядностью доступа CPU к памяти. Поскольку у вас 32-битное ядро, то и выравнивание происходит кратно 4 байтам. С помощью pragma pack вы можете сделать выравнивание структуры до байта, но только это выравнивание действует внутри самой структуры, а не всей этой структуры в адресном пространстве МК.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.