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

 
 
 
Reply to this topicStart new topic
> Структуры в IAR ARM, глюк при компиляции
shrek
сообщение Jul 21 2009, 13:41
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Добрый день уважаемые форумчане :-)
Посоветуйте в одном нелегком деле...
Суть вот в чем
при компиляции структуры
Код
//---структура конфигурации-----------------------------------------------------
static const struct
     {
     //---Структура дескриптора конфигурации------------------------------------
     static const struct USB_CONFIGURATION_DESCRIPTOR
          {
          unsigned char       bLength;              //длина дескриптора
          unsigned char       bDescriptorType;      //тип дескриптора
          unsigned short int  wTotalLength;         //общий обьем данных, возвращаемых для данной конфигурации
          unsigned char       bNumInterfaces;       //кол-во интерфейсов поддерживаемых данной конфигурацией
          unsigned char       bConfigirationValue;  //идентификатор конфигурации
          unsigned char       iConfiguration;       //индекс дескриптора стороки
          unsigned char       bmAttributes;         //характеристики конфигурации
          unsigned char       MaxPower;             //код мощности, потребляемый устройством
          } USB_CONFIGURATION_DESCRIPTOR;
     //---Структура дескриптора интерфейса--------------------------------------
     static const struct USB_INTERFACE_DESCRIPTOR
          {
          unsigned char       bLength;              //Длина дескриптора
          unsigned char       bDescriptorType;      //Тип дескриптора
          unsigned char       bInterfaceNumber;     //Номер данного интерфейса
          unsigned char       bAlternateSetting;    //Альтернативный номер интерфейса
          unsigned char       bNumEndpoints;        //Число конечных точек для интерфейса без 0
          unsigned char       bInterfaceClass;      //Код класса интерфейса
          unsigned char       bInterfaceSubClass;   //Код подкласса интерфейса
          unsigned char       bInterfaceProtocol;   //Код протокола
          unsigned char       iInterface;           //Индекс дескриптора строки
          } USB_INTERFACE_DESCRIPTOR;
     } CONFIGURATION = ({0x09, 0x02, 0x0012, 0x01, 0x00, 0x00, 0x80, 0xFA},{0x09, 0x04, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00}};

компилятор между вложенными структурами вставляет нулевой байт! То есть между вроде бы 0хFA и 0х09 ничего не должно быть а однако там присутствует байт 0х00, который напроч портит всю картину!
Это есть структура конфигурации юсб устройства мне лишь требовалось чтобы винда корректно общалась с устройством на базе AT91SAM7A3 и выдало сообщение мол обнаружен юсб девайс...
а при таком косяке винда меня посылает...
Но... если же структуру немного преобразовать в вид
Код
//---структура конфигурации-----------------------------------------------------
static const struct
     {
          unsigned char       bLength;              //длина дескриптора
          unsigned char       bDescriptorType;      //тип дескриптора
          unsigned short int  wTotalLength;         //общий обьем данных, возвращаемых для данной конфигурации
          unsigned char       bNumInterfaces;       //кол-во интерфейсов поддерживаемых данной конфигурацией
          unsigned char       bConfigirationValue;  //идентификатор конфигурации
          unsigned char       iConfiguration;       //индекс дескриптора стороки
          unsigned char       bmAttributes;         //характеристики конфигурации
          unsigned char       MaxPower;             //код мощности, потребляемый устройством
          unsigned char       bLength1;              //Длина дескриптора
          unsigned char       bDescriptorType1;      //Тип дескриптора
          unsigned char       bInterfaceNumber;     //Номер данного интерфейса
          unsigned char       bAlternateSetting;    //Альтернативный номер интерфейса
          unsigned char       bNumEndpoints;        //Число конечных точек для интерфейса без 0
          unsigned char       bInterfaceClass;      //Код класса интерфейса
          unsigned char       bInterfaceSubClass;   //Код подкласса интерфейса
          unsigned char       bInterfaceProtocol;   //Код протокола
          unsigned char       iInterface;           //Индекс дескриптора строки
     } CONFIGURATION = {0x09, 0x02, 0x0012, 0x01, 0x00, 0x00, 0x80, 0xFA, 0x09, 0x04, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00};

то все отлично нулей лишних нет и винда пишет мол найдено юсб устройство и просит установить драйвера :-)
Вот посоветуйте пожалуйста как быть в этой ситуации, как более рационально все это дело упаковать? Заранее спасибо)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 21 2009, 13:49
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Это не глюк. Всё законно. Вот так можно избавиться от лишнего байта:
Код
#pragma pack (push, 1)
// описание структуры
#pragma pack(pop)

Просто по-умолчанию компилятор размещает все структуры по адресам, выравненным на слово (4 байта).


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


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


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