Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil, размер структуры.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
3.14
Имею такую структуру:
Код
struct arp_hdr {
  struct uip_eth_hdr ethhdr;
  u16_t hwtype;  
  u16_t protocol;
  u8_t hwlen;
  u8_t protolen;
  u16_t opcode;
  struct uip_eth_addr shwaddr;
  u16_t sipaddr[2];
  struct uip_eth_addr dhwaddr;
  u16_t dipaddr[2]; };
Так вот в sizeof(struct arp_hdr) = 4, это как?
beer_warrior
Сорри. А не могли вы брать сайзоф указателя?
3.14
Это я uIP к lpc2378 прикручиваю, вижу что на функции передачи пакета проц улетает.
В подпрограмме передачи сначала укладывается заголовок (54 б) затем массив, размер заливаемого массива вычисляется как uip_len-54,а эта самая uip_len=sizeof(struct arp_hdr).
DASM
дык 4 или 54 ?? И полагаю тоже попали на data align. Даешь pragma pack (1) :-D
3.14
сайзофф структуры 4, кстати align-ы я дествительно кругом похерил, правда конкретно к этой структуре они не прилагались.
3.14
Чего-тоя запутался, как в кейле описать:
Цитата
u8_t uip_buf[UIP_BUFSIZE+2] __attribute__ ((aligned (4)));

Еще, в чем таком потаенный смысл директив выравнивания, объявили тип переменной/константы размер которой уже явно известен для упаковки, нет надо блин еще мозги компосировать всевозможными "самодельными" директивами компилятора.
Это получается, сначала, типы создают по размеру (типа BYTE, u8_t ...) потом еще и выравнивают принудительно.
DASM
выравнивание надо, когда мы хотим, например, ту же самую структктуру представить в виде НЕПРЕРЫВНОГО массива (соседние топики про решетчатые массивы не читать). Например для передачи по каналу связи удобно.
Типа
Код
union blala
{
   struct head
  {
    char q;
    int w;
    char ee [3];
  };
union asArray
{
   char data[8];
};
без pack [1] размер структуры в юнионе будет больше 8-ми и будут дырки
};
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.