[PIC18]Inicjalizacja unii

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

[PIC18]Inicjalizacja unii

Postautor: Antystatyczny » poniedziałek 19 paź 2015, 21:58

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
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [PIC18]Inicjalizacja unii

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

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
Gott weiß ich will kein Engel sein.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [PIC18]Inicjalizacja unii

Postautor: Antystatyczny » poniedziałek 19 paź 2015, 23:11

Ok, rozumiem sposób z jawnym rzutowaniem. Powrócę jednak do pierwotnego pytania: Co wykonałem źle podczas tworzenia oraz inicjalizacji unii?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [PIC18]Inicjalizacja unii

Postautor: Antystatyczny » poniedziałek 19 paź 2015, 23:21

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;
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.


Wróć do „Pisanie programów w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość