Forum: PC-Programmierung LWIP: DEBUG Ausgabe


von Leo (Gast)


Lesenswert?

Hallo,

für Testzwecke soll die Serial Wire Output Schnittstelle eingesetzt 
werden.
Die Ausgabe mit dem define "LWIP_PLATFORM_DIAG" funktioniert.
1
void XMC_SWO_PrintString(const char *s)
2
{
3
  //
4
  // Print out character per character
5
  //
6
  while (*s)
7
  {
8
    XMC_SWO_PrintChar(**s++);
9
  }
10
}
11
12
#define LWIP_PLATFORM_DIAG(x) do {XMC_DEBUG(x);} while(0)

Das Anzeigen sämtliche Informationen vom LWIP-Stack erfolgt über das 
define "LWIP_DEBUGF". Allerdings bleibt der Mikrocontroller stehen, 
sobald dieses define ausgeführt wird.
1
#define LWIP_DEBUGF(debug, message) LWIP_PLATFORM_DIAG(message);

Erste Verwendung von LWIP_DEBUGF:
1
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));

von Leo (Gast)


Lesenswert?

Wie kann man den zweiten Parameter von LWIP_DEBUGF in ein char Array 
kopieren?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Leo schrieb:
> XMC_DEBUG

Wie ist das definiert?

von Leo (Gast)


Lesenswert?

1
 #define XMC_DEBUG(msg) { XMC_SWO_PrintString(msg); }

von Leo (Gast)


Lesenswert?

Das Problem müsste am zweiten Parameter von LWIP_DEBUGF liegen.
1
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Leo schrieb:
> LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));

Wie soll das funktionieren?

Das zweite Argument dieses Macros scheint
1
(", port = %"U16_F")\n", port)

zu sein, im nachfolgenden aber rufst Du keine printf-Variante auf, und 
XMC_SWO_PrintString erwartet genau ein Argument.

von Leo (Gast)


Lesenswert?

Was müsste ich jetzt genau tun?

von Leo (Gast)


Lesenswert?

Wo müsste das printf nun eingefügt werden?

von Jim M. (turboj)


Lesenswert?

Leo schrieb:
> while (*s)
>   {
>     XMC_SWO_PrintChar(**s++);
>   }

Na, fast. Da ist eine Indirektion zuviel drin.

Es müsste
1
while (*s)
2
   {
3
     XMC_SWO_PrintChar(*s++);
4
   }

heissen.

Das mit dem printf() wird mir zu kompliziert.

von Leo (Gast)


Lesenswert?

Habe ich bereits auch gesehen und abgeändert.

Sobald diese Zeile ausgeführt wird bleibt der Mikrocontroller stehen:
1
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port));

Wie kann veranlasst werden das dieser Ausdruck
1
(", port = %"U16_F")\n", port)
zu einem einzigen String umgewandelt werden kann?

von Leo (Gast)


Lesenswert?

Warum soll ich printf ausführen?

von Rolf M. (rmagnus)


Lesenswert?

Leo schrieb:
> Warum soll ich printf ausführen?

Na weil es genau das tut:

Leo schrieb:
> Wie kann veranlasst werden das dieser Ausdruck
> (", port = %"U16_F")\n", port)
> zu einem einzigen String umgewandelt werden kann?

von Leo (Gast)


Lesenswert?

Und wo müsste printf ausgeführt werden?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

In dem Macro, dem Dein unseliger Ausdruck übergeben wird, wo denn sonst?

von Leo (Gast)


Lesenswert?

1
 #define XMC_DEBUG(msg) { XMC_SWO_PrintString(printf(msg)); }

Das funktioniert nicht. Controller bleibt stehen sobald die while 
Schleife ausgeführt wird.
1
void XMC_SWO_PrintString(const char *s)
2
{
3
  //
4
  // Print out character per character
5
  //
6
  while (*s)
7
  {
8
    XMC_SWO_PrintChar(*s++);
9
  }
10
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Leo schrieb:
> Das funktioniert nicht. Controller bleibt stehen sobald die while
> Schleife ausgeführt wird.

Natürlich funktioniert das nicht.

Hast Du Dir schon mal angesehen, was printf macht?

Lass das alles bleiben, und verwende irgendwas anderes, das Dir bekannt 
ist, was Deine gewünschte Ausgabe in ein /char/-Array packt und rufe 
Deine Debugausgabefunktion mit diesem Array als Parameter auf.

Das ist für Dich und für uns hier sicherlich einfacher.

von Leo (Gast)


Lesenswert?

Ok mich würde es trotzdem gerne wissen wie man dies realisiert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lies Dir in Deinem C-Buch mal durch, was der Unterschied zwischen printf 
und sprintf ist.

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.