u

Od jakiegoś czasu rozwijam pewien projekt oparty na PIC32MX795F512, który korzysta z wbudowanego w ten mikrokontroler sterownika MAC, z zewnętrznym układem PHY (DP83848). W wielkim skrócie jest to stacjonarny odtwarzacz plików z audio, z funkcją odbierania streamów po HTTP.

Firmware napisałem za pomocą bibliotek Harmony3 od Microchipa oraz FreeRTOS. O ile sama aplikacja działa całkiem nieźle, to nie mogę sobie poradzić z pewną uciążliwą przypadłością - co jakiś czas łączność sieciowa zawiesza się. I to w tak dziwny sposób, że zawias wywala łączność we wszystkich urządzeniach podłączonych do tego samego switcha. Jestem pewien, że przyczyną jest moja płytka, bo prowadziłem testy z kilkoma różnymi switchami i za każdym razem wygląda to dokładnie tak samo.

Objawy są następujące:

- W pewnym momencie urządzenie traci łączność z siecią. Przestaje odpowiadać na pingi, nie można się dostać do prostego serwera HTTP (obsługującego webUI), a socket odbierający w danym momencie stream audio przestaje otrzymywać dane.

- Co więcej, w tym samym momencie przestaje działać łączność sieciowa na wszystkich urządzeniach podpiętych do tego samego switcha.

- Dioda ACT na gniazdku ethernetowym mojej płytki świeci ciągle, zamiast migać w rytm przesyłanych pakietów.

- Co ciekawe problem często nie ustępuje po soft-resecie albo nawet pełnym power cycle - po ponownym podpięciu zasilania dioda ACT błyśnie parę razy, a w chwilę później znów zaczyna świecić. W takiej sytuacji trzeba chwilę odczekać przed ponownym podłączeniem zasilania. Takie zachowanie nie występuje jednak zawsze. Często zwykły, programowy reset wystarcza w zupełności.

- Częstotliwość występowania problemu jest różna. Czasem występuje raz na kilka dni, czasem kilka razy jednego dnia.

Co sprawdziłem do tej pory:

- Włączyłem opcję raportowania zajętości tej części sterty, która jest wydzielona na użytek stosu TCP/IP. Nie zauważyłem, żeby problem korelował z brakami miejsca na stercie. Zwiększenie rozmiaru sterty w niczym nie rozwiązuje problem.

- Próbowałem podnieść rozmiary stosu dla tasków FreeRTOS-a związanych z TCP/IP, ale nie przyniosło to żadnego efektu.

- Próbowałem manipulować rozmiarami rozmaitych buforów wykorzystywanych przez TCP/IP, żeby oszczędzić pamięć. W niczym to nie pomogło.

Dodatkowo: jakiś czas temu opracowałem nową wersję płytki do tego urządzenia, z dużo mocniejszym MCU (PIC32MZ2048). Tam nie zauważyłem jeszcze nigdy podobnego objawu. Może jest to związane z większą ilością zasobów sprzętowych - samo procesor jest znacznie szybszy, mogłem też ustawić większe rozmiary sterty oraz jej części przeznaczonej dla zadań TCP/IP.

Można by co prawda próbować zrzucić winę na fakt, że urządzenie jest zbudowane na samodzielnie trawionej (dwustronnej) płytce. Jednak poza tymi dziwnymi zawiasami nie występują absolutnie żadne problemy z łącznością, nie zauważyłem ani jednego zgubionego pakietu podczas normalnej pracy. Poza tym zbudowałem jeszcze kilka innych urządzeń z DP83848 (w tym również z mikrokontrolerami STM32) na samodzielnie trawionych płytkach i nigdy nie miałem z tego tytułu żadnych problemów.

Ktoś ma jakiś pomysł co do możliwej przyczyny? Szczególnie zastanawia mnie to wywalanie łączności na wszystkich urządzeniach podpiętych do tego switcha. W wolnej chwili spróbuję podpiąć Wiresharka i zobaczyć co tak właściwie się wtedy dzieje, jednak może ktoś z was zetknął się z czymś takim, albo przynajmniej ma pomysł jak to dalej debugować? ;)

Reply to
Atlantis
Loading thread data ...

Koniecznie odpal Wiresharka i zobacz co się dzieje. Jak kładzie całą sieć, to możliwe, że odpowiada na każdy pakiet TCP - tak jakby nie filtruje własnego MAC-a - każdy traktuje jak swój i w rezultacie switch wszystkie pakiety kieruje do niego. Drugi problem może być z samym układem PHY - wtedy prawdopodobnie nic nie zobaczysz. Z tym pierwszym przypadkiem spotkałem się OIDP tylko raz i co ciekawe tak się zachowywała końcówka GPON operatora. Z drugim przypadkiem spotkałem się wielokrotnie - zwykle był to switch z kategorii mały, tani 4-ro, 8-mio portowy, ale też pamiętam Mikrotika i mediakonwerter MOXA - tak że nie ma reguły. Na Wiresharku nic nie widać - po prostu z czasem pakiety nie dochodzą i tyle. Po odłączeniu pacjenta od sieci sytuacja wraca do normy, ale dopiero po pewnym czasie. Tak samo po podłączeniu problem zaczyna się robić z dużym opóźnieniem, tak że w rozległej sieci ciężko coś takiego namierzyć.

Reply to
Mirek

Mógłbyś to precyzyjniej opisać? Przecież to switch decyduje co komu wg tablicy, który MAC "widać" na danym porcie. Urządzenie musiałoby odpowiadać na każdy whohas o dowolny IP co jest nieprawdopodobne w stosie mchp. Jak przez mgłę kojarzę bardzo podobny przypadek jaki miałem z tym stosem (nagła niewidzialność innych urządzeń) ale niestety nie mogę sobie przypomnieć wniosków z diagnostyki.

Reply to
Marek

Rozumiem, że aplikacja działa nadal podczas zwieszki sieciowej, nie wiesza się, tylko sieć nie działa? Czy możesz periodycznie na konsole debug wyrzucać bieżącą konfigurację sieci (przydzielony IP, maska) oraz MAC? Czy czasem ona się nie zmienia po wystąpieniu zwieszki?

Reply to
Marek

Tak, mogę. Zapomniałem właśnie o tym wspomnieć. Konfiguracja po stronie urządzenia nie zmienia się. Komenda "netinfo" pokazuje poprawną konfigurację. Adresy IP i MAC nie zmieniają się, system twierdzi, że interfejs sieciowy jest w stanie "up". Komenda "macinfo" pokazuje tylko tyle, że licznik odebranych/wysłanych pakietów w pewnym momencie przestaje się zwiększać.

Przyszedł mi do głowy jeszcze pomysł - uruchomiłem urządzenie na minimalnej konfiguracji. Ro znaczy zostawiłem jedynie obsługę podstawowego stosu z TCP/IP/UDP/ARP/DHCP/DNS. Wywaliłem NBNS, HTTP i biblioteki kryptograficzne związane z WOLFSSL (nawet jeśli się z niego nie korzysta, autorzy bibliotek zalecają dodanie ich do projektu, ze względu na lepsza obsługę RNG, można to jednak wyłączyć).

Jak na razie projekt się nie zawiesił, ale jak mówiłem - niekiedy działo się to po kilku dniach. Jeśli do tego nie dojdzie, będę powoli dodawał kolejne usunięte komponenty. Na pewno nie chciałbym rezygnować z HTTP, bo webUI było bardzo wygodną funkcjonalnością. Z SSL mogę na dobrą sprawę zrezygnować, bo na chwilę obecną i tak nie zaimplmenetowałem funkcji odbioru streamów HTTPS.

Reply to
Atlantis

Co ma warstwa 7 OSI do warstwy 4? Ewidentnie problem jest raczej poniżej warstwy 5.

Reply to
Marek

Nieprawdopodobne jest to, co napisałem, czyli że odpowiada na każdy MAC

- żeby to zadziałało, to musiałby odpowiedzieć pakietem z takim samym MAC-iem źródłowym jak dostał docelowy żeby zmylić switcha. Bardziej możliwe jest, że pamięć mnie zawodzi - faktycznie chyba odpowiadał na każde who has, czyli brał na siebie wszystkie IP. Szkoda, że nie zrobiłem wtedy zrzutu z wiresharka. Zwykle przy takich akcjach jest wszystko na wczoraj i nie ma czasu na dociekanie co się dzieje. Sukcesem jest znalezienie wadliwego urządzenia, a co ono tam wyprawia to już nie ma znaczenia.

Reply to
Mirek

No cóż... Uruchomiłem bardziej minimalistyczną wersję stosu, z wywalona obsługą HTTP, NBNS oraz WolfSSL (z towarzyszącymi mu bibliotekami). Od tamtego momentu problem wystąpił już jeden raz. Przyszedł mi do głowy jeszcze jeden pomysł. Płytka podczas testów właściwie non-stop jest pingowana przez peceta. Zobaczę jak urządzenie się zachowa, jeśli tego zaniecham na jakiś czas.

Przypomniałem sobie jeszcze, że przez pewien czas (na samym początku) urządzenie pracowało na firmware napisanym za pomocą starych bibliotek MLA. Dopiero później przeniosłem je na Harmony. Nie przypominam sobie żeby podczas testów na starym FW wystąpił taki błąd. To zmniejsza prawdopodobieństwo hipotezy, że winę ponosi problem sprzętowy.

Reply to
Atlantis

Ty mi powiedz.

Pozdrawiam

Adam Górski

Reply to
Adam Górski

W odpowiedzi komu innemu pisałem że na 99% kilka lat temu zetknąłem się z tym samym problemem na pic32. Tylko niestety nie pamiętam, który to był stos mla czy Harmony bo w tamtym czasie używałem oba. Pamiętam blokadę "ruchu" na switchu i palącą się na stałe diodę ACT na gnieździe eth z pic32. Jak tylko przypomnę sobie co to było dam znać.

Reply to
Marek

Gdyby udało się przypomnieć co to powodowało, to byłbym bardzo wdzięczny za tę informację. Na razie sprawdzam hipotezę na temat wpływu pingowania płytki na to zachowanie. Póki co od wczoraj się nie zawiesiła, ale to jeszcze niczego nie przesądza, bo nieraz problem występował dopiero po kilku dniach.

Reply to
Atlantis

Gdy jest zwieszka i wyjmiesz wtyk eth z płytki ruch na switchu się przywraca? Czy po włożeniu wtyczki z powrotem (bez resetowania płytki) od razu diioda ACT zapala się na stałe i ruch ponownie zanika?

Reply to
Marek

Tak. Komputer podłączony do tego samego switcha odzyskuje łączność natychmiast po wyjęciu kabla Ethernet z mojej płytki. Jeśli podłączę kabel ponownie, problem powraca - dioda ACT znów zaczyna świecić cały czas, chociaż komputer traci łączność z drobnym opóźnieniem.

Problem powrócił dzisiaj, czyli jednak wiadomo, że to nie pingowanie płytki było przyczyną.

Tak. Po włożeniu kabla bez resetu dioda zapala się cały czas i problem pojawia się natychmiast.

Było też kilka sytuacji, kiedy problem pojawiał się ponownie po resecie, ale wtedy dioda zdążyła jeszcze mignąć kilka razy przed zapaleniem się na stałe.

Reply to
Atlantis

Przyszedł mi jeszcze do głowy pomysł, że może dochodzić do zagłodzenia któregoś z tasków odpowiedzialnych za łączność sieciową. Sprawdziłem i faktycznie wszystkie one mają priorytet 1 - taki sam, jak task w którym wykonuje się mój kod. Zmieniłem go na 2 i zobaczę jak teraz zachowa się urządzenie.

Reply to
Atlantis

Tak w sumie zapomniałem dodać, że równolegle mam do czynienia z nieco podobnym problemem, którego przyczyna może (chociaż wcale nie musi) być związana z tym opisywanym powyżej.

Mianowicie jakiś czas wcześniej powstała uboższa wersja tego hardware'u, gdzie jedyną róznicą było zastosowanie układu ENC28J60 zamiast wbudowanego w PIC32MX795F512L układu MAC z zewnętrznym PHY. Ta płytka również oryginalnie pracowała na bibliotekach MLA. Jakiś czas temu postanowiłem jednak przenieść na nią nową wersję firmware (napisaną przy pomocy Harmony3). Było to dosyć proste - wystarczyło wygenerować kod w oparciu o prawie taką samą konfigurację (zmieniając jedynie kontroler Ethernetu i kilka pinów) oraz przerzucić pliki z kodem aplikacji. Urządzenie generalnie działa, ale również od czasu do czasu wywala się w nim stos TCP/IP. W tym wypadku crashe nie są jednak losowe, a dzieją się w konkretnym momencie - przy próbie dostania się do serwera HTTP. Dosłownie w momencie otwarcia adresu w przeglądarce wywala się łączność. Jeśli usunę serwer HTTP z konfiguracji (albo przynajmniej nie próbuję się z nim łączyć) urządzenia działa całkowicie stabilnie.

Tutaj także w przypadku wywalenia łączności cała reszta aplikacji działa poprawnie. Na wydzielonym dla TCP/IP fragmencie sterty jest jeszcze sporo miejsca. W "macinfo" widzę natomiast nTxPendBuffers: 3 - wartość ta się nie zmienia. Jakby nie mógł wysłać tych danych.

Reply to
Atlantis

Nie mam zbyt dużo doswiadczenia z Harmony, Kiedyś krótko to testowałem ale nie wdrażałem produkcyjnie. Natomiast na MLA + enc28j60 mam na produkcji urządzenia chodzące już 10 rok 24h i nigdy nie było problemu z łącznością z nimi, uważam, że stos MLA jest bardzo stabilny (TCP + UDP, jedyne co nie używam, ze stosu to DHCP oraz tego ich serwera HTTP, używam własny). Był jeden incydent w trakcie jakiś testów właśnie podobny do tego co opisujesz, ale ciągle nie pamiętam szczegółów.

Reply to
Marek

Ja też właśnie przez długie lata korzystałem z z MLA i ciągle korzystam z niego w projektach z mniejszymi MCU. W przypadku PIC18/PIC24 innego wyjścia właściwie nie ma, a i część PIC32 ma za mało zasobów, żeby obsłużyć Harmony. Jednak jakby nie patrzeć, MLA jest już dość starą i nierozwijaną biblioteką, która z kolei nie wspiera nowszych układów. To jest właśnie główny powód, dla którego przeniosłem ten projekt na Harmony - nowsza wersja hardware'u wykorzystuje PIC32MZ2048.

Harmony ma też swoje zalety - kod łatwo generuje się z konfiguratora, jest też dostępnych więcej bibliotek. Pamiętam, że kiedyś spędziłem kilka tygodni naprawiając jakiś krzywy kod z GitHuba, aby mieć na MLA obsługę klienta MQTT. W Harmony taki klient po prostu jest zaimplementowany.

Co do stabilności - jak wspomniałem, na PIC32MZ2048 nie natknąłem się na podobne problemy. Dlatego podejrzewam, że kwestia może się kryć gdzieś w optymalizacji konfiguracji pod kątem wykorzystania zasobów.

Pamiętasz czy to było na MLA czy Harmony? W każdym razie, odkąd wczoraj zmieniłem priorytet tasku z moja aplikacją, problem się nie pojawił. To znaczy był inny crash, ale znacznie mniej uciążliwy: klient z utracił łączność i nie chciał się połączyć ponownie (DNS wywalał błąd -5) ale nie było już efektu świecenia diody ACT i blokady ruchu na poziomie switcha. Tym razem wystarczyło tylko odpiąć o ponownie podpiąć kabel ethernetowy, bez resetowania całego urządzenia.

Reply to
Atlantis

Ok. Wygląda na to, że ten problem udało mi się rozwiązać. Wystarczyło włączyć obsługę DMA na SPI, który obsługuje ENC28J60.

Reply to
Atlantis

Gdzie? Driver Harmony en28j60 używa DMA? Ale jaki to ma bezpośredni związek z blokadą switcha? Liczyłem na to, że jednak zrobisz analize ruchu w tym kablu bom był ciekaw jak taka 10Mbit zabawka może takiego DOSa na współczesnym switchu spowodować

Reply to
Marek

Tak. To znaczy jest taka opcja. Można wygenerować konfigurację, w której ENC28J60 jest podpięty do drivera SPI skonfigurowanego do działania w trybie DMA.

Tutaj mówimy o dwóch osobnych problemach na dwóch podobnych płytkach.

Blokowanie switcha z objawem ciągłego świecenia ACT występuje (lub występowało) na nowszej wersji hardware'u, z PIC32MX795F512 + DP83848 (a więc FastEthernet). Na razie w ramach eksperymentu zmieniłem trochę konfigurację tasków FreeRTOS-a, obniżając priorytet tego, w którym działa mój kod. Jak na razie problem z blokadą nie wystąpił, chociaż jeszcze nie mogę tego wykluczyć, bo nieraz zdarzało się kilka dni spokoju. Jeśli jednak faktycznie nie powróci to będzie oznaczało, że powodem blokady było zagłodzenie któregoś z tasków zaangażowanych w łączność TCP/IP.

Osobny problem miałem na bliźniaczej, starszej wersji płytki z PIC32MX795F512L + ENC28J60. Tam dochodziło do crasha łączności sieciowej przy próbie wejścia na stronę obsługiwaną przez serwerek HTTP odpalony na tej płytce. W tym przypadku nie dochodziło jednak do zablokowania łączności na switchu (ani ciągłego świecenia ACT). Problem nie był też losowy - można było go dość jasno skojarzyć serwerem HTTP. W tym wypadku pomogło właśnie właczenie DMA, nie wiem dlaczego.

Oczywiście obydwie płytki nadal obserwuję, bo o ile sytuacja się poprawiła nie mogę mieć pewności, że wszystkie problemy zostały rozwiązane.

Reply to
Atlantis

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.