Forum: Compiler & IDEs Error: Operand Out Of Range


von NoSiCo (Gast)


Lesenswert?

Hallo!

Beim Kompilieren meines SourcesCodes erscheinen folgende Fehler:

C:\{Pfad} ccEXaaaa.s: 2492: Error: operand out of range: -2049
C:\{Pfad} ccEXaaaa.s: 2495: Error: operand out of range: -2051
C:\{Pfad} ccEXaaaa.s: 2498: Error: operand out of range: -2053
C:\{Pfad} ccEXaaaa.s: 2501: Error: operand out of range: -2055
C:\{Pfad} ccEXaaaa.s: 2504: Error: operand out of range: -2057

Ich habe schon verschiedene Möglichkeiten probiert und 
selbstverständlich auch im Internet bzw. verschieden Foren gesucht, bin 
dabei aber leider nicht glücklich geworden. Aus diesem Grund wollte ich 
euch bitten, mir bei diesem Problem behilflich zu sein!

Vielen Dank im Voraus!

LG NoSiCo

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
ohne sourcecode wird das sicher nichts, denke ich. es sei denn, jemand 
packt seine glaskugel aus und schaut da mal nach :)
bye kosmo

von NoSiCo (Gast)


Lesenswert?

Hallo Kosmo!

Yep, da hast Du sicherlich Recht, habe den Beitrag ein bisschen 
überstürzt, aber genau hier beginnt mein Problem ;)

Ich verwende einen ATMega2560 und das derzeitige HEX-File weißt eine 
Größe von 12KB auf. Es ist noch nicht sehr viel inkludiert außer SPI und 
USARTs.
Der oben beschriebene Fehler erscheint auch nicht immer und vorallem ist 
er nicht auf einzelene Zeilen/Operationen beschränkbar. Ich habe zum 
Beispiel ca. 7 Zeilen, die folgendermaßen aussehen:

RTC_date = ((temp & 0x30) >> 4)*10 + (temp %10);

Wenn ich jetzt aber mehr als 5 von diesen 7 Zeilen stehen lasse (egal 
welche, switchen bringt keinen Unterschied!!!), dann erscheinen die 
Fehler! Ich tippe mal Richtung Makefile, kann aber den Verdacht nicht 
untermauern. Ich finde es nur sehr faszinierend, dass es bei der 
gesamten Problematik nicht davon abhängt, "welchen Sourcecode ich 
schreibe".

LG NoSiCo

von Stefan (Gast)


Lesenswert?

Wie sind RTC_date und temp deklariert? Was steht in der temporären Datei 
ccEXaaaa.s in den Zeilen 2492, 2495, 2498, 2501, 2504?

Wenn du die temporäre Datei nicht einsehen kannst, versuche es mit einer 
Compilierung mit der -S Option (Ausgabe als Assemblerquelltext).

von NoSiCo (Gast)


Lesenswert?

RTC_date und temp sind beide BYTE (#define BYTE  unsigned char).

Hm. leider kann ich "ccEXaaaa.s" nicht einsehen, jetzt probiere ich es 
mal die dem Assemblerquelltext.

Ich möchte aber noch anmerken, dass dieser Fehler nicht das erste mal 
bei meinen Programmen auftritt, sondern viel öfter erscheint. Wie 
gesagt, ich kann dabei nie auf einen offensichtlichen Fehler in einer 
Zeile schließen, es sieht eher danach aus, wie wenn den uCs der Speicher 
ausgeht, aber auch das kann ich ausschließen, da ich der Fehler 
teilweise damit behoben werden kann, dass ich an völlig anderen Stellen 
im Courcecode etwas streiche!

von Joe D. (kosmonaut_pirx)


Lesenswert?

ich nehme an, die ca. 7 zeilen unterscheiden sich, ansonsten spielt dir 
bekanntlich der optimierer einen streich.
schau mal, ob du den asm-code zusammenkriegst, wie stefan vorgeschlagen. 
und die deklarationen auch.

von NoSiCo (Gast)


Lesenswert?

Yep, die 7 Zeilen unterscheiden sich ;)

Hm, ich habe leider noch nicht herausgefunden, wo ich dieses "-s" 
schreiben muss, damit mir ein Assembler-Code ausgegeben wird, weil ich 
das bis dato noch nie gemacht habe.

Ich habe aber jetzt einmal die Optimierung auf -00 gestellt und die 
Fehler sind weg :|

Ich werde mich aber auf alle Fälle wieder melden, wenn ich weiß, wie das 
mit dem AssemblerCode aussieht!


LG NoSiCo

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


Lesenswert?

NoSiCo wrote:

> Hm, ich habe leider noch nicht herausgefunden, wo ich dieses "-s"
> schreiben muss, damit mir ein Assembler-Code ausgegeben wird, ...

Es ist ein -S (das ist was anderes).  Du gibst es statt eines -c
beim Aufruf des AVR-GCC an.

Wenn du das Makefile von WinAVR nimmst, genügt es, wenn du auf der
Kommandozeile "make foo.s" sagst, wenn deine C-Datei "foo.c" heißt.

Welchen Compiler nimmst du für den ATmega2560, die AtmanAVR-Variante?

> Ich habe aber jetzt einmal die Optimierung auf -00 gestellt und die
> Fehler sind weg :|

Ja klar.  Ist ja dann auch komplett anderer Code, der da generiert
wird.

von NoSiCo (Gast)


Lesenswert?

Guten Morgen!

Die Fehlermeldungen beziehen sich jetzt auf die Zeilen: 3047, 3049 und 
3936. Im folgenden habe ich die ASM-Codezeilen aus main.o reinkopiert:

3044: /* #NOAPP */
3045:  rcall init_ports
3046: .LM318:
3047:  rcall init_uart0
3048: .LM319:
3049:  rcall init_uart1
3050: .LM320:
3051:  rcall init_uart2
3052: .LM321:
3053:  rcall init_uart3
3054: .LM322:
3055:  rcall SPI_MasterInit

3932: .LM380:
3933:  lds r24,b
3934:  lds r25,(b)+1
3935:  subi r24,lo8(-(32))
3936:  rcall u2_s_data

void init_uart0(void)
{
  UBRR2L = 25;
  UCSR2B = 0xD8;
  UCSR2C = 
((0<<UMSEL21)|(0<<UMSEL20)|(1<<UPM20)|(1<<UPM21)|(1<<UCSZ21)|(1<<UCSZ20) 
);
}


void u2_s_data(BYTE address)
{
  volatile BYTE temp = 0;

  PORTB |= (1 << R_W_2);      // Auf senden umstellen

  while (!(UCSR2A & (1<<UDRE2))) {}
  UDR2 = address;
  u2_crc_c  = address;
         while (!(UCSR2A & (1<<UDRE2))) {}
  UDR2 = u2_s_adr_t;
  u2_crc_c ^= u2_s_adr_t;  // Source-address (transcieved)
         .
         .
         .
}

Hm, ich versteh einfach nicht, warum ich diese Fehlermeldungen erhalte!

LG NoSiCo



von johnny.m (Gast)


Lesenswert?

Das Problem kann ich zwar nicht für Dich lösen, aber "volatile" macht 
bei lokalen Variablen keinen Sinn. Das geht nur mit globalen...

von NoSiCo (Gast)


Lesenswert?

Sorry, Kopierfehler!

void init_uart0(void)
{
  UBRR0L = 25;    // 38462 (0.2%)
  UCSR0B = 0xD8;
  UCSR0C = 
((0<<UMSEL01)|(0<<UMSEL00)|(1<<UPM00)|(1<<UPM01)|(1<<UCSZ01)|(1<<UCSZ00) 
);
}

Achja, wenn ich init_uart0 rausnehme, bekomme ich den Fehler bei 
init_uart1 und wenn ich die dann auch rausnehme ist er weg!?!

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
macht's dir was aus, mal den gesamten -S -output zu dieser datei zu 
posten oder besser in eine datei zu packen und schicken?
bye kosmo

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


Lesenswert?

NoSiCo wrote:

> Die Fehlermeldungen beziehen sich jetzt auf die Zeilen: 3047, 3049 und
> 3936.

> 3047:  rcall init_uart0

Nun, was wird es wohl bedeuten, wenn der Operand eines rcall out of
range ist?

Du solltest an dieser Stelle keine rcalls benutzen, sondern calls.

von Joe D. (kosmonaut_pirx)


Lesenswert?

da hat der große meister recht:

http://www.mikrocontroller.net/articles/AVR_Assembler_-_Unterprogramme

auszug:"Mittels rcall ist es nur möglich, relative Adressen im Bereich 
von -2K+1 und +2K Worten anzuspringen"

bei dir:
-2049
-2051
-2053
-2055
-2057

(gut zu wissen, habe ich bisher noch nirgends bei avr gelesen)

von NoSiCo (Gast)


Lesenswert?

Hm, ich weiß, dass ich schön langsam zu nerven beginne, aber ich weiß 
jetzt nicht, wie ich in C zw. CALL und RCALL unterscheiden kann. :( Kann 
mich hier jemand bitte einen hint geben? Danke!

von Karl heinz B. (kbucheg)


Lesenswert?

> Du solltest an dieser Stelle keine rcalls benutzen, sondern calls.

Wenn ich ihn richtig verstanden habe, dann schreibt
er ja gar nicht in Assembler sondern in C.
Es ist also der Compiler, der den Murks macht.

von Stefan (Gast)


Lesenswert?

Dann stellst sich doch direkt die Frage, welcher Prozessor beim 
Kompilieren eingestellt ist.

Was steht in der Kommandozeile (Beispiel -mmcu=atmega8) oder im Makefile 
(Beispiel MCU=atmega8)?

Vielleicht ist dort ein "kleiner" AVR eingestellt und die 
Codeoptimierung innerhalb GCC geht davon aus, dass auf dem "Kleinen" 
RCALLs immer passen.

von Stefan (Gast)


Lesenswert?

Nur zur Erinnerung, diese Frage von Jörg ist auch noch offen:

"Welchen Compiler nimmst du für den ATmega2560, die AtmanAVR-Variante?"

von NoSiCo (Gast)


Lesenswert?

nein, habe eigentlich im Makefile den richtigen uC eingestellt: 
MCU=atmega2560

Hm, ich weiß leider nicht, ob ich die AtmanAVR-Variante verwende oder 
nicht, weil ich nicht weiß, was das ist :(

Falls es weiterhilft: WinAVR vom 20060421 (AVR-gcc3.4.6)

von Stefan (Gast)


Lesenswert?


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


Lesenswert?

NoSiCo wrote:

> Falls es weiterhilft: WinAVR vom 20060421 (AVR-gcc3.4.6)

Mit Sicherheit nicht, weil der keinen ATmega2560-Support hatte.

von NoSiCo (Gast)


Lesenswert?

Ok, habe auf ATMega 1280 umgestellt, sowohl Hard- als auch Software, 
aber leider noch immer daselbe Problem, ich weiß nicht, wie ich die 
RCALLs in CALLs wandeln kann, da ich mit C programmiere!

Außerdem ist ein neuer für mich absolut unerklärlicher Fehler 
aufgetreten, obwohl ich in diesem Bereich nichts geändert habe:

g:\{Pfad}\SPI.c:9 relocation truncated to fit: R_AVR_13_PCREL against 
symbol '__udivmoidqi4' defined in .text.libgcc section in 
C:/{Pfad}/libgcc.a(_udivmodqi4.o)

8: void SPI_MasterTransmit(BYTE cData)
9: {
10:   SPDR = cData;  // Start transmission
11:   while(!(SPSR & (1 << SPIF)));// Wait for transmissionc omplete
12:}

Außerdem wird mir dieser Erorr ca. 10 mal angezeigt :(

von Joe D. (kosmonaut_pirx)


Lesenswert?

warum updatest du nicht mal auf aktuelles zeug? find ich irgendwie 
sinnvoller, als die hw zu wechseln.

von Joe D. (kosmonaut_pirx)


Lesenswert?

entschuldigung, winavr ist wohl aktuell, vergiss den letzten unsinn von 
mir :(

benutze ich selber nicht, daher. weiß aber, dass der avr-gcc bei 4.1.1 
ist, iirc.

von NoSiCo (Gast)


Lesenswert?

Weil es laut "http://sourceforge.net/"; die aktuellste Version ist

von Joe D. (kosmonaut_pirx)


Lesenswert?

hast ja recht.

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


Lesenswert?

NoSiCo wrote:

> Ok, habe auf ATMega 1280 umgestellt, sowohl Hard- als auch Software,
> aber leider noch immer daselbe Problem, ich weiß nicht, wie ich die
> RCALLs in CALLs wandeln kann, da ich mit C programmiere!

Kannst du den relevanten Sourcecode posten?

Ich fürchte immer noch, dass das ein pilot error irgendwie ist.

> g:\{Pfad}\SPI.c:9 relocation truncated to fit: R_AVR_13_PCREL against
> symbol '__udivmoidqi4' defined in .text.libgcc section in

Linke bitte immer gegen -lm (libm.a), insbesondere dann, wenn du mit
Gleitkommazahlen in irgendeiner Form arbeitest.  (Da gibt's einen
known bug, der nicht so einfach zu reparieren ist.)  Wenn sie nicht
gebraucht wird, stört sie auch nicht.

von NoSiCo (Gast)


Lesenswert?

Ich habe leider ein Problem damit, dass ich den relevanten Sourcecode 
poste, weil die Fehler quer durch den gesamten Sourcecode springen. 
Einmal sind sie in Zeile 2400, dann wieder in 4500 (z.B. Port_init), das 
nächste mal wieder ganz wo anders. Ich bin schön langsam am verzweifeln, 
weil kein Vorwärtskommen erkennbar ist.
Wenn ich irgendwo anders wieder einen Teil eines Sourcecodes 
rauskommentiere (der hat gar nichts damit zu tun!), dann funktioniert es 
wieder, aber ich habe derzeit erst ein 10K-Hex-File.

Hm, ist es vielleicht möglich, dass jemand ein Makefile zur Verfügung 
stellt, weil so wie es aussieht (Beispiel -lm) gibt es vielleicht doch 
noch ein paar Dinge, die ich noch nicht habe.

Vielen Dank und LG NoSiCo

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.