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
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
> 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.
@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
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.
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
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 :-)
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.
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.
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? :)
> 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.
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).
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.