Forum: PC-Programmierung LWIP: DEBUG Ausgabe


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 Leo (Gast)


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


Bewertung
0 lesenswert
nicht lesenswert
Wie kann man den zweiten Parameter von LWIP_DEBUGF in ein char Array 
kopieren?

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Leo schrieb:
> XMC_DEBUG

Wie ist das definiert?

von Leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
 #define XMC_DEBUG(msg) { XMC_SWO_PrintString(msg); }

von Leo (Gast)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


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


Bewertung
0 lesenswert
nicht lesenswert
Was müsste ich jetzt genau tun?

von Leo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wo müsste das printf nun eingefügt werden?

von Jim M. (turboj)


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


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


Bewertung
0 lesenswert
nicht lesenswert
Warum soll ich printf ausführen?

von Rolf M. (rmagnus)


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


Bewertung
0 lesenswert
nicht lesenswert
Und wo müsste printf ausgeführt werden?

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
In dem Macro, dem Dein unseliger Ausdruck übergeben wird, wo denn sonst?

von Leo (Gast)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


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


Bewertung
0 lesenswert
nicht lesenswert
Ok mich würde es trotzdem gerne wissen wie man dies realisiert.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


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

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.