Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32F107][Keil C] Niepowodzenie przy kompilacji przykładu

kowales 10 Wrz 2010 22:09 2421 4
  • #1 10 Wrz 2010 22:09
    kowales
    Poziom 11  

    Witam, posiadam płytę uruchomieniową STM32F107 ARM-CM3 Board. Do zestawu dołączono płytę CD z między innymi przykładem obsługi ethernetu. Próbuję skompilować ten projekt w środowisku Keil, ale pojawiają mi się dwa błędy, szczerze mówiąc, nie mam pomysłu jak obejść ten problem.

    Code:

    void uIPMain(void)
    {
      u8_t i, arptimer;
      uip_eth_hdr *BUF = (uip_eth_hdr*)uip_buf;

    typedef unsigned short     int uint16_t;
    typedef uint16_t u16_t;
    typedef u16_t uip_ip4addr_t[2];
    typedef uip_ip4addr_t uip_ipaddr_t;


      uip_ipaddr_t ipaddr;   /* local IP address */

      u32 size;
      /* Initialize the uIP TCP/IP stack. */
      uip_init();

        uip_ipaddr(ipaddr, 192,168,0,81); //TU JEST BŁĄD
        uip_sethostaddr(ipaddr);   /* host IP address */ //TU JEST BŁĄD
    //   uip_ipaddr(ipaddr, 192,168,1,103);
    //   uip_setdraddr(ipaddr);   /* router IP address */
    //   uip_ipaddr(ipaddr, 255,255,255,0);
    //   uip_setnetmask(ipaddr);   /* mask */

      /* Initialize the HTTP server. */
      httpd_init();


    Wyrzucany błąd to :
    Cytat:
    ..\..\..\Utilities\uip\uIPMain.c(80): error: #137: expression must be a modifiable lvalue


    Jeśli ma ktoś jakiś pomysł, byłbym wdzięczny za podpowiedź.

    Pozdrawiam
    Piotrek

  • #2 11 Wrz 2010 16:10
    arrevalk
    Poziom 25  

    Do funkcji uip_ipaddr() oraz uip_sethostaddr() pierwszy parametr powinien być przekazywany jako wskaźnik, czyli:

    Code:

     uip_ipaddr_t addr;

     uip_ipaddr(&addr, 192,168,1,2);
     uip_sethostaddr(&addr);

    Oczywiście zakładając że korzystasz ze stosu uIP a nie czegoś co podobnie nazywa funkcje. Źródło

  • #3 11 Wrz 2010 21:05
    kowales
    Poziom 11  

    arrevalk napisał:
    Do funkcji uip_ipaddr() oraz uip_sethostaddr() pierwszy parametr powinien być przekazywany jako wskaźnik, czyli:
    Code:

     uip_ipaddr_t addr;

     uip_ipaddr(&addr, 192,168,1,2);
     uip_sethostaddr(&addr);

    Oczywiście zakładając że korzystasz ze stosu uIP a nie czegoś co podobnie nazywa funkcje


    Sprawdzałem już to wcześniej, po przekazaniu tego parametru jako wskaźnik, wyrzuca mi dwa dodatkowe błędy, tak więc w każdej z linii mam teraz po dwa błędy.

    Cytat:

    ..\..\..\Utilities\uip\uIPMain.c(79): error: #137: expression must be a modifiable lvalue
    ..\..\..\Utilities\uip\uIPMain.c(79): error: #137: expression must be a modifiable lvalue
    ..\..\..\Utilities\uip\uIPMain.c(80): error: #137: expression must be a modifiable lvalue
    ..\..\..\Utilities\uip\uIPMain.c(80): error: #137: expression must be a modifiable lvalue


    Funkcja uip_ipaddr() jest trochę inaczej zdefiniowana, ta wersja w źródle umieszczonym przez arrevalk jest zakomentowana

    Code:

    #define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \
                         (addr)[0] = HTONS(((addr0) << 8) | (addr1)); \
                         (addr)[1] = HTONS(((addr2) << 8) | (addr3)); \
                      } while(0)


    Funkcję uip_sethostaddr() mam zdefiniowaną jako
    Code:

    #define uip_sethostaddr(addr) do { uip_hostaddr[0] = addr[0]; \
                                  uip_hostaddr[1] = addr[1]; } while(0)


    Może jeszcze jakaś sugestia ?

  • Pomocny post
    #4 12 Wrz 2010 13:03
    arrevalk
    Poziom 25  

    Zrobiłem mały tescik na PC:

    Code:
    #include <stdlib.h>
    
    #include <stdio.h>
    #include <stdint.h>

    #define UIP_BIG_ENDIAN 0
    #define UIP_LITTLE_ENDIAN 1
    #define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN

    #ifndef HTONS
    #   if UIP_BYTE_ORDER == UIP_BIG_ENDIAN
    #      define HTONS(n) (n)
    #   else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
    #      define HTONS(n) (uint16_t)((((uint16_t) (n)) << 8) | (((uint16_t) (n)) >> 8))
    #   endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
    #else
    #error "HTONS already defined!"
    #endif /* HTONS */

    typedef union uip_ip4addr_t {
       uint8_t  u8[4];                  /* Initializer, must come first!!! */
       uint16_t u16[2];
    #if 0
       uint32_t u32;
    #endif
    } uip_ip4addr_t;

    typedef uip_ip4addr_t uip_ipaddr_t;

    #define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \
                         (addr)[0] = HTONS(((addr0) << 8) | (addr1)); \
                         (addr)[1] = HTONS(((addr2) << 8) | (addr3)); \
                      } while(0)

    int main(void){
       uip_ipaddr_t adres;
       uip_ipaddr(adres.u16, 192,168,0,1);

       printf("IP: %d.%d.%d.%d\n", adres.u8[0],adres.u8[1],adres.u8[2],adres.u8[3]);
       return 0;
    }

    I taki kod działa. W skrócie do makra uip_ipaddr() jako pierwszy parametr musisz przekazac adres.u16.

  • #5 13 Wrz 2010 21:09
    kowales
    Poziom 11  

    Witam,
    bardzo dziękuję koledze Arrevalk, modyfikacja struktury danych pomogła w uruchomieniu przykładu.

    Dla potomności, po modyfikacji sugerowanej przez Arrevalka błędy pojawiały się już tylko w drugiej linijce, przy wywołaniu funkcji uip_sethostaddr(ipaddr);

    Aby pozbyć się tego błędu zmodyfikowałem definicję tej funkcji w pliku uip.h.

    Było

    Code:
    #define uip_sethostaddr(addr) do { uip_hostaddr[0] = addr[0]; \
    
                                  uip_hostaddr[1] = addr[1]; } while(0)


    Jest
    Code:
    #define uip_sethostaddr(uip_ipaddr_t) do { uip_hostaddr[0] = uip_ipaddr_t.u16[0]; \
    
                                  uip_hostaddr[1] = uip_ipaddr_t.u16[1]; } while(0)


    Pozdrawiam

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME