Forum: Mikrocontroller und Digitale Elektronik Hilfestellung LWIP-Stack


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Techniker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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!

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Techniker schrieb:
> Wenn ich nun auf beiden Rechner
> Ping permanent ausführe, dann werden die Ping-Antwortzeiten nach ca. 30
> Sekunden deutlich schlechter (>200ms).

Wohin geht der Ping jeweils?
Was sagt Wireshark?

Fragen über Fragen...

von Techniker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
PC_1 sendet Ping an Mikrocontroller
PC_2 sendet Ping an Mikrocontroller

von Techniker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mit Wireshark bekomme ich keine neuen Erkenntnisse.

von Techniker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Hobbyprogrammierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Hobbyprogrammierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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 ....

von Techniker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie müsste die Callbackfunktion ohne connect Funktion implementiert 
werden?

von Ruediger A. (Firma: keine) (rac)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Hobbyprogrammierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.