Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32F7 FreeRTOS+TCP - gniazdo nasłuchujace TCP

Jakub17 10 Feb 2021 12:36 207 0
  • #1
    Jakub17
    Level 6  
    Witam,

    Od kilku dni walczę z problemem uruchomienia serwera Echo TCP na FreeRTOS+TCP. Działam na zestawie discovery z mikrokotrolerem STM32F746NGH.Warstawę Ethernetu przetestowałem bez używania FreeRTOS na stosie LwIP i na pewno działa.

    Opis problemu:

    Po inicjalizacji sprzętu wywołuję funkcję FreeRTOS_IPInit, która tworzy zadanie prvIPTask odpowiedzialne za obsługę stosu TCP/IP.
    Następnie wywołuję vCreateTCPServerSocket() która tworzy gniazdo nasłuchujące TCP. I tutaj pojawiają się komplikacje...
    Funkcja FreeRTOS_socket nie może utworzyć gniazda ponieważ inna funkcja xIPIsNetworkTaskReady() zwraca false, mimo że bool który zwraca jest ustawiany w zdaniu prvIPTask na true. To zadanie powinno działać najwyższym priorytetem, ale tak naprawdę w cale się nie wykonuje, mimo że funkcja je tworząca xTaskCreate nie zwraca błędu. Wiem, że zdanie prvIPTask nie wykonuje się bo mam w nim na początku printfa który nic nie wyświetla. Sprawdzałem również debugując.

    Starałem się obejść problem tak:

    Próbowałem wywołać funkcję vCreateTCPServerSocket() z hooka vApplicationIPNetworkEventHook gdzie na pewno xIPIsNetworkTaskReady() zwraca true ( w tym przypadku o dziwo zadanie prvIPTask wykonuje się), ale wtedy tworzenie gniazda zawiesza się w FreeRTOS_bind ponieważ nie zostaje spełniony warunek
    configASSERT( xIsCallingFromIPTask() == pdFALSE );

    Z opisu powyższej funkcji xIsCallingFromIPTask() :
    Very important: the IP-task is not allowed to call its own API's,
    because it would easily get into a dead-lock.

    a hook vApplicationIPNetworkEventHook jest własnie wywoływany z prvIPTask.

    Zatem sytuacja jest patowa. Czy ktoś mógłby mi powiedzieć co robię źle lub udostępnić działający przykład?

    Dziękuje za pomoc.

    Code: c
    Log in, to see the code