Strona 1 z 1

[PIC18]Inicjalizacja unii

: poniedziałek 19 paź 2015, 21:58
autor: Antystatyczny
Witam, chciałbym przedstawić typowo językowy problem, na który natrafiłem niedawno podczas pisania stosu USB.

Tworzę unię, w której umieszczam strukturę oraz tablicę jednowymiarową, która ma mi umożliwić łatwy dostęp do unii podczas kopiowania jej do endpointa 0 (USB)

Kod: Zaznacz cały

typedef union
    {
        struct
        {
            uint8_t bLength;
            uint8_t bDescriptorType;
            uint8_t bcdUSBL;
            uint8_t bcdUSBH;
            uint8_t bDeviceClass;
            uint8_t bDeviceSubClass;
            uint8_t bDeviceProtocol;
            uint8_t bMaxPacketSize;
            uint8_t idVendorL;
            uint8_t idVendorH;
            uint8_t idProductL;
            uint8_t idProductH;
            uint8_t bcdDeviceL;
            uint8_t bcdDeviceH;
            uint8_t iManufacturer;
            uint8_t iProduct;
            uint8_t iSerialNumber;
            uint8_t bNumConfigurations;
        };
       
        uint8_t DescBuffer[18];
    }DeviceDescriptorType;


Oprócz tego typu złożonego posiadam zestaw makr, którymi chcę zainicjalizować zmienną const.

Kod: Zaznacz cały

    //device descriptor macros
#define USB_DEV_DESCRIPTOR_TYPE 0x01    //device
#define USB_DEV_BCDUSB_L        0x00    //USB 2.0
#define USB_DEV_BCDUSB_H        0x20
#define USB_DEV_CLASS           0xFF    //vendor defined?
#define USB_DEV_SUBCLASS        0x00
#define USB_DEV_PROTOCOL        0x00
#define USB_DEV_PACKET_SIZE     0x40
#define USB_DEV_VENDOR_ID_L     0xC1    //VID 0x17C1
#define USB_DEV_VENDOR_ID_H     0x17
#define USB_DEV_DEVICE_ID_L     0xFF    //PID 0x06FF
#define USB_DEV_DEVICE_ID_H     0x06
#define USB_DEV_BCDDEVICE_L     0x00
#define USB_DEV_BCDDEVICE_H     0x01
#define USB_DEV_MANUFACTURER    0x00
#define USB_DEV_PRODUCT         0x00
#define USB_DEV_SER_NUMBER      0x00
#define USB_DEV_NUM_CONFIG      0x01



Następnie deklaruję zmienną typu DeviceDescriptorType i od razu chcę ją zainicjalizować:

Kod: Zaznacz cały

const DeviceDescriptorType  devDesc[18] =        //active device descriptor
{
    18,               //sizeof(DeviceDescriptorType)
    USB_DEV_DESCRIPTOR_TYPE,
    USB_DEV_BCDUSB_L,
    USB_DEV_BCDUSB_H,
    USB_DEV_CLASS,
    USB_DEV_SUBCLASS,
    USB_DEV_PROTOCOL,
    USB_DEV_PACKET_SIZE,
    USB_DEV_VENDOR_ID_L,
    USB_DEV_VENDOR_ID_H,
    USB_DEV_DEVICE_ID_L,
    USB_DEV_DEVICE_ID_H,
    USB_DEV_BCDDEVICE_L,
    USB_DEV_BCDDEVICE_H,
    USB_DEV_MANUFACTURER,
    USB_DEV_PRODUCT,
    USB_DEV_SER_NUMBER,
    USB_DEV_NUM_CONFIG
};


Niestety kompilator wypisuje błąd:
usb_stack/usb.c:11: error: (207) simple type required for "@" <----- ten błąd jest wynikiem poniższego i to nie kłopot dla mnie
usb_stack/usb.c:11: error: (182) illegal conversion between types unsigned int -> struct S594 <--- Nie bardzo rozumiem, gdzie popełniam błąd podczas inicjalizacji.

Ostatecznie zrobiłem tablicę jednowymiarową i zainicjalizowałem ją makrami...jak sugerował PROTON, ale nie daje mi spokoju brak umiejętności użycia unii

Re: [PIC18]Inicjalizacja unii

: poniedziałek 19 paź 2015, 23:04
autor: PROTON

Kod: Zaznacz cały

struct DeviceDescriptorType
{
            uint8_t bLength;
            uint8_t bDescriptorType;
            uint8_t bcdUSBL;
            uint8_t bcdUSBH;
            uint8_t bDeviceClass;
            uint8_t bDeviceSubClass;
            uint8_t bDeviceProtocol;
            uint8_t bMaxPacketSize;
            uint8_t idVendorL;
            uint8_t idVendorH;
            uint8_t idProductL;
            uint8_t idProductH;
            uint8_t bcdDeviceL;
            uint8_t bcdDeviceH;
            uint8_t iManufacturer;
            uint8_t iProduct;
            uint8_t iSerialNumber;
            uint8_t bNumConfigurations;
};




tworzysz instancje struktury:

struct DeviceDescriptorType ddescriptor;

i jak chcesz użyć jak tablicy uinit8_t to robisz tak:

(uint8_t*)&ddescriptor

Re: [PIC18]Inicjalizacja unii

: poniedziałek 19 paź 2015, 23:11
autor: Antystatyczny
Ok, rozumiem sposób z jawnym rzutowaniem. Powrócę jednak do pierwotnego pytania: Co wykonałem źle podczas tworzenia oraz inicjalizacji unii?

Re: [PIC18]Inicjalizacja unii

: poniedziałek 19 paź 2015, 23:21
autor: Antystatyczny
Jeśli zdefiniuję unię w taki sposób, to program kompiluje się bez błędu:

Kod: Zaznacz cały

typedef union
    {
        uint8_t DescBuffer[18];
        struct
        {
            uint8_t bLength;
            uint8_t bDescriptorType;
            uint8_t bcdUSBL;
            uint8_t bcdUSBH;
            uint8_t bDeviceClass;
            uint8_t bDeviceSubClass;
            uint8_t bDeviceProtocol;
            uint8_t bMaxPacketSize;
            uint8_t idVendorL;
            uint8_t idVendorH;
            uint8_t idProductL;
            uint8_t idProductH;
            uint8_t bcdDeviceL;
            uint8_t bcdDeviceH;
            uint8_t iManufacturer;
            uint8_t iProduct;
            uint8_t iSerialNumber;
            uint8_t bNumConfigurations;
        };
    }DeviceDescriptorType;