uIP - zapotrzebowanie na zasoby

Wracając do tematu obsługi TCP/IP na małych mikrokontrolerach...

Jak już wspominałem, od jakiegoś czasu bawię się łącznością sieciową na ośmiobitowych MCU (głównie Atmegi). Zacząłem od ENC28J60 i minimalistycznego stosu Tuxgraphics. Używałem go głównie do przesyłania informacji za pośrednictwem pakietów UDP. Nie korzystałem z bardziej zaawansowanych funkcji, jak np. przydzielanie numeru IP z DHCP albo zapytania DNS. Nie realizowałem także obsługi WWW - tego zresztą w ogóle nie mam zamiaru robić na tak małych MCU. Nawet najprostsze strony zabierają sporo flasha.

Oczywiście przy takim podejściu stos zajmował stosunkowo niewielką ilość pamięci. Oczywiście jeszcze lepiej wyglądała sytuacja w przypadku układów Wiznetu, wyposażonych w sprzętową obsługę stosu.

Teraz zastanawiam się jak bardzo zwiększy się zużycie zasobów po przejściu na bardziej zaawansowany stos (np. uIP albo ten od Microchipa). Migracja będzie konieczna, bo Tuxgraphics niestety nie nadaje się do postawienia serwera telnetu.

Załóżmy, że urządzenie ma się komunikować ze światem za pośrednictwem UDP, udostępniając także konsolę konfiguracyjną przez telnet. W przyszłości w grę może wchodzić także dodanie innych funkcji (NTP, DNS). Musi też oczywiście pozostać odpowiednia ilość zasobów na realizację normalnych zadań (parsowanie poleceń, wykonywanie pomiarów, załączanie wyjść).

Czy powinienem się spodziewać, że stos zajmie mi momentalne cały MCU? Powinienem zapobiegawczo zastosowań większy procek (np. Atmega128/1284) czy nie jest tak źle i coś w stylu Mega32/328/644 spokojnie wystarczy?

A może powinienem już od razu postawić na układy Wiznet i nie przejmować się zużyciem zasobów przez stos?

Reply to
Atlantis
Loading thread data ...

Atmega128 to absolutne minimum, jeśli coś chcesz aby to robiło jakieś użytkowe rzeczy. Chodzi zwłaszcza o RAM; minimum 1kbajt RAM i 10 kbajtów ROM zajmie Ci tcp/ip. Z doświadczenia wiem, że 2 kbajty zwykle nie starcza aby mieś tcp/ip i do tego jakieś bufory na UARTy i komfortowo napisać funkcje realizujące zasadniczą część użytkową; po prostu zbyt szybko dochodzi się do ściany.

jp

Reply to
jacek pozniak

Stos mchp na 8bit mcu z tcp+udp+dhcp+dns+ntp+httpd+kilka prywatnych funkcji zajelo ok 60KB flash + ok 100-200 bajtów ram ten sam stos na 32bit mcu tcp+udp+dhcp+dns+ntp+httpd+telnetd+usbhost(pendrive dla statycznych plikow httpd) 130KB flash +20 KB ram, tutaj użyłem wiersze bufory dla gniazd i bardziej wypasiony serwer http, stąd większe użycie ram niż w przypadku 8bit.

Reply to
Marek

W dniu 06.08.2014 o 22:10, Atlantis pisze:

Sorry, że się wtrące, ale od kilku wątków przeglądam te Twoje boje z

8-bitowym AVR w połączeniu z ethernetem itp. i no, nie rozumiem.

Nie prościej wziąc skrojonego na miarę STM'a albo nawet mocniejszego PIC'a zamiast próbować wynajdywać kwadratowe koło?

Przecież uC do takich zastosowań w tej chwili są dime-a-dozen, pewnie taniej wyjdzie niż ten 8-bit AVR + cała reszta peryferiów typu ENC28x. A przy okazji czegoś nowego można się nauczyć, skoro to projekt one-off tylko dla siebie.

Reply to
butek

Co tu rozumieć, hobby.

Pewnie wątkotwórca kombinuje na tym co się zna.

Taniej to wyjdzie to co jest proste i tanie. Osobiście się nie dziwię tym kombinacjom, pewnie STM jest nowocześniejszy ale kryterium 'lepszości' już nie jest takie oczywiste.

jp

>
Reply to
jacek pozniak

W dniu 07.08.2014 o 00:31, jacek pozniak pisze:

No oczywiście, że hobby, ale hobby już od dawna ma dostępne w ręcznie lutowalnych obudowach coś więcej niż 8-bitowy AVR praktycznie bez sprzętowych peryferiów oprócz dwóch/trzech timerów i gównianego ADC z równie gównianym wbudowanym REF do tegoż :) Nie jestem zwolennikiem migania LED od razu za pomocą ARMa, ale sorry, zaprzęganie 8-bitowca do software'owej obsługi interfejsów typu USB/Ethernet i innych mocno wymagających jest po prostu rzeźbieniem w gównie, wartość edukacyjna zero. W podobnej cenie można użyć uC trochę bardziej powyżej lat 90-tych zeszłego wieku, który ma wymagane interfejsy obsługiwane sprzętowo, support w sieci świetny, wartość edukacyjna nie do przecenienia, a i pozostaje więcej czasu na część hobby pod tytułem: moje urządzenie.

Reply to
butek

W dniu 2014-08-06 23:59, butek pisze:

Jasna, że lepiej. Jednak trzeba wziąć pod uwagę kilka kwestii:

1) Taki STM32 w pełni pokaże swoje możliwości dopiero z większym stosem, np. lwIP. Z tego co czytałem dokładne zapoznanie się z nim wymaga jednak trochę czasu. Zabawę z takim tuxgraphics z kolei można było zacząć praktycznie "z marszu". Podejrzewam, że w przypadku uIP wygląda to podobnie. 2) Procki STM i PIC w wersji 32bit posiadają często zintegrowane moduły Ethernet, ale tylko MAC. PHY trzeba podpiąć, a to ładnych kilkanaście linii. Trochę to komplikuje projekt płytki, a przecież chodzi i tak o przesyłanie niewielkich ilości danych. Można też wykorzystać zewnętrzny sterownik na SPI, ale to przecież dokładnie takie rozwiązanie, jakie stosuję teraz. 3) AVR-y znam w miarę dobrze, zarówno od strony programowej, jak i sprzętowej (zaprojektowałem kilka płytek pod własne urządzenia, w tym te działające w sieci). Z STM-ami jestem na etapie zrobienia paru "edukacyjnych" przykładów. Będę musiał się jeszcze trochę podszkolić, zanim zdecyduję się na jakiś większy projekt.

Z tą różnicą, że kilka sztuk Atmegi 328 i 644 już leży w szufladzie. Atmega 128 chyba też się znajdzie. Układ ENC28J60 został mi po poprzednim projekcie, a jakiś czas temu przy okazji innego zamówienia w kupiłem w TME sztukę albo dwie W5500. Taniej jednak wykorzystać to co się ma, niż robić nowe zakupy. Pod warunkiem oczywiście, że posiadane elementy wystarczą. Tutaj jednak nie ma wielkich wymagań - układ ma sterować kilkoma wyjściami (załączanie światła przez triaki, może jakiś przekaźnik) oraz mierzyć kilka wartości (napięcie i częstotliwość sieci, temperatura) oraz komunikować się z otoczeniem przez UDP (sterowanie) i telnet (konfiguracja).

Reply to
Atlantis

On 2014-08-07 01:33, butek wrote: [...]

Tu nie o szerokość słowa chodzi tylko o ilość RAM. Współczesny 8-bitowy uC spokojnie wystarczy do obsługi jakiegoś lekkiego stosu TCP/IP o ile będzie miał wystarczającą ilość RAM-u. Problemem jest to, że typowe

8-bitowce nie mają wystarczającej ilości... Z drugiej strony, programowa realizacja USB/Ethernet może być problemem nawet dla "dużego" uC. :-D
Reply to
JDX

W dniu 2014-08-06 22:40, jacek pozniak pisze:

Zdefiniuj "użytkowe rzeczy". W przypadku Tuxgraphics prosty serwerek UDP można odpalić na Atmedze88, miejsca wystarczy na postawienie jakiegoś nieskomplikowanego parsera i sterowanie wyjściami albo odczytywanie jakiejś wartości. Mam wrażenie, że od biedy dałoby się coś takiego zrobić nawet na Atmedze8.

Oczywiście ja chciałbym teraz pójść trochę dalej, odpalając stos, który potrafi utrzymać otwartą sesję i przesyłać dane w obydwie strony (Tugraphics pozwala jedynie na przesyłanie "wiadomości" o objętości nieprzekraczającej jednego pakietu Ethernet). Na pewno zajmie to aż tyle flasha? A nawet jeśli, to w przypadku Atmegi644 pozostanie jeszcze sporo miejsca na resztę kodu.

Co do RAM-u to zrozumiałe. Każdy stos potrzebuje miejsca na bufor. Tak BTW jak bardzo zapotrzebowanie na RAM zwiększa się wraz z każdym otwartym połączeniem na uIP?

Reply to
Atlantis

W dniu 2014-08-06 22:51, Marek pisze:

Sto do dwustu bajtów!? To chyba nie licząc bufora na pakiety? Czy może w stosie Microchipa jest to w jakiś sprytny sposób rozwiązane?

Reply to
Atlantis

Jak dla mnie TCP/IP sie zaczyna od ARMa i 128kB+ pamieci RAM. Ponizej to jest rzezba w g*. A tak naprawde aby to mialo sens (czyli np. implentowalo calosc protokolu aplikacyjnego wraz z obsluga bledow a nie tylko czesc) i bylo bezpieczne to rozwiaznia Pi podobne.

Pozdrawiam

Marek

BTW: Oczywiscie aby wyslac jeden pakiet UDP z informacja o temperaturze to mozna uzywac czegos malego ale zdaje sie ze chodzi implementacje serwerow aplikacyjnych.

Reply to
Marek Borowski

W dniu 07.08.2014 o 11:31, Atlantis pisze:

Po prostu trzyma bufory w MACu, ma to sens skoro np. pic18f67j60 ma ~3,8kB RAMu a wbudowany MAC ma bufor 8kB.

Reply to
Zbych

Ot choćby te UDP; ja na przykład nie wiedziałbym jak przez UDP połączyć się z tym serwerem wykorzystując ogólnie dostępne narzędzia typu przegladarka www (lub wget czy też curl, choć te to chyba potrafią). Do tego chyba potrzebne jest TCP więc funkcjonalność polegająca na UDP jest co najmiej mało użyteczna. Kolejna rzecz to DHCP; wierz mi lub nie, ale jeśli będziesz chciał z tym wyjść poza swój stół warsztatowy to nie ma opcji. A to dopiero warstwa dość niska; na tym jeszcze trzeba zrobić jakiś interfejs do konfiguracji ustrojstwa, najlepiej aby był czytelny dla człowieka i nie polegał jedynie na przesyłaniu jednobajtowych instrukcji bo po miesiącu się zapomina co jaka znaczy.

No i program użytkowy, który pewnie się będzie rozwijał.

Przed laty ktoś napisał jakiś serwer na 512 słowach(!) flasha i kilkunastu bajtach RAM, interfejs na RS232, ot taka ciekawostka.

chyba coś koło 20 bajtów (piszę z głowy RemoteIP remote_port, local_port, seq1, seq2 i coś tam jeszcze.)

jp

Reply to
jacek pozniak

W dniu 2014-08-07 12:03, Zbych pisze:

A co z układami zawierającymi ENC28J60? One w końcu też korzystają z stosu Microchipa. Wtedy już trzeba buforować kolejne pakiety po stronie MCU, czy też dane są na bieżąco przesyłane przez SPI?

Czy w podobny sposób można by to zrobić z RTL8019AS? Układ jest podłączany do magistrali równoległej i jest widoczny w przestrzeni adresowej MCU.

Reply to
Atlantis

W dniu 2014-08-07 12:32, jacek pozniak pisze:

Żadne z powyższych narzędzi do tego nie służą. Zresztą przesyłanie danych pakietami UDP nie jest rozwiązaniem dla końcowego użytkownika, za to w ten sposób można fajnie zrealizować komunikację M2M. Stawianie serwera WWW na mikrokontrolerze celem generowania jakiegoś prostego GUI mija się z cele, przynajmniej takie jest moje zdanie. Lepiej wykorzystać do tego jakiś istniejący serwer, a jeśli go nie ma - postawić (chociażby na Raspberry Pi) i to jego skomunikować z czujką czy sterownikiem na MCU.

A po co mi DHCP, jeśli chcę, żeby urządzenie było łatwo identyfikowalne w okolicznej sieci? Ok - można co chwilę prosić wszystko dookoła, żeby łaskawie się przedstawiło, bo właśnie pozmieniała się konfiguracja numerów IP. W mojej lokalnej sieci z DHCP korzystają praktycznie tylko mobilne urządzenia WiFi. Wszystko inne pracuje na swoich własnych, na stałe przypisanych numerach.

Telnet i konsola w zupełności wystarczą.

Hmm... A tak z ciekawości, to jak buforowana jest sama wiadomość, na wypadek, gdyby pakiety ją zawierające dotarły w niewłaściwej kolejności? No chyba, że stos odrzuca "późniejsze" pakiety, zanim nie przetrawi tego, na który czeka?

Reply to
Atlantis

uIP nie implementuje wszystkich mechanizmów bo był projektowany na małe urządzenia. Poczytaj sobie pdf; tam jest opisany sposób realizacji i ograniczenia.

jp

Reply to
jacek pozniak

Licząc. Bufory rx/tx gniazd (każde gniazdo ma bufor rx i bufor tx) są statyczne i definiowane na etapie kompilacji. Liczba buforów gniazd tcp określa liczbę jednocześnie możliwych otwartych połączeń, a jeden pojedynczy bufor może być nawet wielkości 1 bajta, jeśli chcemy. Ale oczywiście maleńki bufor będzie mocno ograniczał transfer. Rozsądna wielkość bufora to 20-100 bajtów. Jeśli chcemy mieć dwa gniazda przy buforze 20 bajtów mamy (20rx+20tx)*2 gniazda daje to 80 bajtów. Sam stos (w zależności jakie moduły wkompilujemy) potrzebuje nie więcej niż 100 bajtów. Jeśli chcemy szybsze osiągi z większymi buforami gniazd to można je umieścic w ramie encj (8KB) zwalniając tym ram mcu. Jeśli wiemy, że nasze urządzenie więcej wysyła niż odbiera, możemy dla danego gniazda zwiększyć bufor tx kosztem rozmiaru rx. Stos mhcp jest nieźle zoptymalizowany pod kątem potrzebnego mu ram. Zdefiniowane bufory są pogrupowane (co determinuje ich przeznaczenie), każda grupa ma swój identyfikator, który jest wykorzystywany w wywołaniu funkcji inicjujacej połączenie, to determinuje jaki bufor zostanie przypisany temu połączeniu i jakie osiągi ono będzie miało.

To tak w skrócie, bo o stosie mchp to książkę można napisać....

Reply to
Marek

To jest bardziej skomplikowane, w stosie mchp buforowany jest payload a nie cały pakiet. O ile mi wiadomo (z luźnej analizy źródeł, proszę mnie poprawić, jeśli się mylę) pakiet jest odbierany za pośrednictwem enc28j60, ale payload jest "wyciągany" w mcu i (jeśli wybierzemy ram encj jako bufor payloadu) jest zapisywany z powrotem do ram encj, z którego znowu (kolejny transfer spi) jest kopiowany do "warstwy aplikacji" przez funkcje api TCPGet* (gdy chcemy pobrać odebrane bajty payloadu).

Reply to
Marek

W dniu 2014-08-07 08:56, Atlantis pisze:

świat się nie kończy na STM i PIC

Reply to
Michał Baszyński

W dniu 2014-08-07 21:15, Michał Baszyński pisze:

Co nie zmienia faktu, że są one (razem z AVR-ami) jednymi z najpopularniejszych rodzin. Oczywiście można kombinować z jakimiś alternatywami, szukając układu, który będzie miał wszystkie potrzebne peryferia. Jednak podejrzewam, że ostatecznie na naukę nowej platformy poświęcę więcej czasu, niż na zaprojektowanie płytki zawierającej zewnętrzny kontroler.

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.