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
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?
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
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...
"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.
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
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
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
@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.
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
@ 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
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.
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.
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
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.