Forum: Compiler & IDEs AVR-GCC: Problem beim Compilieren


von Henning (Gast)


Lesenswert?

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!

von Jim (Gast)


Lesenswert?

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.

von uli (Gast)


Lesenswert?

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

von Henning (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Henning (Gast)


Lesenswert?

Ohh, da war ich mit dem tippen wohl zu langsam. Werd den Code
ausprobieren und mich hier wieder melden.

von Henning (Gast)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wie ist loop_until_bit_is_set definiert?

von Henning (Gast)


Lesenswert?

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?

von uli (Gast)


Lesenswert?

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

von uli (Gast)


Lesenswert?

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

von uli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Hier der neue Source Code

Mfg Ulrich

von Henning (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.