AVR, AVRGCC
Получаю некую структуру. Один из элементов которой unsigned int, который я потом рассматриваю как битовое поле.
(unsigned int tcp_pack->HLenAndFlags и рассматриваю его как битовое поле)
Описание структуры
Код
struct MYIP_TCPPack {
unsigned int SourcePort;
unsigned int DestinationPort;
unsigned long SequenceNumber;
unsigned long AcknowledgmentNumber;
unsigned int HLenAndFlags; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-----
unsigned int WindowSize;
unsigned int CRC;
unsigned int UrgentPointer;
unsigned char Data[MYIP_MSS];
};
Описание битового поля
Код
struct MYIP_TCP_HLenAndFlags {
unsigned HLen : 4;
unsigned : 6;
unsigned URG : 1;
unsigned ACK : 1;
unsigned PSH : 1;
unsigned RST : 1;
unsigned SYN : 1;
unsigned FIN : 1;
};
Код
struct MYIP_TCP_HLenAndFlags * HLenFlags = (struct MYIP_TCP_HLenAndFlags * ) tcp_pack->HLenAndFlags;
И вроде как спокойно могу работать с ним. Могу получить и HLen и флаги.
Но не работает если в структуре сразу прописать что это битовое поле
Код
struct MYIP_TCPPack {
unsigned int SourcePort;
unsigned int DestinationPort;
unsigned long SequenceNumber;
unsigned long AcknowledgmentNumber;
struct MYIP_TCP_HLenAndFlags HLenAndFlags; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-----
unsigned int WindowSize;
unsigned int CRC;
unsigned int UrgentPointer;
unsigned char Data[MYIP_MSS];
};
Очевидно, байты переставляются местами и из-за этого возникает каша.
Еще хуже, если я хочу записать такие данные. Для этого я объявил объединение
Код
union MYIP_TCP_HLenAndFlagsUnion {
unsigned int Number;
struct MYIP_TCP_HLenAndFlags HLenFlags;
};
Пользуюсь сдеюущим образом.
Создаю переменную типа union MYIP_TCP_HLenAndFlagsUnion
например var
Код
var.HLenFlags.HLen = 4;
А когда надо все это поле вставить в родительскую структуру поуступаю так
Код
tcp_pack->HLenAndFlags = var.Number;
При этом в память записывается число "0х0720", когда должно быть "0х7002"
Я бы еще понял, если бы байты были просто поменяны местами, понятно что архитектура AVR lite-endian. Но почему-то они и внутри байтов как-то переставлены. Почему так проихсодит?
Сообщение отредактировал Skaf - Feb 19 2011, 15:50