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ć? ;)