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

 
 
> RealView Compiler не слушается квалификатора __packed, и вставляет padding byte...
sonycman
сообщение Jun 24 2009, 16:18
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Компилятор RealView 4.0.0.524 из пакета MDK3.70. C++.

Что-то не слушается меня компилер, то ли я не так пишу, то ли багу нашёл.
Исходник:
Код
#define USB_STRING_DESCRIPTOR_TYPE             3
#define    MANUF_STRING    L"Sonycman Production"
#define    PROD_STRING        L"Sonycman Mass Storage Drive"
#define    SERIAL_STRING    L"123456789ABC"

typedef __packed struct
{
    byte    length;
    byte    descriptor_type;
    word    languageID;
} USB_STRING_ID_DESCRIPTOR;

typedef __packed struct
{
    byte    length;
    byte    descriptor_type;
    wchar_t    text[sizeof(MANUF_STRING)/2];
} USB_STRING1_DESCRIPTOR;

typedef __packed struct
{
    byte    length;
    byte    descriptor_type;
    wchar_t    text[sizeof(PROD_STRING)/2];
} USB_STRING2_DESCRIPTOR;

typedef __packed struct
{
    byte    length;
    byte    descriptor_type;
    wchar_t    text[sizeof(SERIAL_STRING)/2];
} USB_STRING3_DESCRIPTOR;

typedef __packed struct
{
    USB_STRING_ID_DESCRIPTOR    s0;
    USB_STRING1_DESCRIPTOR        s1;
    USB_STRING2_DESCRIPTOR        s2;
    USB_STRING3_DESCRIPTOR        s3;
} USB_STRING_DESCRIPTOR;

и инициализация:
Код
const    USB_STRING_DESCRIPTOR    CUSB::strings = {
    sizeof(USB_STRING_ID_DESCRIPTOR),
    USB_STRING_DESCRIPTOR_TYPE,
    0x409,                                //language ID
    sizeof(USB_STRING1_DESCRIPTOR),
    USB_STRING_DESCRIPTOR_TYPE,
    MANUF_STRING,
    sizeof(USB_STRING2_DESCRIPTOR),
    USB_STRING_DESCRIPTOR_TYPE,
    PROD_STRING,
    sizeof(USB_STRING3_DESCRIPTOR),
    USB_STRING_DESCRIPTOR_TYPE,
    SERIAL_STRING
};


Так вот, члену strings присваиваются такие данные:
0x080046f9: 04 03 09 04 2a 03 00 53 00 6f 00 6e 00...
Но откуда взялся в запакованной структуре явно пэддинг байт (выделен жирным)?!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Jun 24 2009, 18:09
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(sonycman @ Jun 24 2009, 19:18) *
0x080046f9: 04 03 09 04 2a 03 00 53 00 6f 00 6e 00...
Но откуда взялся в запакованной структуре явно пэддинг байт (выделен жирным)?!

Оттуда же откуда и следующий за ним 0 и все остальные 0 через 1 - из wchar_t.
__packed вообще-то прекрасно работает в RVDS'е.

padd здесь ни один компилятор не вставит. Сами подумайте тип wchar - 2 байта.
Какого лешего его размещать с нечетного адреса? А в вашем примере если допустить что выделенный 00 это padd байт, то wchar располагается как раз по нечетному смещению "0x7".
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 24 2009, 18:21
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(defunct @ Jun 24 2009, 22:09) *
Оттуда же откуда и следующий за ним 0 и все остальные 0 через 1 - из wchar_t.
__packed вообще-то прекрасно работает в RVDS'е.

padd здесь ни один компилятор не вставит. Сами подумайте тип wchar - 2 байта.
Какого лешего его размещать с нечетного адреса? А в вашем примере если допустить что выделенный 00 это padd байт, то wchar располагается как раз по нечетному смещению "0x7".

Ноль должен идти уже после 0х53, но никак не до!
В пакованной структуре wchar_t может начинаться с нечётного адреса - на то она и запакованная!
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 24 2009, 18:31
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(sonycman @ Jun 24 2009, 21:21) *
Ноль должен идти уже после 0х53, но никак не до!

Ну так переверните его и посмотрите что получится.
swap16( ...->s1.text[ 0 ] );
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 24 2009, 18:32
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 24 2009, 22:31) *
Ну так переверните его и посмотрите что получится.
swap16( ...->s1.text[ 0 ] );

Напишите +2 по результатам отладки, ага.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sonycman   RealView Compiler не слушается квалификатора __packed   Jun 24 2009, 16:18
- - forever failure   wchar_t text[sizeof(MANUF_STRING)/2]; /*<-- ...   Jun 24 2009, 16:41
- - zltigo   А попробуйте простую кондовую #pragma pack(1) вме...   Jun 24 2009, 16:43
|- - sonycman   Цитата(forever failure @ Jun 24 2009, 20...   Jun 24 2009, 16:47
|- - zltigo   Цитата(sonycman @ Jun 24 2009, 19:47) А э...   Jun 24 2009, 17:14
|- - aaarrr   Цитата(defunct @ Jun 24 2009, 22:09) Отту...   Jun 24 2009, 18:18
|- - defunct   Цитата(sonycman @ Jun 24 2009, 21:21) Нол...   Jun 24 2009, 18:26
|- - defunct   Цитата(aaarrr @ Jun 24 2009, 21:32) Напиш...   Jun 24 2009, 18:34
- - aaarrr   sonycman: а данные структуры где смотрите? Цитата...   Jun 24 2009, 18:28
|- - sonycman   Цитата(defunct @ Jun 24 2009, 22:26) може...   Jun 24 2009, 20:42
|- - defunct   Цитата(sonycman @ Jun 24 2009, 23:42) Вес...   Jun 24 2009, 20:53
- - aaarrr   Цитата(sonycman @ Jun 24 2009, 20:18) Ком...   Jun 24 2009, 18:42
- - sonycman   Пока что попробовал новый проект в простом Си - вс...   Jun 24 2009, 20:59
- - aaarrr   Цитата(sonycman @ Jun 25 2009, 00:59) Есл...   Jun 24 2009, 21:17


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:08
Рейтинг@Mail.ru


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