Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32F4 Discovery - Lwip + FreeRTOS

swichu91 10 Lis 2014 19:58 2589 16
  • #1 10 Lis 2014 19:58
    swichu91
    Poziom 9  

    Witam,

    od jakiegoś czasu walczę z uruchomieniem stosu wraz z obsługą FreeRTOSa niestety bezskutecznie. Procesor zaraz po odebraniu ramki ląduje w HardFault handler. W sieci znalazłem dosyć sporo przykładów projektów opartych na tym stosie choćby przykład z książki Pana Peczarskiego , niestety większość z nich to projekty standalone bez OS. Może ktoś jest w posiadaniu gotowego projektu wraz z plikami sys_arch.c i cc.h przystosowanymi do obsługi OS, który działa albo ma doświadczenie w portowaniu lwip na cortexa m4 ?

    Byłbym bardzo wdzięczny za pomoc.

    0 16
  • #2 11 Lis 2014 09:29
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Osobiście używałem jako bazy tego projektu - http://www.freertos.org/Interactive_Frames/Op...34878-freertos-featured-project-for-lpcxpress - nie jest przeznaczony dla STM32, ale pliki o które pytasz i tak nie są specyficzne dla konkretnego modelu mikrokontrolera.

    4\/3!!

    0
  • #3 13 Lis 2014 12:01
    IS
    Poziom 16  

    Masz przecież przykład od ST: STSW-STM32070. W paczce jest wersja dla FreeRTOS i bez.

    0
  • #4 31 Sty 2015 16:43
    swichu91
    Poziom 9  

    Bazowałem właśnie na tym samplu tworząc swój projekt. Z racji braku czasu dopiero teraz powróciłem do tego tematu. Doszedłem do przyczyny lądowania procesora w Hard Fault, otóż w pliku ethernetif.c zdefiniowałem globalny wskaźnik do struktury netif i widzę, że zaraz po inicjalizacji stosu dane z pod tego adresu ulegają uszkodzeniu. Następnie funkcja ethernetif_input po wystawieniu semafora w przerwaniu od MAC stara się pobrać dane za pomocą tego wskaźnika co powoduje Hard Fault.

    Nie mam pojęcia co może być przyczyną uszkadzania danych z pod tego adresu w pamięci. FreeRTOS bez uruchomionego stosu działa poprawnie, walczę z tym już od dłuższego czasu i szczerze mówiąc skończyły mi się już pomysły. Poniżej zamieszczam link do mojego projektu na Gicie, bardzo prosiłbym o pomoc a w szczególności o sprawdzenie ustawień w pliku lwipopts.h Nie jestem pewien poprawności ustawienia priorytetów dla tcpip_thread jak i wątku odbiorczego danych. Na tą chwilę wynoszą one TCPIP_THREAD_PRIO = 5 a dla tasku odbiorczego = 3. Priorytet przerwania MAC wynosi 9.

    https://github.com/swichu91/stm32_rtos_lwip

    Byłbym bardzo wdzięczny za wszelkie wskazówki i pomoc.

    0
  • #6 31 Sty 2015 20:54
    tplewa
    Poziom 37  

    KeinXor napisał:
    Zapoznaj się ze stosem CycloneTCP http://www.oryx-embedded.com/cyclone_tcp.html


    Dobry pomysl - musze przyznac ze bardzo fajny stos... w wersji darmowej pelna funkcjonalnosc. Maly minus to niestety brak dokumentacji, ale jest bardzo ladnie napisany wiec analiza nie stanowi wiekszego problemu.

    Natomiast co do lwIP to tez opieralem sie o ktorys przyklad zawarty w paczce FreeRTOS-a i nie bylo wiekszych problemow. Choc sama specyfika czy to uIP czy lwIP jest to ze niestety sporo czasami trzeba przerobic aby dostosowac do wlasnego rozwiazania. Jak dla mnie te dwa ostatnie stosy to taki proof of concept, a nie gotowy produkt...

    0
  • #7 01 Lut 2015 08:22
    swichu91
    Poziom 9  

    A czy ktoś z was korzystał może ze stosu FreeRTOS+TCP ? Wydaje się być ciekawym rozwiązaniem no i jest znacznie lepiej udokumentowany.

    0
  • #8 01 Lut 2015 12:28
    tplewa
    Poziom 37  

    swichu91 napisał:
    A czy ktoś z was korzystał może ze stosu FreeRTOS+TCP ? Wydaje się być ciekawym rozwiązaniem no i jest znacznie lepiej udokumentowany.


    Niestety nie, mialem sie za to zabrac ale jakos brak czasu na napisanie drivera do eth... Jak masz czas i checi mozesz sie pobawic i zdac relacje ;)

    Bawilem sie tylko zmodyfikowana wersja uIP (FreeTCPIP) - prawde mowiac pisza na stronie FreeRTOS-a ze to poprawiony uIP (http://www.freertos.org/embeddedtcp.html)... ale jakis roznic nie odczulem w stosunku do oryginalu.

    0
  • #9 06 Mar 2018 09:27
    kuczy
    Poziom 10  

    Nie chciałem zakładać nowego tematu bo wiem z doświadczenia, że jest to męczące dla zaawansowanych użytkowników i sprawia problemy w późniejszym szukaniu.

    Otóż.
    Posiadana przeze mnie płytka to nie Discovery, ale Nucleo F429ZI.
    niestety jestem początkujący ;( a za zadanie dostałem opracowanie połączenia LAN za pomocą socketów w układzie kompuer PC <-> Nucleo.
    to, co mam na razie:

    - Nucleo skonfigurowane z CubeMX - włączony FreeRTOS, LwIP (IP pobierane dynamicznie). Program piszę w System Workbench for STM32 (Eclipse)
    - po podłączeniu do routera płytka uzyskuje swoje IP - tu luzik.

    Korzystając z netconn API znalazłem fajny kod, który jest prosty i działa:
    - otóż - w głównym (jedynym) wątku RTOSa uruchamiam: EchoTCP();
    kod tej funkcji poniżej:

    Code:
    /* USER CODE BEGIN 4 */
    

    void EchoTCP(void)
    {
         struct netconn *connection, *newconnection;
         err_t err, accept_err;
         struct netbuf* buffer;
         void* data;
         u16_t len;
         err_t recv_err;

         //Makro tworzące nową strukturę oraz inicjalizujęce ją nowymi wartościami.
         connection = netconn_new(NETCONN_TCP);

         if(connection != NULL)
         {
            err = netconn_bind(connection, NULL, 80);   //Przypisz połączenie do portu 80
            if(err ==ERR_OK)
            {
               netconn_listen(connection);         //Połączenie zamienione na tryb słuchania
               while(1)
               {
                  //Funkcja oczekujące na połączenia od klienta
                  accept_err = netconn_accept(connection, &newconnection);

                  //Obsługa połączenia
                  if (accept_err == ERR_OK)
                  {
                     HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
                     while((recv_err = netconn_recv(newconnection, &buffer)) == ERR_OK)
                     {
                        do




                        {
                           netbuf_data(buffer, &data, &len);
                           netconn_write(newconnection, data, len, NETCONN_COPY);
                           HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
                        }
                        while (netbuf_next(buffer) >= 0);
                        netbuf_delete(buffer);
                     }
                     //Zamknij połączenie
                     netconn_close(newconnection);
                     netconn_delete(newconnection);
                  }
               }
            }
            else{netconn_delete(newconnection);} //Nie udało się nawiązac polaczenia
            HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
         }
    }
    /* USER CODE END 4 */


    Jest to kod zaczerpnięty ze strony "Elektronika i Programowanie".
    - Tworzona jest struktura (bo cięzko mówić o połączeniu jak jeszcze nic nie jest podłączone) która nasłuchuje danych na porcie 80.
    - po pojawieniu się połączenia zostaje ono zestawione, dane są odbierane do bufora, a następnie wysyłane spowrotem - dodałem sobie zmianę stanu jednej z diod LED żeby dodatkowo potwierdzić, że kod ładnie działa, ew ma się zapalić czerwony led (LD3) jak z jakiegoś powodu nie da się połączyć.

    OK - tak rozumiem, że to działa i wszystko jest OK - jest to dla mnie punkt wyjścia - kod potrafi odbierać dane i potrafi je wysyłać - co tam z nimi będzie robione to aktualnie mnie nie interesuje (dopisze się później).
    Sprawdzone na programie Realterm - łącze się z IP nucleo na porcie 80 (192.168.1.204:80) wysyłając znaczki ASCI jako odpowiedź mam to samo co wpisałem, co więcej za każdym wysłaniem zmieniam stan diody - więc kod działa.

    i teraz............
    Chciałbym w miarę bezboleśnie przejść na sockety korzystając z LwIP. Wiem, że STM to nie serwer linuxa i ma swoje ograniczenia, więc załóżmy, że chciałbym obsłużyć 2-3 połączenia które łączą się na różnych portach.

    Chcę zrobić to samo co powyżej - odebrać dane i je wysłać. Takie totalne podstawy, które dla was zapewne są banalne, a mi pomogłoby ruszyć z miejsca.

    Kolejnym późniejszym etapem będzie obudowanie tego w SSL, ale zdaje sobie sprawę z mojej niewiedzy, więc chcę pracowac małymi kroczkami - bo nie da się przeskoczyć podstaw.
    No i uprzejmie prosze o wyrozumiałość - nie chcę mieć podanego rozwiązania "na tacy" - po prostu jako elektronik rocznika urodzenia 78 nigdy nie musiałem się tym zajmowac zawodowo, bardziej rozumiem elektronikę w sensie analogowym, bramek TTL / CMOS - a tu take wyzwanie: wychodze z założenia, że na naukę nigdy nie jest za późno, zwłaszcza jak wiele lat miało się inną pracę która nie wymagała projektowania układów z prockami / siecią.

    0
  • #10 06 Mar 2018 15:03
    tplewa
    Poziom 37  

    @kuczy

    Może nie będzie to to co chcesz usłyszeć i może wiele osób się z tym nie będzie zgadzać... Ale po jakiś tam różnych doświadczeniach i projektach powiedziałem jedno koniec z LwIP...

    Zostałem tylko przy wspomnianym CycloneTCPhttps://www.oryx-embedded.com/#&panel1-2 i też polecam, po prostu na walkę z LwIP szkoda mi było czasu pod Cyclone wszystko działa - sockety to też nie problem (łącznie z BSD style). Natomiast z LwIP przy bardziej rozbudowanych projektach ciągle musiałem walczyć z wiatrakami...

    0
  • #11 06 Mar 2018 15:34
    Freddie Chopin
    Specjalista - Mikrokontrolery

    tplewa napisał:
    Może nie będzie to to co chcesz usłyszeć i może wiele osób się z tym nie będzie zgadzać... Ale po jakiś tam różnych doświadczeniach i projektach powiedziałem jedno koniec z LwIP...

    Zostałem tylko przy wspomnianym CycloneTCPhttps://www.oryx-embedded.com/#&panel1-2 i też polecam, po prostu na walkę z LwIP szkoda mi było czasu pod Cyclone wszystko działa - sockety to też nie problem (łącznie z BSD style). Natomiast z LwIP przy bardziej rozbudowanych projektach ciągle musiałem walczyć z wiatrakami...

    SOA#1 - u mnie działa (; Ale czyste lwIP, a nie ten staroć który dołączają producenci mikrokontrolerów do swoich paczek.

    0
  • #12 06 Mar 2018 16:34
    Typek2
    Poziom 11  

    tplewa napisał:
    @kuczy
    Może nie będzie to to co chcesz usłyszeć i może wiele osób się z tym nie będzie zgadzać... Ale po jakiś tam różnych doświadczeniach i projektach powiedziałem jedno koniec z LwIP...

    Mi abym stwierdził to samo wystarczyło przeczytanie książki:
    "Mikrokontrolery STM32 w sieci Ethernet w przykładach"
    i analiza przykładowych kodów źródłowych. :)

    0
  • #13 06 Mar 2018 16:53
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ten projekt Cyclone to jest taki skryty w sobie, że na stronie nawet nie dali info o cenie. Pewnie po to, żeby nie zabić potencjalnych nabywców od razu (;

    0
  • #14 06 Mar 2018 16:56
    tplewa
    Poziom 37  

    Freddie Chopin napisał:

    SOA#1 - u mnie działa (; Ale czyste lwIP, a nie ten staroć który dołączają producenci mikrokontrolerów do swoich paczek.


    No wiem zabrzmiało to i fakt może LwIP się obecnie zmienił bo gdy zaczynałem zabawę miał wiele wad... Teraz jak mam już dobrze opanowany w/w stos nawet nie miałem ochoty przestawiać się znowu na LwIP. Zwłaszcza ze względu na to że mimo braku dokumentacji w darmowej wersji stos jest IMHO bardzo fajnie napisany i analiza kodu jak czegoś człowiek nie jest pewny idzie bez większych oporów, zresztą w większości wypadków jak się zaczyna z tym stosem wystarczy zerknąć sobie na przykłady i wszystko staje się jasne...

    W cenę nie wnikam bo jak wspomniałem nie potrzeba było dokumentacji by w kilka minut po ściągnięciu odpalić działający projekt na procku... co w przypadku LwIP przynajmniej w tamtym czasie nie było takie piękne...

    0
  • #16 07 Mar 2018 08:18
    kuczy
    Poziom 10  

    Wow - dziękuję koledzy za szeroką odpowiedź - zwłaszcza, że staram się najpierw rozwiązać problem samemu szperając po internecie i szukając przykładów... - a elektroda to taka raczej ostateczność kiedy już widzę, że stoję w miejscu.

    Przyjrze się Cyclone, dzięki za radę - wpadło mi to w oczy, podobnie jak ARMmbed (gdzie jest chyba dość dobrze opracowane SSL), jednakże myślałem, że dam radę z LwIP (chodzi także oczywiście o kwestię kosztów licencji - docelowo oczywiście ma do działać w produkcie który będzie sprzedawany, więc koszta to także coś z czym muszę się zmierzyć) - ale ok, - mam do poznania nowe rzeczy dzięki waszej pomocy - myślę, że pozwoli mi to ruszyć z miejsca.

    serdecznie dziękuję.

    0
  • #17 07 Mar 2018 15:00
    tplewa
    Poziom 37  

    kuczy napisał:

    Przyjrze się Cyclone, dzięki za radę - wpadło mi to w oczy, podobnie jak ARMmbed (gdzie jest chyba dość dobrze opracowane SSL), jednakże myślałem, że dam radę z LwIP (chodzi także oczywiście o kwestię kosztów licencji - docelowo oczywiście ma do działać w produkcie który będzie sprzedawany, więc koszta to także coś z czym muszę się zmierzyć) - ale ok, - mam do poznania nowe rzeczy dzięki waszej pomocy - myślę, że pozwoli mi to ruszyć z miejsca.

    serdecznie dziękuję.


    Co do SSL to w Cyklone też działa bez problemów... natomiast co do kosztów to też trzeba zrobić kalkulację czy czasem zakup czegoś gotowego nie jest tańszy od poświęcania X godzin pracy które też kosztują...

    0