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.
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