Hilfestellung LWIP-Stack

Gast #4930597
Hallo,

für UDP Kommunikation auf einem Mikrocontroller wird der LWIP-Stack 
eingesetzt. Folgendes Phänomen ist mir aufgefallen:

Der Mikrocontroller sowie zwei Rechner (in der gleichen Subnetz 
Maske)sind an einem Switch verbunden. Wenn ich nun auf beiden Rechner 
Ping permanent ausführe, dann werden die Ping-Antwortzeiten nach ca. 30 
Sekunden deutlich schlechter (>200ms).

UDP Initialisierung:
1
upcb = udp_new();
2
if (upcb)
3
{
4
   udp_bind(upcb, IP_ADDR_ANY, UdpPort);
5
   udp_recv(upcb, udp_server_receive_callback, NULL);
6
}

Variablen:
1
struct pbuf *p;
2

3
char ReceiveBuffer[UDPBufferLen];
4
int ReceiveBufferLen;
5

6
unsigned int SrcAddr;
7
unsigned int DstAddr;
8
unsigned int GwAddr;
9
unsigned int NetMask;
10
unsigned int Port;

Receive Callback Funktion:
1
void udp_server_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
2
{    
3
  if (ReceiveBufferLen==0)
4
  {
5
    int Len;
6
    Len = p->len;
7
    memcpy(ReceiveBuffer,p->payload,p->len);
8
    udp_connect(upcb, addr, port);
9
   
10
    DstAddr = addr->addr;
11
    Port = port;
12

13
    if ( Len<=0 )
14
      ReceiveBufferLen=0;
15
    else
16
    {
17
      ReceiveBufferLen=Len;
18
    }
19
    udp_disconnect(upcb);
20
  }
21
  pbuf_free(p);
22
}
23

24
UDP Nachrichten senden:
25
[c]
26
p = pbuf_alloc(PBUF_TRANSPORT,Len,PBUF_RAM);
27
memcpy (p->payload, pMsg,Len);
28
udp_sendto(upcb, p, &DstAddr, Port);

UDP-Nachrichten empfangen:
1
int Len;
2

3
Len=ReceiveBufferLen;
4
if (Len)
5
{
6
  int CountMax=Len;
7
  int  i;
8

9
  if (MaxLen<Len) CountMax=MaxLen;
10
  memcpy(pMsg, ReceiveBuffer, CountMax);
11
  ReceiveBufferLen=0;
12
}
13
return Len;

Für jeden Hinweis bin sehr dankbar!
Gast
Folgendes ist mir dabei auch noch aufgefallen:

Sobald ich einen Ethernetstecker von einem PC an einem Switch 
herausnehme und wieder anstecke wird die Ping Antwortzeiten deutlich 
schlechter.
Gast
Techniker schrieb:
> udp_connect(upcb, addr, port);

Ich verstehe nicht den tieferen Sinn eines "connect" in einer
CallBack-Routine (die ja aller Warscheinlichkeit nach auch
noch Interrupt-getrieben ist).

Üblicherwise wird man einen Connect einmal machen und dann
die Connection bestehen lassen, und nicht bei jedem kleinen
Furz öffnen und wieder schliessen..

Überhaupt wird sich auch die Nomenklatur als ungünstig erweisen
da UDP nicht über die Connection-Charakteritik verfügt wie TCP.
Gast
Hobbyprogrammierer schrieb:
> Ich verstehe nicht den tieferen Sinn eines "connect" in einer
> CallBack-Routine (die ja aller Warscheinlichkeit nach auch
> noch Interrupt-getrieben ist).

Wenn so ein Connect mit Speicher-Allokation gemacht wird und
dann mit anderer Speicher-Allokation/-Deallokation im Programm
geschachtelt ist ergibt sich irgendwann eine Speicher-/Heap-
fragmentierung wo mir nicht mehr klar ist was passiert ....
(Firma: keine)
Hallo,

ich vermute, dass Du da auf das Sägezahnproblem beim ETH PHY DMA Treiber 
gestossen bist. Das zeigt sich darin, dass sämtliche Rx Netzwerkpakete 
zwar ankommen, aber "periodisch angestossen."

Stelle mal den wireshark log rein. ICMP Pakete haben eine Sequenznummer, 
so dass Du sehen kannst, ob Pakete tatsächlich komplett verloren gehen 
oder nur verzögert auftreten.

Wenn das Problem bei einem "Neutronenpumpenbeschuss" (= mehrere schnelle 
pings auf die Adresse von einem PC mit fastping o.ä.) weggeht, weisst es 
ebenfalls darauf hin.

Ich habe das mal im lwip developer forum zur Diskussion gestellt, finde 
es aber auf die Schnelle nicht.
Gast
Techniker schrieb:
> Wie müsste die Callbackfunktion ohne connect Funktion implementiert
> werden?

Ich weiss ja nicht mal warum du das machst, geschweige denn
kenne ich mit diesem bisschen Codeschnipsel was du überhaupt
vor hast.

Allein deine Fragestellung lässt mich stark daran zweifeln dass
du überhaupt weisst was du machst.

Aber ohne vollständiges Programm lässt sich hier nichts aussagen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.