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

 
 
> Битовые поля и WinAVR
Skaf
сообщение Feb 19 2011, 15:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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