logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega32][c] biblioteki tuxgraphics-maksymalny rozmiar ramki UDP

magik128 25 Lis 2011 00:06 2466 11
  • #1 10179520
    magik128
    Poziom 22  
    Witam

    Korzystając z bibliotek stosu TCP/IP dla AVR i ENC28j60 ze strony tuxgraphics.com chciałbym zaimplementować obsługę DHCP. Niestety maksymalna długość ramki jaką mogę wysłać to około 220 bajtów. Czy ktoś może wie jak zwiększyć maksymalną długość ramki? Próbowałem na wiele sposobów, ale nie potrafię sobie z tym poradzić.

    Pozdrawiam
  • #2 10179811
    mirekk36
    Poziom 42  
    W kodach z tuxgraphics nie ma żadnego ograniczenia długości ramki, jedynym jej ograniczeniem jest wielkość pamięci RAM w zastosowanym mikrokontrolerze. A ponieważ w ATmega88 jest pamięci RAM tylko 1kB to oni przedstawiają po prostu dla przykładu, że ramka może mieć nawet TYLKO 220 bajtów. Jeśli masz ATmega32 i 2kb RAM to spokojnie możesz zwiększyć rozmiar ramki np do 700 bajtów albo ile chcesz byleby starczyło miejsca dla stosu.

    Wielkość ramki zależy od wielkości bufora na ramkę.
  • #3 10180031
    magik128
    Poziom 22  
    Witam

    A czasami maksymalna długość pakietu nie jest ustawiana w tym miejscu na 1500?
    (plik enc28j60h)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W funkcji wysyłającej UDP jest miejsce na podanie długości danych "datalen" i jest ona typu unsigned char czyli z zakresu 0~255
    (plik ip_arp_udp_tcp.h)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oraz w samej funkcji "send_udp" znalazłem coś takiego:
    (plik ip_atp_udp_tcp.c)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jednakże poprawki w tych miejscach nie pozwoliły na zwiększenie ramki. Proszę o wyrozumiałość, dopiero zabieram się za ten temat. Jeżeli gdzieś błądzę to proszę poprawiać.

    Pozdrawiam
  • #4 10180243
    mirekk36
    Poziom 42  
    Oczywiście, że te poprawki typu:

    if (datalen>220){
                    datalen=220;
    }



    trzeba zrobić we własnym zakresie.

    Za to co do długości ramki ;) powyżej 1500 bajtów ;) - przy UDP chcesz mieć dłuższą ramkę - to życzę powodzenia. Musisz poczytać sobie przede wszystkim coś na temat UDP, wtedy przestaniesz myśleć o dłuższej ramce niż 1500 bajtów

    Po drugie panie kochany, jeśli ty chcesz posługiwać się tak gigantycznymi ramkami tzn większymi niż 1500 bajtów - to daj sobie od razu spokój z wykorzystania Ethernetu na AVR'ach i od razu przejdź na ARM'y.....

    Przy AVR'ach trzeba zmienić koncepcję i założenia jeśli się da dla projektu. AVR to nie ARM i musisz o tym pamiętać.

    Lepiej napisz od razu co ty chcesz uzyskać w efekcie końcowym, zamiast się dopytywać jak można zwiększyć ramkę, bo być może na ślepo dążysz w złym kierunku. Wtedy łatwiej będzie ci pomóc i naprowadzić na jakiś właściwy tor.
  • #5 10180807
    michalko12
    Specjalista - Mikrokontrolery
    Ramka DHCP potrzebuje trochę więcej niż 255 oktetów i po to mu jest potrzebny większy rozmiar ramki. Nigdzie nie pisze, że che więcej niż 1500.

    Co do stosu tuxgraphics.com nie pomogę, ale polecam coś co bardziej przypomina stos czyli uIP. W tym drugim przypadku już co nieco mogę podpowiedzieć.
  • #6 10180817
    mirekk36
    Poziom 42  
    No właśnie w ogóle mało pisze ile chce czy też co chce zrobić a to jest ważniejsze niż ot takie tam zwiększanie ramki. Stos z tuxgraphics ma mocne ograniczenia i nadaje się do bardzo prostych zastosowań.

    Jeśli więc coś bardziej zaawansowanego robić to pewnie, że już lepszym byłby uIP albo i mocniejszy procek w ogóle.
  • #7 10180840
    michalko12
    Specjalista - Mikrokontrolery
    Akurat DHCP jest prostym protokołem, ale przesyłane są dość spore struktury danych, a te ograniczenie w tym przypadku wynika prawdopodobnie z wielkości bufora przydzielonego na ramkę, wiec od tego trzeba zacząć poszukiwania problemu.
  • #8 10180934
    magik128
    Poziom 22  
    Potrzebuje wysyłać ramki UDP do 400 oktetów i nic więcej. Układ ma pobrać sobie adres IP przez DHCP, a następnie przez HTTP wysyłać 3 wartości liczbowe. Całość jest już gotowa, brakuje mi tylko DHCP. Co prawda mógłbym w ruterze przypisać adres statycznie, ale nie lubię takich rozwiązań. Zwiększyłem wcześniej wartości buforów, zmieniłem typ danych zmiennej "datalen" na 16 bitowy, zmieniłem warunek if(datalen>200) na if(datalen>450) lecz niestety nie pomaga.

    Pozdrawiam i dziękuje za dotychczasowe rady
  • #9 10180966
    michalko12
    Specjalista - Mikrokontrolery
    Sprawdź wartość wpisywana do rejestru MAMXFL ENC28J60
  • #10 10181039
    magik128
    Poziom 22  
    Standardowo w bibliotece jest 1500

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #11 10181054
    michalko12
    Specjalista - Mikrokontrolery
    Sprawdź czy nie ma więcej ograniczeń do 220 bajtów w kodzie
  • #12 10181986
    magik128
    Poziom 22  
    I problem znaleziony. Tak jak kolega michalko12 sugerował było jeszcze jedno ograniczenie i to bardzo blisko kawałka kodu który tu dodałem.

    było:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    wystarczyło zmienić datalen>220 na większe i zmienną "i" tj. jej typ na 16bit, oraz oczywiście typ datalen w funkcjach na 16 bit.

    Pozdrawiam i dziękuje za pomoc.
REKLAMA