Hilfestellung LWIP-Stack

Gast #4930597
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!
Gast #4930808
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.
Gast #4930822
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 ....
(Firma: keine) #4933466
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.
Gast #4933481
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren