logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

FreeRTOS + LwIP, STM32 - Kompilacja - undefinied reference to 'tcp_timer_ needed

byrrt 28 Lis 2012 10:37 1884 2
REKLAMA
  • #1 11584185
    byrrt
    Poziom 21  
    Posty: 726
    Pomógł: 2
    Ocena: 833
    Zwracam się do kolegów z taką sprawą. Nie mogę sobie poradzić z bezproblemowym uruchomieniem FreeRTOS + lwip na STM32. Przy kompilacji wywala mi:

    out/tcp.o: In function `tcp_close_shutdown':
    C:\ARM\Workspace\test/lwip/src/core/tcp.c:164: undefined reference to `tcp_timer_needed'
    out/tcp.o: In function `tcp_bind':
    C:\ARM\Workspace\test/lwip/src/core/tcp.c:453: undefined reference to `tcp_timer_needed'
    out/tcp.o: In function `tcp_listen_with_backlog':
    C:\ARM\Workspace\test/lwip/src/core/tcp.c:537: undefined reference to `tcp_timer_needed'
    out/tcp_in.o: In function `tcp_listen_input':
    C:\ARM\Workspace\test/lwip/src/core/tcp_in.c:495: undefined reference to `tcp_timer_needed'
    out/tcp_in.o: In function `tcp_process':
    C:\ARM\Workspace\test/lwip/src/core/tcp_in.c:746: undefined reference to `tcp_timer_needed'
    out/tcp_in.o:C:\ARM\Workspace\test/lwip/src/core/tcp_in.c:763: more undefined references to `tcp_timer_needed' follow
    out/tcpip.o: In function `tcpip_thread':
    C:\ARM\Workspace\test/lwip/src/api/tcpip.c:88: undefined reference to `sys_timeouts_mbox_fetch'
    C:\ARM\Workspace\test/lwip/src/api/tcpip.c:129: undefined reference to `sys_timeout'
    C:\ARM\Workspace\test/lwip/src/api/tcpip.c:134: undefined reference to `sys_untimeout'


    Definicja tcp_timer_needed() jest w pliku tcp_impl.h, żródła w timers.c. Plik tcp_impl.h zaincludowany w tcp.c z resztą tu nic nie zmieniałem.

    Po dopisaniu #include "lwip/timers.c" program się kompiluje owszem i wszystko działa ale mam potem problem z kompilacją gdy chce dodać liczniki softowe pod freertos a to za sprawą includeowania pliku timers.h.

    W internecie znalazłem info, że może być to spowodowane ustawieniami NO_SYS (u mnie = 0 bo używam pod LwIP).

    Koleją sprawą jest to że edytor Eclipse z którego korzystam często np. zaciemnia obszary zaznaczone jako #ifdef mimo, że zmienna jest zdefiniowana a plik z definicją zaincludowany. Obszary te są kompilowane - chodzi tylko o to, że edytor tego nie widzi. W Makefile mam wszystkie foldery INC i SRC wypisane, projekt się kompiluje (za wyjątkiem problemu opisanego u góry).

    Czy ktoś (Freddie? :D) mógłby mi pomóc? :)
  • REKLAMA
  • Pomocny post
    #2 11584297
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    byrrt napisał:
    Definicja tcp_timer_needed() jest w pliku tcp_impl.h, żródła w timers.c. Plik tcp_impl.h zaincludowany w tcp.c z resztą tu nic nie zmieniałem.

    Po dopisaniu #include "lwip/timers.c" program się kompiluje owszem i wszystko działa ale mam potem problem z kompilacją gdy chce dodać liczniki softowe pod freertos a to za sprawą includeowania pliku timers.h.

    W internecie znalazłem info, że może być to spowodowane ustawieniami NO_SYS (u mnie = 0 bo używam pod LwIP).

    No jak dla mnie to opcja jest tylko jedna - plik w którym faktycznie są te funkcje (timers.c) nie jest kompilowany. Zrób "make clean" i sprawdź czy faktycznie w konsoli zobaczysz kompilację tego pliku.

    EDIT: zignoruj to co napisałem powyżej... Problem jest spowodowany tym, że masz w drzewie projektu dwa pliki o tej samej nazwie, tyle że w różnych folderach. Problem jest tego typu, że mój Makefile nie obsługuje takiej sytuacji, bo wszystkie pliki obiektowe są skompilowane do jednego folderu i wtedy timers.o z FreeRTOSa zastępuje Ci timers.o z LwIP. Najprostsze rozwiązanie tego problemu to zmiana nazwy tego pliku na coś unikalnego, np lwip_timers.c (+ obowiązkowy "make clean") i po problemie... Rozwiązanie "uniwersalne" jest niestety dosyć skomplikowane, można by w miarę prosto przerobić Makefile tak aby generował pliki obiektowe w folderach ze źródłami, ale to robi niezły śmietnik w projekcie...

    byrrt napisał:
    Koleją sprawą jest to że edytor Eclipse z którego korzystam często np. zaciemnia obszary zaznaczone jako #ifdef mimo, że zmienna jest zdefiniowana a plik z definicją zaincludowany. Obszary te są kompilowane - chodzi tylko o to, że edytor tego nie widzi. W Makefile mam wszystkie foldery INC i SRC wypisane, projekt się kompiluje (za wyjątkiem problemu opisanego u góry).

    Wszystkiemu "winien" jest tzw. indexer. Pierwszą sprawą jest poprawne skonfigurowanie go - są dwie opcje:
    1. po staremu, czyli tzw. "Discovery options"
    2. po nowemu (od Juno), czyli tzw. "Preprocessor Include Paths, Macros etc."
    "Po staremu" skonfigurowane jest w nowych przykładach ze strony, po nowemu jeszcze nie - jak wolisz tą drugą opcję to moge napisać co poklikać.

    Jak już indexer jest skonfigorowany, to czasem Eclipse nie zauważa że coś się zmieniło (generalnie w przypadkach typu edycja jakiegoś parametru w plikach nagłówkowych, modyfikacja parametrów kompilacji itp. "duże" zmiany) - czasem chwila mu zejdzie zanim "załapie" że coś się stało. Najprostszą opcją jest po prostu kliknąć prawym klawiszem na projekt, wybrać Index > Rebuild. Po tym jak operacja się skończy (a może chwilę potrwać -> patrz prawy dolny róg okna), warto zmienić zakładkę z kodem na jakąś inną i potem wrócić (wydaje się, że czasem Indexer działa w momencie "wyświetlania" okna, za to nic nie dzieje się gdy już jest ono pokazane) i powinno już być OK. W bardziej zakręconych przypadkach (np. definicje biorą się z opcji kompilacji, czyli flaga "-D" lub tym podobne rzeczy), warto pokombinować nieco bardziej - tutaj opisane są kroki które pomagają w 99% przypadków:
    http://www.freddiechopin.info/pl/artykuly/35-...tm32f10x-standard-peripherals-library?start=4
    (dół strony)

    byrrt napisał:
    Czy ktoś (Freddie? ) mógłby mi pomóc?

    At your service (;

    Daj znać jak wyszło.

    4\/3!!
  • #3 11584507
    byrrt
    Poziom 21  
    Posty: 726
    Pomógł: 2
    Ocena: 833
    Freddie Chopin napisał:
    zignoruj to co napisałem powyżej... Problem jest spowodowany tym, że masz w drzewie projektu dwa pliki o tej samej nazwie

    Tak są a raczej były 2 pliki o tej samej nazwie, wiedziałem nawet o tym ale jakoś nie skojarzyłem problemu.. Po zmianie nazwy pliku jest spokój - kompiluje się..

    Ok, ale jeżeli chodzi o zaznaczanie obszarów na szaro to po operacjach opisanych na Twojej stronie jest lepiej ale nadal nie do końca.. Wywala np. błędy o braku definicji dla jakiś zmiennych które są zaincludowane. Raz wyświetla unresolved a czasem łapie.. Tak jakoś dziwnie to działa. Ważne, że kompiluje - tyle jeszcze zniosę ;)

    Jeszcze raz dzięki Freddie - jak zwykle pomagasz ;)
REKLAMA