Forum: Mikrocontroller und Digitale Elektronik Hilfestellung LWIP-Stack


von Techniker (Gast)


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)


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)


Lesenswert?

PC_1 sendet Ping an Mikrocontroller
PC_2 sendet Ping an Mikrocontroller

von Techniker (Gast)


Lesenswert?

Mit Wireshark bekomme ich keine neuen Erkenntnisse.

von Techniker (Gast)


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)


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)


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)


Lesenswert?

Wie müsste die Callbackfunktion ohne connect Funktion implementiert 
werden?

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


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.