Ostatnio spędziłem trochę czasu na raczej bezowocnych eksperymentach z RAW API biblioteki lwIP (to oparte na callbackach, przeznaczone do pracy bezpośrednio na krzemie). Wszystko rozbija się o fakt, że to API nie pozwala mi w łatwy sposób pobierać z bufora dowolnej liczby bajtów wtedy, kiedy jest to dla mnie wygodne - kiedy przychodzi nowa paczka powinienem ją jak najszybciej obsłużyć, zwolnić pamięć i poprosić o kolejną. Takie podejście wymagało dość gruntownego przepisania kodu mojej aplikacji, która potem nie działała zbyt sprawnie.
Postanowiłem w końcu spróbować z FreeRTOS-em, aby mieć dostęp do bardziej standardowego API opartego na socketach. Przeklikałem się ponownie przez konfigurację z mojego projektu w STM32CubeMX, dodając FreeRTOS-a. Zmieniłem timebase source z SysTick na Timer1 oraz utworzyłem domyślny task.
Chyba jakiś bug w CubeMX sprawił, że w konfiguracji lwIP pod definicję RTOS_USE_NEWLIB_REENTRANT został podstawiony jakiś dziwnie wyglądający ciąg znaków, co wywoływało komunikat o błedzie. Zamieniłem tę wartość na "1" i wszystko przeszło - byłem w stanie wygenerować kod.
Na początku miałem jakieś problemy ze stabilnością - kod się w pewnym momencie zawieszał i przestawał wykonywać kod umieszczony w pętli głównej tasku. Pomogło jednak zwiększenie rozmiaru przypisanego mu stosu.
Następnie wykonałem podstawowe testy peryferiów, inicjując je i komunikując się z nimi z poziomu tasku. Zadziała zarówno karta SD/FatFS jak i VS1003.
Natomiast trafiłem na jakiś problem z obsługą Ethernetu. Jeśli dobrze rozumiem, w przypadku zastosowania FreeRTOS-a cała obsługa sieci powinna się odbywać w tle, ponieważ sterownik Ethernetu otrzymuje swój własny, prywatny task. Tymczasem po podłączeniu zasilania urządzenie nie pojawia się wcale w routerze, jakby nie został mu przydzielony adres przez DHCP. Co ciekawe jeśli spróbuję włączyć zasilanie przy odłączonym kablu Ethernetowym, to zaraz po starcie mam następujący komunikat:
"Assertion "netif is not up, old style port?" failed at line 727 in /Middlewares/Third_Party/LwIO/src/core/ipv4/dhcp.c"
Czyli jakaś próba uzyskania dostępu do DHCP jest podejmowana, ale failuje (bo kabel jest odłączony). Przy podłączonym kablu nie mam tego komunikatu. Tylko czemu w takim razie płytka nie dostaje adresu i nie zaczyna się komunikować z siecią?
Coś jeszcze trzeba zrobić, żeby uzyskać działający Ethernet na FreeRTOS?