Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Rowley Crossstudio 1.4 build 5 для ARM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
etoja
Rowley Crossstudio 1.4 build 5 для ARM. Вопрос по упакованным структурам.

Определяю тип структуры таким образом:
typedef struct TCodeHeader
{
u8 Code;
u8 ID;
u16 Len;
} T_CodeHeader __attribute__ ((packed));
Атрибут указывает компилятору упаковать структуру в одно 32-битное целое, как в хелпе.
Но при компиляции выдаётся warning: "packed" attribute ignored.

Вопрос: как правильно задать упакованную структуру?

Примечание: в компиляторе GreenHills MULTI нет такой проблемы, просто задаёшь опцию
#pragma pack(1)
zltigo
Цитата(etoja @ Apr 28 2008, 17:40) *
} T_CodeHeader __attribute__ ((packed));

__attribute__ ((__packed__));

Moderator:
Тему перенес с специально имеющийся на форуме GCC раздел.
Alex03
У меня вот так было
Код
typedef struct __attribute__ ((__packed__))
{
    BYTE    bLength;
    BYTE    bDescriptorType;
    struct  __attribute__ ((__packed__))
    {
        BYTE address   : 4;
        BYTE reserved  : 3;
        BYTE direction : 1;
    } bEndpointAddress;
    BYTE    bmAttributes;
    WORD    wMaxPacketSize;
    BYTE    bInterval;
} USB_endpoint_desc_t;

Вложенные структуры тоже приходилось явно упаковывать.

#pragma pack(...) в GCC есть, но вот для ARM архитектуры не поддерживается (или не поддерживался.)
amw
Цитата(etoja @ Apr 28 2008, 18:40) *
Rowley Crossstudio 1.4 build 5 для ARM. Вопрос по упакованным структурам.

Определяю тип структуры таким образом:
typedef struct TCodeHeader
{
u8 Code;
u8 ID;
u16 Len;
} T_CodeHeader __attribute__ ((packed));
Атрибут указывает компилятору упаковать структуру в одно 32-битное целое, как в хелпе.
Но при компиляции выдаётся warning: "packed" attribute ignored.

Вопрос: как правильно задать упакованную структуру?

Примечание: в компиляторе GreenHills MULTI нет такой проблемы, просто задаёшь опцию
#pragma pack(1)

__attribute__((packed)) нужно применять к типу а не к его экземпляру.
Код
typedef struct TCodeHeader
{
    u8        Code;
    u8        ID;
    u16        Len;                
} __attribute__ ((packed)) T_CodeHeader;
yuri_t
Пример для ARM GCC компилятора:

struct _SLIPMPAYLOAD
{
unsigned char addr;
unsigned char cmd;
unsigned char nbytes;
unsigned char dummy;
unsigned char data[256];
}__attribute__ ((__packed__));

typedef struct _SLIPMPAYLOAD SLIPMPAYLOAD;

Оператор typedef лучше использовать отдельно от определения структуры.
AHTOXA
Цитата(yuri_t @ May 4 2008, 14:51) *
Оператор typedef лучше использовать отдельно от определения структуры.


Почему?
amw
Цитата(AHTOXA @ May 4 2008, 20:04) *
Почему?

Потому, что так однозначнее (видимо smile.gif) IMHO.

Чесно говоря я typedef использую крайне редко. А пользуюсь такими определениями.
Код
struct my_str {
int x;
char y;
short z;
} __attribute__((packed));
....
struct my_str data;
...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.