Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

LPC2478 USB Keil vs GCC

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    LPC2478 USB Keil vs GCC

    Teema siis järgmine, kahe compileri syntaxiga hädas, vaja GCC peal uVision kood tööle ajada.
    2 asja
    1)
    Kood:
    (BYTE *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
    usbcore.c(291): error: lvalue required as left operand of assignment

    2)
    on tehtud enne
    Keil kood:
    Kood:
     typedef __packed union _REQUEST_TYPE {
      __packed struct _BM {
        BYTE Recipient : 5;
        BYTE Type      : 2;
        BYTE Dir       : 1;
      } BM;
      BYTE B;
    } REQUEST_TYPE;
    GCC peale tehtud töötav:
    Kood:
    typedef  union _REQUEST_TYPE {
       struct _BM {
        BYTE Recipient : 5;
        BYTE Type      : 2;
        BYTE Dir       : 1;
      }__attribute__((packed)) BM;
      BYTE B;
    }__attribute__((packed)) REQUEST_TYPE;



    nyyd tegin selle järgi

    keil kood:
    Kood:
    *((__packed DWORD *)pData) = RX_DATA;
    GCC:
    Kood:
    *((__attribute__((packed))  DWORD *)pData) = RX_DATA;
    ja annab vea
    usbhw.c(355): error: 'packed' undeclared (first use in this function)

    kood mida portida tahan on


    Keil kood töötab aga mul vaja lisada sinna natuke juurde aga siis tuleb koodipiirang ette.
    põhjus selles et prose RS232 põhine asi on TATTAEGLANE ja PCB peale traatidega joodetud sest jtag ei tööta sellel mudelil.
    Modelleerimises ja tootmises kehtivad:
    1. Avariikindel vooluring lühistab kõik teised.
    2. Transistor, millel on kiiresti toimiv kaitse, säästab kaitset, sulades kõigepealt ise.

    #2
    Vs: LPC2478 USB Keil vs GCC

    1) üritad vist eritüübilisi omavahel liita ja gcc ei taha pointerile word tüüpi väärtust lisada vms on wTotalLength mingit imelikku tüüpi vms taolist

    täiendav (byte*) typecast ehk lisada nagu näiteks

    (BYTE *)pD += (BYTE *)(((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength);

    või siis mõlemad avaldise pooled typecastida liitmise ajaks long tüüpi väärtusteks, eeldusel et pD on olemuselt ikka 32-bitine väärtus

    (long)pD += (long)(((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength);


    2) gcc jaoks puudub __packed või selle analoog. pead midagi muud sinna asemele leidma.
    kuskil soovitatakse midagi sellist
    get_unaligned() and put_unaligned()

    http://lists.debian.org/debian-arm/2.../msg00027.html

    EDIT: gcc jaoks on vist __attribute__ ((__packed__)) või pagan seda teab...
    proovi lihtsalt
    *((DWORD *)pData) = RX_DATA;
    viimati muutis kasutaja dieter; 15 m 2009, 16:56.

    Comment


      #3
      Vs: LPC2478 USB Keil vs GCC

      kurdad mure ära siis laheneb jälle
      kaevandamine andis lõpuks tulemusi
      http://www.embeddedrelated.com/group...show/12824.php
      ja tundub et töötab.
      copypasten siia ka igaks juhuks lingilt, väärt kraam võib vahepeal ära kaduda.

      Erinevus et -fpack-struct ei kasutanud vaid antsin igale eraldi kaudu__attribute__((packed))

      yhes kohas texti keskel sai see ___packed lihtsalt ära kustutatud sest juhendis seda ei olnud(uuem rev)


      Kood:
      As far as I know the main problem porting keil USBMEM to gcc is the 
      __pack attribute.
      I know keil code is not that complete, but once it is up and running 
      will be easier to work in robustness.
      
      Since I don't know if there is some problem in posting the whole code, 
      i'm telling what i've changed.
      
      hopefully i did not forget any changes, but if so, ask.
          //----------------------------------------------------------------------------------------------------------
      *makefile*
      be sure that your compiler flags include:
        -fpack-struct
      
      //----------------------------------------------------------------------------------------------------------
      *diskimg.c*
      replace :
        const unsigned char DiskImage[MSC_ImageSize] __at MSC_ImageStart = {
      with:
        const unsigned char DiskImage[MSC_ImageSize] = {
      i haven't analised the MSC doe yet, but so far i thing this is harmless
      
      //----------------------------------------------------------------------------------------------------------
      *usbhw.h*
      add this line:
          #define __irq __attribute__((interrupt))
      
      //----------------------------------------------------------------------------------------------------------
      *mscuser.c
      *replace:
        BYTE  Memory[MSC_MemorySize] __at MSC_MemoryStart;   // MSC RAM
      with:
        BYTE  Memory[MSC_MemorySize];   // MSC RAM
      *
      *//----------------------------------------------------------------------------------------------------------
      *usbcore.c*
      replace:
        (BYTE *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
      with:
        pD = (USB_COMMON_DESCRIPTOR*)(((BYTE *)pD) + 
      ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength);
      and
      replace:
        (BYTE *)pD += pD->bLength;
      with:
        pD = (USB_COMMON_DESCRIPTOR*)(((BYTE *)pD) + pD->bLength);
      both appears twice in the file
      I'm in this point now, but i think this generates good code.
      
      //----------------------------------------------------------------------------------------------------------
      *usbhw.c*
      replace:
        *((__packed DWORD *)pData) = RX_DATA;
        pData += 4;
      with:
            DWORD w;
            w = RX_DATA;
            *pData++ = (w    )&0xff;
            *pData++ = (w>>8 )&0xff;
            *pData++ = (w>>16)&0xff;
            *pData++ = (w>>24)&0xff;
      and
      replace:
        TX_DATA = *((__packed DWORD *)pData);
        pData += 4;
      with:
            DWORD x;
            x  =  (*pData++);
            x  |= (*pData++)<<8;
            x  |= (*pData++)<<16;
            x  |= (*pData++)<<24;
            TX_DATA = x;
      
      //----------------------------------------------------------------------------------------------------------
      *usbuser.c*
      replace:
         #define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)
      with:
         #define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? (void*)USB_EndPoint##n 
      : NULL)
      and
      replace:
         const void (* USB_P_EP[16]) (DWORD event)=
      with:
         const void (* const USB_P_EP[16]) (DWORD event)=
      
      //----------------------------------------------------------------------------------------------------------
      *usbuser.h*
      replace:
         extern const void (* USB_P_EP[16]) (DWORD event)=
      with:
         extern const void (* const USB_P_EP[16]) (DWORD event)=
      Modelleerimises ja tootmises kehtivad:
      1. Avariikindel vooluring lühistab kõik teised.
      2. Transistor, millel on kiiresti toimiv kaitse, säästab kaitset, sulades kõigepealt ise.

      Comment


        #4
        Vs: LPC2478 USB Keil vs GCC

        Lisan veel yhe startup faili,
        seekord fixitud SDRAM config osa, lisatud io pinnide funktsioonide confimised.
        Viimasest puudu veel pullup aga see lihtsam kui spekist kaevandada IO-pinnide konstante ja lihtsam dev käigus neid modida.
        USB lib ka töötab GCC-ga.
        Siin mikropiirang failidel seega siia lisada ei saa. Kes aga tahab küsigu, pistan meili kogu näite projekti kus USB põhine SDRAM-i silmuleeritud ketas.
        Lisatud failid
        Modelleerimises ja tootmises kehtivad:
        1. Avariikindel vooluring lühistab kõik teised.
        2. Transistor, millel on kiiresti toimiv kaitse, säästab kaitset, sulades kõigepealt ise.

        Comment

        Working...
        X