ich will mich in C fuchsen und hab dazu mittlerweile alle Hürden geschaft, kann nun Quelltext schreiben und compilieren und nun auch in den AVR laden. Soweit alles wunderbar. Aber: da ich einen kleinen Webserver aufbauen möchte und mich das Projekt von Ulrich Radig interessiert habe ich seinen Quellcode geladen und in PN2 geöffnet. will ich nun compilieren klappt das nicht, obwohl ich die unveränderten original Dateien von seiner Website verwende. Der Compiler beendet mit follgender Meldung: --- Compiling: main.c avr-gcc -c -mmcu=atmega128 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 main.c -o main.o In file included from main.c:51: ./device.c: In function `Write_Ethernet_Frame': ./device.c:154: error: invalid lvalue in unary `&' In file included from main.c:76: ./interrupt4.c: In function `__vector_5': ./interrupt4.c:120: error: invalid lvalue in unary `&' ./interrupt4.c:126: error: invalid lvalue in unary `&' make.exe: *** [main.o] Error 1 > Process Exit Code: 2 --- mir stellt sich die Frage, was ich falsch eingestellt haben könnte bzw. was am Code falsch ist. in der Datei device.c gibt es in Zeile 154 garkein & Zeichen. in der 2ten Datei sieht es in den beiden Zeilen genauso trübe für & Zeichen aus. Ich kann leider nur rätselraten: zB. müssen alle .c Dateien im makefile eingetragen werden, auch wenn sie in der main.n includiert werden? Vielleicht hängt es auch ganz woanders. wenn jemand einen Tip hat bitte hier melden. Ich wollte das Archiv von Ulrichs Webserver neu laden, konnte das aber nicht, weil sich der Browser scheinbar in einer Reload Endlosschleife aufhängt. Ich hab nur die Dateien der Version 1.04 auf Platte gelagert. Welche Version die Aktuelle ist weiß ich leider auch nicht. Danke schonmal für jede Hilfe in Voraus!
Ein &-Zeichen muss da auch gar nicht stehen. Das bedeutet eigentlich meistens, dass da irgendeine nicht zulässige Zuweisung gemacht wurde. Schreib doch mal die bemängelten Zeilen hier rein.
hallo, Der Code wurde nunmehr von mehreren Personen getestet ich nehme mal nicht an das es am Code liegt. @Henning gebe mal Nachricht ob die Einstellungen klappen die ich zugemailt habe. Mfg Ulrich
den kompleten source Code gibt es hier: http://www.ulrichradig.de/ http://www.ulrichradig.de/site/avr_webserver/OpenSource/SourceCodeCPP_V1.04.zip die Funktion Write_Ethernet_Frame, die bemängelt wird, sieht so aus: -- void Write_Ethernet_Frame (char *buffer,unsigned int bufferlen) { if (bufferlen < 0x40) { for (int a = (bufferlen-4);a <= 0x44;a++) { buffer[a] = 0x20; } bufferlen = 0x40; } WriteRTL (cr,0x22); WriteRTL (tpsr,txstart); WriteRTL (rsar0,0x00); WriteRTL (rsar1,0x40); WriteRTL (isr,0xFF); WriteRTL (rbcr0,(bufferlen & 0x00ff) - 4); WriteRTL (rbcr1,(bufferlen & 0xff00) >>8); WriteRTL (cr,0x12); for (int a = 0; a < (bufferlen - 4);a++) { WriteRTL (rdmaport,buffer[a]); } ---> loop_until_bit_is_set(ReadRTL(isr),rdc); WriteRTL (tbcr0,(bufferlen & 0x00ff) - 4); WriteRTL (tbcr1,(bufferlen & 0xff00) >>8); WriteRTL (cr,0x24); } -- die zeile mit dem Pfeil ist Nr. 154 die Datei interrupt4.c habe ich mal angehängen, um es hier übersichtlicher zu machen. Die Function __vector_5 kann ich darin allerdings nicht finden der Fehler zeigt in SIGNAL (SIG_INTERUUPT4) auf die Zeilen "if (bit_is_set(..." wenn ich das noch richtig in Erinnerung habe (bin grad an nem anderen Rechner) Die Fehlermeldung deutet ja eigentlich auf einen fehler im Quellcode. Nur kann ich damit leider nichts anfangen, denn ich will C ja erst mit diesem Projekt lernen. Habe bislang Delphi und Konsorten am PC programmiert bzw. Asm was Elektronik angeht.
Ohh, da war ich mit dem tippen wohl zu langsam. Werd den Code ausprobieren und mich hier wieder melden.
Das Problem ist immernoch das selbe. Auch verwende ich die selben Einstellungen in pm2. Ebenfalls habe ich Versucht make per Komandozeile zu starten, es follt aber die selbe Ausgabe. es wird also vermutlich wirklich an meinen Programm Versionen liegen... @ulrich es währe nett, wenn du deine Programmversionen checken kannst, ich verwende - GNU Binutils 2.15: - GCC 3.4.1: - avr-libc 1.0.4: - Programmers Notepad 2.0.5.34 (was aber wohl unerheblich ist) Hab die Versionsnummern aus der Readme auf dem WinAVR Verzeichnis. Ist also nicht soo viel Aufwand das zu prüfen. Danke im Voraus.
die betreffende Befehlzeile ist also: loop_until_bit_is_set(ReadRTL(isr),rdc); ist wie follgt definiert: (habs in der sft_defs.h gefunden) #define loop_until_bit_is_set(sfr,bit) do { } while (bit_is_clear(sfr, bit)) und ruft wiederum #define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit))) aus. dh. es muss ein sfr sein, das ReadRTL liefert. und da ReadRTL wie follgt definiert ist "int ReadRTL (char rtl_addr)" kommt ein integer wert zurück. wohl in einem register wie r16. wenn das richtig ist dürfte ja dort der hänger sein. aber: integer ist größer als r16 fassen kann (zumindestens, wie ich es kenne) und ziehlt die fehlermeldung wirklich darauf ab?
Dürfte an der Programmversion liegen. Meine Version mit der ich das Programmiert habe. - GCC 3.3.1 - GNU Binutils 2.14 - avr-libc 0.99.90.20030829 Mfg Ulrich Radig
Hallo, Habe mal es getestet es liegt an der Version von AVR GCC ich bin es schon am ändern. Das es auch mit der neuen Version läuft. Mfg Ulrich
Danke für die schnelle Hilfe. Das Compilieren hat nun geklappt. So kann ich nun das Projekt auseinander nehmen und dabei C ein wenig besser verstehen. Bald geht´s dann auch ans löten.
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.