Forum: Compiler & IDEs Printf in workpad (myavr)


von Andre H. (andre01)


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

von Stefan B. (stefan) Benutzerseite


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:
1
#include <stdio.h>
2
3
int main(void)
4
{
5
        printf("hello world\n");
6
        return 0;
7
}

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:
1
Using built-in specs.
2
Target: avr
3
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
4
Thread model: single
5
6
gcc version 4.1.2 (WinAVR 20070525rc2)
7
 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
8
ignoring nonexistent directory "d:/winavr/bin/../avr/sys-include"
9
#include "..." search starts here:
10
#include <...> search starts here:
11
 d:\winavr\bin\../lib/gcc/avr/4.1.2/include
12
 d:/winavr/bin/../lib/gcc/avr/4.1.2/include
13
 d:/winavr/bin/../avr/include
14
End of search list.
15
16
GNU C version 4.1.2 (WinAVR 20070525rc2) (avr)
17
  compiled by GNU C version 3.4.2 (mingw-special).
18
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=65382
19
Compiler executable checksum: 6cb61b577d0fe875bbba013042fc8c21
20
 d:/winavr/bin/../lib/gcc/avr/4.1.2/../../../../avr/bin/as.exe --traditional-format -o f:\temp/ccf6XYzf.o f:\temp/ccH1zqwg.s
21
 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?

von Andre H. (andre01)


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:
1
compilieren ...  In file included  from printf.cc:1:  
2
 
3
stdio.h:45  45:20: stdarg.h: Datei nicht gefunden. 
4
stdio.h:49  49:20: stddef.h: Datei nicht gefunden. 
5
 In file included  from printf.cc:1:  
6
 
7
stdio.h:598  598: error: `va_list' has not been declared 
8
stdio.h:604  604: error: `va_list' has not been declared 
9
stdio.h:653  653: error: `va_list' has not been declared 
10
stdio.h:675  675: error: `size_t' has not been declared 
11
stdio.h:681  681: error: `size_t' has not been declared 
12
stdio.h:687  687: error: `va_list' has not been declared 
13
stdio.h:693  693: error: `va_list' has not been declared 
14
stdio.h:703  703: error: `size_t' has not been declared 
15
 703: error: `va_list' has not been declared 
16
stdio.h:709  709: error: `size_t' has not been declared 
17
 709: error: `va_list' has not been declared 
18
stdio.h:752  752: error: `size_t' does not name a type 
19
stdio.h:830  830: error: `size_t' does not name a type 
20
stdio.h:1008  1008: error: `va_list' has not been declared 
21
stdio.h:1013  1013: error: `va_list' has not been declared 
22
stdio.h:1046  1046: error: `va_list' has not been declared 
23
printf.cc:7  7:2: warning: no newline at end of file 
24
stdio.h:693  693: error: `va_list' has not been declared 
25
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

von Stefan B. (stefan) Benutzerseite


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...

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

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

von Andre H. (andre01)


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

von Michael G. (Gast)


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

von yalu (Gast)


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-Tutorial#Die_Nutzung_von_printf

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

von Michael G. (Gast)


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

von Andre H. (andre01)


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

von yalu (Gast)


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.

von Andre H. (andre01)


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 ?


1
#include <stdio.h>
2
3
int main(void)
4
{
5
        printf("hello world\n");
6
        return 0;
7
}

André H.

von Stefan B. (stefan) Benutzerseite


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-Tutorial#Die_Nutzung_von_printf

von Andre H. (andre01)


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

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

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-Tutorial#Die_Nutzung_von_printf

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

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.