mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sprintf im debug modus


Autor: Mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

bin seit einer Woche am Testen und Suchen wie man sprintf benutzt.
Ich will im debugmodus (software) einen string in der Message Box 
ausgeben.
Mit dem Keil uVision Studio klappt es, aber da habe ich probleme
beim Import von meinen AVR-Libs.

Ich versuch das jetzt mit CodeVision, aber CodeVision benutzt den Debug 
von dem Avr Studio - da klappt es nicht.
Weiss jemand vielleicht ob das überhaupt geht (im AVR Studio debug modus 
in der Message Box mit hilfe von sprintf strings auszugeben) ,
oder muss ich im AVR Studio einen LCD-Output simulieren (wie auch 
immer...) um da die einzigen chars auszugeben?

Danke vielmals im Voraus

Grüsse  -  Mischa

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sprichst du hier von Simulation oder ICD?
Das wird mir nicht so richtig klar.

Gruß Skriptkiddy

Autor: Mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi skriptkiddy, ich spreche von einer Simulation. Keine ICD.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit [1] kann man einen UART simulieren und auch Ausgaben 
darufschicken. Spielt ohne Problme mit AVRStudio zusammen. CVAVR kenne 
ich nicht. Müsste man mal schauen, ob es damit auch möglich ist.

[1]http://www.helmix.at/hapsim/

Gruß Skriptkiddy

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit dem Keil uVision Studio klappt es, aber da habe ich probleme
> beim Import von meinen AVR-Libs.
**verwirrt**

Keil µVision kann Code für 8051, C166 und ARM übersetzen - keinen AVR 
code.

Was meinst du mit "Message Box" ? Das UART oder Printf - Window?

Für die UARTs existiert eine Simulation, darum siehst du da die Zeichen 
und kannst eintippern.

Für ITM printf gibt es ebenfalls eine Simulation, und im Target Mode 
werden die ITM printf Daten (falls im Debugger (ULINK, JLink) 
konfiguriert), auch im printf Window ausgegeben.

Das printf da rauskommt, liegt am retargeting. Entweder fputc() 
überladen, oder auf unterster Ebene (vgl. retarget.c).


VG,
/th.

Autor: Mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Skript Kiddy - danke, das Tool kenne ich, damit gehts auch mehr oder 
weniger (leider nicht mit AVR Simulator 2, aber auch gut).

@thorstendb, Skript Kiddy

Was ich eigentlich will ist die Ausgabe von Variablenwerten OHNE eine 
UART o.ä. zu verwenden. In dem Programm AVR Studio gibts ja eine 
"Message"-Anzeige, da wo Fehler oder Nachrichten erscheinen,
wie z.B. " Build succeeded with 0 Warnings..." sooo, jetzt will ich 
lediglich während des Debugs in dieser Anzeige meine Variablen 
auszugeben.

Das ist mit vielen verschiedenen Programmen ohne weiteres möglich:
 - in Eclipse für Java gehts mit "system.out.println()"
 - in Keil uVision mit sprintf()

Geht das auch so einfach mit AVR-Studio?

Danke vielmals im Voraus,
Grüsse - Mischa

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.W. klar: nein

Du hast auf einem AVR kein stdout, solange du es dir nicht baust.
sprintf() kannst du natürlich aufrufen, aber das schreibt ja nur
in einen String (char[]).

printf() gibt es auch, aber dazu muß man vorher stdout definieren.
Das wiederum geht damit: 
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: Mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, heisst es dass die Ausgabe in eine Datei erfolgt?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo soll ein AVR eine Datei haben?

Nein, das heißt, daß du eine Funktion schreiben musst, die
ein Zeichen ausgibt (wohin auch immer du es haben willst: UART,
LCD, ...) und diese Funktion als Parameter get an fdevopen()
übergibst.
Ab dann kannst du mit printf(), puts(), putchar() etc. auf
die jetzt existierende Standardausgabe schreiben und
alles läuft über deine eigene Funktion, Zeichen für Zeichen.

Wenn du diese eigene Funktion dazu bringst, in eine Datei zu
schreiben, dann landet stdout dort.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mischa schrieb:
> Geht das auch so einfach mit AVR-Studio?
Nein das geht nicht. Und mit sprintf alleine schon garnicht. Du solltest 
dir mal ein C-Buch zu Gemüte führen. Dann wird vieles hier im Thread 
bereits Erwähnte wesentlich klarer.


Schau mal hier:
AVR-GCC-Tutorial/Der UART

An uart_puts übergibst du dann nach dem Initialisieren des UART die 
Zeichenkette, die mit sprintf erstellt wurde. Und schon sollte die 
in hapsim zu sehen sein. Versuche aber der Einfachheit halber zuerst den 
UART an sich in Betrieb zu nehmen. Am besten in einem eigenen Projekt. 
Wenn du dann Text im hapsim siehst, dann kannst du die Routinen in dein 
jetziges Projekt integrieren.

Wenn du aber blos Variableninhalte sehen willst, dann reicht prinzipiell 
schon ein "watch". Printf-Debugging lohnt sich IMHO erst, wenn du in der 
Schaltung debuggen willst.


Gruß Skriptkiddy

Autor: Mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus Wachtler - gibts dafür vielleicht schon was fertiges?

@Skriptkiddy - danke Watch ist ein SUPER Tip.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  - in Keil uVision mit sprintf()

wie?

Autor: Mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Random ... schrieb:
>>  - in Keil uVision mit sprintf()
>
> wie?

so: http://et-tutorials.de/1156/c-syntax-getchar-und-prinf/

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LOL, da wird ein printf retargeting über den 8051 Monitor gemacht :-)

Der µVision Debugger hat sogar Fenster, mit denen man sich die Werte von 
Variablen ganz bequem ansehen kann, ohne so verrückte Umwege :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke nicht, dass das geht.
Die Frage ist doch: Bietet AVR-Studio eine Schnittstelle an, mit der man 
ins Output Fenster schreiben kann. Wenn ja, könnte man eventuell eine 
put Funktion patchen, so dass sie das tut und dieses mittels fdevopen 
einer Debug-Version unterjubeln.
Das Problem ist, dass das so nicht gehen wird, denn dein Programm 
arbeitet ja in einem simuliertem AVR, der nicht so einfach auf seinen 
Host, eben das AVR-Studio duchgreifen kann.
So eng ist WinAVR dann auch wieder nicht in AVR-Studio integriert. Da 
müsste der Simulator wesentlich mehr über WinAvr und seinen C-Code 
wissen, damit er zb Schreibzugriffe auf eine ganz bestimmte 
Speicherzelle abfängt und als Ausgaben auf sein eigenes Output Fenster 
interpretiert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Random ... schrieb:
> LOL, da wird ein printf retargeting über den 8051 Monitor gemacht :-)
>
> Der µVision Debugger hat sogar Fenster, mit denen man sich die Werte von
> Variablen ganz bequem ansehen kann, ohne so verrückte Umwege :-)

Oh. So verrückt ist das gar nicht.
Im VC++ Dev Studio ist das genau die Funktionalität die man mit den 
TRACE Makros erreicht, die ich zur Zeit gerade extensiv nutze, um eine 
Geometrieoperation zu debuggen :-)
Entweder man hat sowas, wie eine Ausgabefläche, auf der man einfach 
ausgeben kann, oder es ist Handarbeit mit Papier und BLeistift angesagt 
um sich einen Log der Veränderungen an den Daten zu machen.

Autor: Mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, super und vielen Dank für die Aufklärung
Ich verwende dann einfach das Watch-Fenster.

Beim Lernen von C will man ab und zu wissen, ob man den Variablen die 
richtigen Werte zugeordnet hat oder nicht.

Verwendet eigentlich einer hier lieber das CV-AVR als AVR-Studio? :)

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mischa schrieb:
> so: http://et-tutorials.de/1156/c-syntax-getchar-und-prinf/

Da wird printf verwendet. Und das geht auch nur so ohne Weiteres, weil 
sich der Compiler um die stdio kümmert. Printf zielt IMHO beim Keil C51 
ohne eigenes Retargeting auf den UART.

Gruß Skriptkiddy

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Im VC++ Dev Studio ist das genau die Funktionalität die man mit den
> TRACE Makros erreicht,

klar, benutze ich auch sehr oft, meist in Verbindung mit GetTickCount().

Nur - es ist recht mühsam und Codebeeinflussend, ein printf-debugging zu 
machen, mühsamer, als sich das schnell in einem der Fenster anzeigen zu 
lassen, oder sogar im Logic Analyzer zu visualisieren.

Daher "ohne so verrückte Umwege".
Printf-Debugging gehört zu meinen C-Einsteigersünden, als ich noch 
keinen Debugger hatte und einfach nur per MISO/MOSI meinen Code in den 
AVR geballert und am UART printf-gedebugt hab :-)


VG,
/th.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Nein, das heißt, daß du eine Funktion schreiben musst, die
> ein Zeichen ausgibt (wohin auch immer du es haben willst: UART,
> LCD, ...) und diese Funktion als Parameter get an fdevopen()
> übergibst.

Ich meinte natürlich put (und nicht get).

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Random ... schrieb:
> Printf-Debugging gehört zu meinen C-Einsteigersünden, als ich noch
> keinen Debugger hatte und einfach nur per MISO/MOSI meinen Code in den
> AVR geballert und am UART printf-gedebugt hab :-)

ok, dann bin ich auch Einsteiger.
Ich mache das bei Bedarf nach wie vor so, und habe nicht mal
ein schlechtes Gewissen.

Wenn mehrere Sachen gleichzeitig passieren, ist ein Debugger
auch nur bedingt hilfreich und verfälscht oft das Zeitverhalten.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.