mikrocontroller.net

Forum: Compiler & IDEs Printf in workpad (myavr)


Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
hatte das schon im anderen forum gepostetaber hier ist das wohl 
richtiger...

ich bin neu bein den AVR´s und versuche nun mit der C-programmierung.
Aus diesem Grund habe ich mir das MyAvr board und die Workpad software
gekauft. Die ersten kleinen programme funtionieren auch ganz gut aber
nun habe ich einmal versucht die Stdio.h einzubinden, damit ich die
printf Funktionen benutzen kann. leider funktioniert das überhaupt
nicht. Gibt nur Fehlermeldungen weil er irgend eine stdarg.h nicht
findet.

Wenn ich das richtig verstanden habe beruht die ganze sache auf den
WInavr compiler...


Kann mir da vielleicht jemand helfen wie ich zu dem Printf befehl komme?

MfG
A.Hübner

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Suchen nach Hilfe ist es sehr hilfreich, wenn du die exakten 
Quelltexte und Fehlermeldungen an gibst.

Exakt kann ich dir nicht helfen, weil myAVR Workpad PLUS nicht unter 
Windows 98SE läuft (steht auch so in der Spezifikation von 
www.myavr.de). Es wird übrigens WinAVR 20060421 verwendet.

Beim normalen WinAVR ist folgendes Programm kompilierbar:
#include <stdio.h>

int main(void)
{
        printf("hello world\n");
        return 0;
}

Kompilieren kann man es mit folgender Kommandozeile:
> avr-gcc -v printf.c -o printf.elf

Woraufhin durch die -v (verbose=ausführlich) Option sowas wie diese 
Ausgabe erzeugt wird:
Using built-in specs.
Target: avr
Configured with: ../gcc-4.1.2/configure --prefix=/c/WinAVR --target=avr --enable-languages=c,c++ --with-dwarf2 --enable-win32-registry=WinAVR-20070525rc2 --disable-nls --with-gmp=/usr/local --with-mpfr=/usr/local --enable-doc --disable-libssp
Thread model: single

gcc version 4.1.2 (WinAVR 20070525rc2)
 d:/winavr/bin/../libexec/gcc/avr/4.1.2/cc1.exe -quiet -v -iprefix d:\winavr\bin\../lib/gcc/avr/4.1.2/ printf.c -fno-delete-null-pointer-checks -quiet -dumpbase printf.c -auxbase printf -version -o f:\temp/ccH1zqwg.s
ignoring nonexistent directory "d:/winavr/bin/../avr/sys-include"
#include "..." search starts here:
#include <...> search starts here:
 d:\winavr\bin\../lib/gcc/avr/4.1.2/include
 d:/winavr/bin/../lib/gcc/avr/4.1.2/include
 d:/winavr/bin/../avr/include
End of search list.

GNU C version 4.1.2 (WinAVR 20070525rc2) (avr)
  compiled by GNU C version 3.4.2 (mingw-special).
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=65382
Compiler executable checksum: 6cb61b577d0fe875bbba013042fc8c21
 d:/winavr/bin/../lib/gcc/avr/4.1.2/../../../../avr/bin/as.exe --traditional-format -o f:\temp/ccf6XYzf.o f:\temp/ccH1zqwg.s
 d:/winavr/bin/../lib/gcc/avr/4.1.2/../../../../avr/bin/ld.exe -m avr2 -o printf.elf d:/winavr/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/crts8515.o -Ld:/winavr/bin/../lib/gcc/avr/4.1.2 -Ld:/winavr/bin/../lib/gcc -Ld:/winavr/bin/../lib/gcc/avr/4.1.2 -Ld:/winavr/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib -Ld:/winavr/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib f:\temp/ccf6XYzf.o -lgcc -lc -lgcc

Man kann erkennen, dass ich gerade mit dem RC2 des neuen WinAVR 
rumexperimentiere und wie die Pfade zu bestimmen Dateien auf meinem PC 
lauten.

Ein "beliebtes" Problem bei Pfaden sind Leer- und Sonderzeichen im Pfad. 
Hast du myAVR Workpad PLUS auch so installiert, dass diese nicht 
vorkommen?

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

ich habe das mal mit dem Programm versucht. Habe mir den code kopiert 
und ihn in den Workpad eingefügt.
Als Meldungen kam:
compilieren ...  In file included  from printf.cc:1:  
 
stdio.h:45  45:20: stdarg.h: Datei nicht gefunden. 
stdio.h:49  49:20: stddef.h: Datei nicht gefunden. 
 In file included  from printf.cc:1:  
 
stdio.h:598  598: error: `va_list' has not been declared 
stdio.h:604  604: error: `va_list' has not been declared 
stdio.h:653  653: error: `va_list' has not been declared 
stdio.h:675  675: error: `size_t' has not been declared 
stdio.h:681  681: error: `size_t' has not been declared 
stdio.h:687  687: error: `va_list' has not been declared 
stdio.h:693  693: error: `va_list' has not been declared 
stdio.h:703  703: error: `size_t' has not been declared 
 703: error: `va_list' has not been declared 
stdio.h:709  709: error: `size_t' has not been declared 
 709: error: `va_list' has not been declared 
stdio.h:752  752: error: `size_t' does not name a type 
stdio.h:830  830: error: `size_t' does not name a type 
stdio.h:1008  1008: error: `va_list' has not been declared 
stdio.h:1013  1013: error: `va_list' has not been declared 
stdio.h:1046  1046: error: `va_list' has not been declared 
printf.cc:7  7:2: warning: no newline at end of file 
stdio.h:693  693: error: `va_list' has not been declared 
D:/Programme/myAvrWorkpad/winavr/avr/include/stdio 
ich kann mit den Meldungen nicht viel anfange, aber denke mal das die 
include stdio.h gefunden wurde und auch versucht wird sie einzufügen.

Mfg
A.Hübner

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jau. Fast alle Meldungen sind Folgefehler von den beiden ersten Fehlern. 
Die gesuchten Dateien sind vorhanden, aber sie werden nicht gefunden. 
Der in avr-gcc.exe einkompilierte Pfad plus dessen Erweiterung ab dem 
aktuellen Verzeichnis funktioniert nicht. Ich habe nur eine Mutmaßung 
dass dieser zusammengesetzte Pfad zu lang ist. Ich würde versuchen 
WinAVR auf eine "Standardart" zu installieren z.B. unter c:\winavr. Dazu 
den Winavr Ordner verschieben und diese Einträge in der 
Environmentvariablen PATH anpassen: 
PATH=c:\winavr\bin;c:\winavr\utils\bin;...Rest vom PATH...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Standardart" ... sehr schön. Einen klitzekleinen Moment lang dachte ich 
schon ... aber das ist dann ja gerade nochmal gutgegangen.

Um diese Probleme genauer zu diagnostizieren, könnte man Sysinternals' 
Filemon verwenden, das zeigt an, mit welchem Pfad auf die Dateien 
zugegriffen wird.

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Filemon ist ein guter Tipp. Ich habe jetzt die Demo von myAvrWorkpad 
Plus testweise installiert und gesehen, dass man da fast nix tunen kann. 
Nur den Pfad zu WinAVR an sich kann man einstellen. Bei mir hat 
E:\Temp\myAvrWorkpad\WinAVR noch geklappt. Testfile ist im Anhang

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für dir antworten aber funktionoieren tut das immer noch 
nicht.
habe das Workpad schon mal runtergeworfen und neu installiert aber der 
Fahler bleibt.
ich habe das gefühl das ich die beiden Dateien in der Stdio verlangt 
weren garnicht besitzte....

Habe auch mal die von Myavr kontatiert aber die lassen schon ein paar 
Tage auf sich warten...

Mfg Andre

Autor: Michael G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bin gerade auf eure Diskussion gestoßen, ich habe das selbe Problem.
Hab ein RN-Control mit ATmega32, welchem ich zum Einstieg ein einfaches 
"Hallo Welt" Proggi schreiben wollte.

Folgender Code:
===============
#include <stdio.h>

int main(void)
{
        printf("hello world\n");
        return 0;
}

Folgede Fehlermeldung:
=======================
root@slax:~# avr-gcc -L /usr/local/bin/lib/gcc/avr/4.1.1/ -I 
/usr/local/bin/avr/include/ -mmcu=atmega32 -O3 -c 
/root/Desktop/firsttest/A.c -o A.o
In file included from /root/Desktop/firsttest/A.c:2:
/usr/local/bin/avr/include/stdio.h:45:20: error: stdarg.h: No such file 
or directory
/usr/local/bin/avr/include/stdio.h:49:20: error: stddef.h: No such file 
or directory
In file included from /root/Desktop/firsttest/A.c:2:
/usr/local/bin/avr/include/stdio.h:598: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:598: warning: conflicting types for 
built-in function 'vfprintf'
/usr/local/bin/avr/include/stdio.h:604: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:653: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:653: warning: conflicting types for 
built-in function 'vprintf'
/usr/local/bin/avr/include/stdio.h:675: error: expected declaration 
specifiers or '...' before 'size_t'
/usr/local/bin/avr/include/stdio.h:675: warning: conflicting types for 
built-in function 'snprintf'
/usr/local/bin/avr/include/stdio.h:681: error: expected declaration 
specifiers or '...' before 'size_t'
/usr/local/bin/avr/include/stdio.h:687: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:687: warning: conflicting types for 
built-in function 'vsprintf'
/usr/local/bin/avr/include/stdio.h:693: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:703: error: expected declaration 
specifiers or '...' before 'size_t'
/usr/local/bin/avr/include/stdio.h:703: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:703: warning: conflicting types for 
built-in function 'vsnprintf'
/usr/local/bin/avr/include/stdio.h:709: error: expected declaration 
specifiers or '...' before 'size_t'
/usr/local/bin/avr/include/stdio.h:709: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:752: error: expected '=', ',', ';', 
'asm' or '__attribute__' before 'fwrite'
/usr/local/bin/avr/include/stdio.h:830: error: expected '=', ',', ';', 
'asm' or '__attribute__' before 'fread'
/usr/local/bin/avr/include/stdio.h:1008: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:1008: warning: conflicting types for 
built-in function 'vfscanf'
/usr/local/bin/avr/include/stdio.h:1013: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:1046: error: expected declaration 
specifiers or '...' before 'va_list'
/usr/local/bin/avr/include/stdio.h:1046: warning: conflicting types for 
built-in function 'vscanf'
root@slax:~#



Das mit dem zu langen Pfad würde ich ausschließen, daran sollte es nicht 
liegen. Die beiden fehlenden Daten werden bon der stdio.h benötigt, sie 
sind ebenfalls mit include in das File eingebunden. Im Filesystem sind 
sie jedoch nicht vorhanden, obwohl sie im selben Verzeichnis liegen 
sollten.

Zum übersetzen verwende ich auch avr-gcc aus der "KontrollerLab" IDE 
unter Linux heraus (Slackware LiveCD mit Entwicklungsumgebung und Tools 
zum programmieren von AVR Controllern, gibts bei roboternetz.de)

Wie kommte ich nun an diese beiden Files, ohne sie wäre die sdtio.h ja 
komplett nutzlos.

Hoffe ihr könnt mir helfen.

Gruß

Michael

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael G.:

Deine Verzeichnisstruktur scheint wild durcheinandergewürfelt zu sein,
das zeigt schon die Notwendigkeit der Optionen

  -L /usr/local/bin/lib/gcc/avr/4.1.1/
  -I /usr/local/bin/avr/include/

beim Aufruf des Compilers.


auch @Andre H. und andere mit ähnlichen Problemen:

Prüft mal nach, ob eure GCC-Installation halbwegs korrekt ist:

Ist INSTALL das Installationsverzeichnis des AVR-GCC-Pakets, dann
liegen Programme, Header-Files und Bibliotheken in folgenden
Verzeichnissen:

In INSTALL/bin
  liegen die vom Benutzer aufgerufenen Tools wie z. B. avr-gcc, avr-as
  und avr-ld.

In INSTALL/avr/include
  liegen Header-Files der AVR-libc, z. B. stdio.h, stdint.h und
  stdlib.h.

In INSTALL/avr/lib
  liegen die Laufzeitbibliotheken der AVR-libc, z. B. libc.a, libm.a
  und crt*.o.

In INSTALL/lib/gcc/avr/4.1.1/include
  liegen compilerspezifische Header-Files, z. B. stddef.h, stdarg.h
  und limits.h.

In INSTALL/lib/gcc/avr/4.1.1
  liegen compilerspezifische Laufzeitbibliotheken, z. B. libgcc.a.

In INSTALL/libexec/gcc/avr/4.1.1
  liegen ausführbare Programme, die nicht vom Benutzer selbst, sondern
  vom avr-gcc aufgerufen werden, z. B. cc1.

Die 4.1.1 in den Pfaden ist natürlich durch die jeweilige GCC-Version
zu ersetzen.

Wichtig ist die relative Lage der genannten Verzeichnisse zueinander.
Während INSTALL als Ganzes umbenannt oder verschoben werden darf, muss
die Verzeichnisstruktur innerhalb von INSTALL den genannten Vorgaben
entsprechen, sonst kommt es zu "no such file"-Fehlern.

Ist die Installation korrekt, sollte das Hello-Programm mit printf
ohne jegliche -L- und -I-Optionen kompilieren und linken.

Das heißt aber nicht, dass das Programm auch das gewünschte tut.

> ein einfaches "Hallo Welt" Proggi

Ganz so einfach ist es nämlich nicht. Da ein Mikrocontroller kein
standardisiertes Ausgabemedium wie einen Bildschirm hat, braucht ein
"Hallo Welt" auf einem AVR etwas mehr als nur eine printf-Zeile. Was
zu tun ist, um die Standardausgabe auf die serielle Schnittstelle zu
leiten, steht hier:

  http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Im Gegensatz zur PC-Programmierung ist das erste Programm auf
Mikrocontrollern deswegen nicht "Hallo Welt", sondern eines, das eine
angeschlossene LED einschaltet.

Autor: Michael G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo yalu,
danke für deine schnelle Antwort.
Was meine GCC Installation angeht:
Das gleiche habe ich mir auch schon gedacht.
Leider gibt mir das die LiveCD, die ich verwende aber schon vor, da kann 
ich leider nix mehr dran ändern. Alles andere läuft da aber wirklich 
klasse (Die IDE ist super).
Ich hab inzwischen die benötigten Dateien einfach in das 
standard-Include Verzeichnis kopiert und schon funktioniert die Sache.

Was die Ausgabe von Text angeht, bin ich gerade dabei mich in UART 
einzuarbeiten, bin mal gespannt, hoffe das klappt ohne größere Probleme.

Gruß

Michael

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ yalu

Also ich hab mal nachgeschaut was du meintest.
Dieses Verzeichnis:
In INSTALL/lib/gcc/avr/4.1.1/include
  liegen compilerspezifische Header-Files, z. B. stddef.h, stdarg.h
  und limits.h.
Habe ich überhaupt nicht.

Im workpad ist auch die version 3.4.6 verbaut. gibt es eine möglichkeit 
das irgendwie zu updaten ?

MfG
Andre

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann schon sein, dass man bspw. ein WinAVR ins Workpad hinein
installieren kann. Der sicherere Weg ist aber wahrscheinlch, WinAVR in
ein getrenntes Verzeichnis zu installieren und anschließend die
Unterverzeichnisse mit den benötigten Komponenten in die
entsprechenden Workpad-Verzeichnisse zu kopieren.

Meine Ausdrucksweise ist deswegen etwas unsicher, weil ich mich weder
mit Workpad noch mit WinAVR auskenne. Da man aber nicht viel kaputt
machen kann (notfalls alles neuinstallieren), würde ich an deiner
Stelle den Update durchaus mal probieren.

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich habe nun mal die fehlenden stdio.h usw. ind das include 
verzeichnis rein kopiert.
Beim compilieren wird nicht mehr rumgemeckert. so nun muß ich wohl nur 
noch die das programm dazu bringen das er mir den printf befehl über die 
com schnittstelle sendet.
Ich denke mal das ich an dem oben beschriebenen Zeilen noch etwas mehr 
eintragen muß damit das geht oder ?


#include <stdio.h>

int main(void)
{
        printf("hello world\n");
        return 0;
}

André H.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne myAVR nicht en detail. Speziell weiss ich nicht, worauf der 
Ausgabestrom 'stdout' defaultmäßig gerichtet ist und ob das Board eigene 
Initialisierungsroutinen hat.

Damit printf über die serielle Schnittstelle ausgibt, müsste 1) stdout 
auf die serielle Schnittstelle gerichtet sein und 2) die serielle 
Schnittstelle müsste korrekt initialisiert sein.

Wie sowas "von Hand zu Fuss" bei einem nackigen Board aussieht steht 
hier:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also irgenwie habe ich damit noch ein problem...
Wenn ich das aus dem Tutorial nehme dann meckert der compiler.

-snip-
unbenannt.cc:1  1: error: invalid token
 1: error: expected unqualified-id before '/' token
unbenannt.cc:3  3: error: `FILE' does not name a type
unbenannt.cc:5  5: error: `FILE' has not been declared
unbenannt.cc:6  6: error: ISO C++ forbids declaration of `stream' with 
no type
unbenannt.cc  In function `int uart_putchar(char, int*)':

-snip-

was will der denn da von mir.

Hat jemand vielleicht mal so ein einfaches, kommentiertes Ausgange 
programm für nen Mega8.

MfG
Andre

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich das aus dem Tutorial nehme dann meckert der compiler.

Was aus welchem Tutorial meinst du? Ich habe dir ein komplettes Projekt 
(Quellcode + eingepackt. Das kann mit WinAVR per "make all" übersetzt 
werden. Es sollte auf das myAVR Board passen (ATmega8 bei 3,686400 MHz, 
9600 Baud 8N1).

> unbenannt.cc:1  1: error: invalid token

Die Quelldatei ist C++ Code. Du solltest im C Modus arbeiten. Die C 
Quelldatei im Archiv oben heisst test.c. Sie enthält 1:1 den Code aus 
dem (jetzt ergänzten) 2. Beispiel aus 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht solltest du ja auch nicht gerade gleich mit C++ losschießen.

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.