Forum: Compiler & IDEs Speicherverwaltungsproblem?


von Walter W. (wummpe)


Lesenswert?

Moin

ich habe einen AT90CAN128 mit externen RAM. Benutze die neueste Version
von WINAVR.
Soweit funktioniert auch alles. Nach dem erfolgreichen compilieren
kommt diese Meldung:

Size after:
main.elf  :
section             size      addr
.data               3360   8392960
.text              88864         0
.bss                 328   8396320
.noinit                0   8396648
.eeprom                0   8454144
.debug_aranges       120         0
.debug_pubnames     6993         0
.debug_info        30350         0
.debug_abbrev       2276         0
.debug_line        39364         0
.debug_str          7094         0
.debug_ranges        180     88864
Total             178929


AVR Memory Usage:
-----------------
Device: at90can128

Program:   92224 bytes (70.4% Full)
(.text + .data + .bootloader)

Data:       3688 bytes (90.0% Full)
(.data + .bss + .noinit)


Makefile ( External Memory Options)
EXTMEMOPTS =
-Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff

Der µC ist schon ziemlich voll, ich weiß. Wenn ich jetzt diese Zeile
einfüge:
dtostrf(minimum+(maximum-minimum)*i/10,1,0,string);

kommt diese fette Fehlermeldung raus.

C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s: Assembler
messages:
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81684: Error:
value of 65780 too large for field of 2 bytes at 16
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:98942: Error:
value of 65780 too large for field of 2 bytes at 22363
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81505: Error:
value of 65564 too large for field of 2 bytes at 33987
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81511: Error:
value of 65568 too large for field of 2 bytes at 33993
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81517: Error:
value of 65572 too large for field of 2 bytes at 33999
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81523: Error:
value of 65576 too large for field of 2 bytes at 34005
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81529: Error:
value of 65580 too large for field of 2 bytes at 34011
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81535: Error:
value of 65584 too large for field of 2 bytes at 34017
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81541: Error:
value of 65588 too large for field of 2 bytes at 34023
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81547: Error:
value of 65604 too large for field of 2 bytes at 34029
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81553: Error:
value of 65620 too large for field of 2 bytes at 34035
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81559: Error:
value of 65622 too large for field of 2 bytes at 34041
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81565: Error:
value of 65628 too large for field of 2 bytes at 34047
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81571: Error:
value of 65630 too large for field of 2 bytes at 34053
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81577: Error:
value of 65634 too large for field of 2 bytes at 34059
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81583: Error:
value of 65646 too large for field of 2 bytes at 34065
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81589: Error:
value of 65650 too large for field of 2 bytes at 34071
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81595: Error:
value of 65660 too large for field of 2 bytes at 34077
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81601: Error:
value of 65664 too large for field of 2 bytes at 34083
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81607: Error:
value of 65670 too large for field of 2 bytes at 34089
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81613: Error:
value of 65678 too large for field of 2 bytes at 34095
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81619: Error:
value of 65686 too large for field of 2 bytes at 34101
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81625: Error:
value of 65690 too large for field of 2 bytes at 34107
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81631: Error:
value of 65696 too large for field of 2 bytes at 34113
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81637: Error:
value of 65700 too large for field of 2 bytes at 34119
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81643: Error:
value of 65706 too large for field of 2 bytes at 34125
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81649: Error:
value of 65710 too large for field of 2 bytes at 34131
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81655: Error:
value of 65716 too large for field of 2 bytes at 34137
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81661: Error:
value of 65720 too large for field of 2 bytes at 34143
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:81667: Error:
value of 65780 too large for field of 2 bytes at 34149
C:\DOKUME~1\CK9556~1.AS-\LOKALE~1\Temp/ccAVaaaa.s:102088: Error:
value of 65780 too large for field of 2 bytes at 14

Was bedeutet das? Ist der Speicher voll? Kann ich .data + .bss in den
externen RAM auslagern?

gruß
wummpe

von johnny.m (Gast)


Lesenswert?

Da steht so wie ich das sehe eigentlich nur, dass Du irgendwie
versuchst, einem integer (2 Bytes) Werte > 65535 zuzuweisen (Das sind
Fehlermeldungen des Assembler)

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


Lesenswert?

Hast du eventuell mehr als 64 KB an ROM-Strings und -Konstanten?

von Walter W. (wummpe)


Lesenswert?

ich habe mal was probiert. Wenn ich die 1. Zeile nehme geht es nicht.
Wenn ich eine float-zahl direkt eingebe habe ich keine Probleme. Muss
ich irgendetwas bei der Funktion dtostrf() beachten?

float maximum,minimum;
unsigned int i;
unsigned char string[10];

dtostrf(minimum+(maximum-minimum)*i/10,1,0,string); // geht nicht
dtostrf(68321.12,1,0,string);                       // geht


wummpe

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


Lesenswert?

Du bekommst sicher größeren Code aus der ersten Version, da
die Gleitkommaberechnung erst zur Laufzeit gemacht werden
kann.  Dadurch könnte sich schon irgendwas nach > 64 KB
verschieben...  Meine Frage hast du mir ja nicht beantwortet.

von Walter W. (wummpe)


Lesenswert?

Was sind genau ROM-Strings und -Konstanten? Sind das alle Konstante die
ich im Code habe wie z.B. printf("Hallo"); => 5

Davon habe ich einige, aber auf keinen Fall über 64k.

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


Lesenswert?

Nö, ich hatte eher an Konstanten via <avr/pgmspace.h> gedacht.

> ...aber auf keinen Fall über 64k.

Die > 80 KB sind dann reiner Code?

von Walter W. (wummpe)


Lesenswert?

Ach, von den habe ich einige und zwar genau 22697 Bytes

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


Lesenswert?

Gut, 22 KB sind wirklich nicht zu viel.

Bleibt nicht viel anderes übrig, als das Teil direkt in
Assemblercode übersetzen zu lassen.

von Walter W. (wummpe)


Lesenswert?

Das Teil ist eine Funktion aus der stdlib.h wo von ich ausgehe das es
auch funktioniert.

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


Lesenswert?

Ja, und?  Was möchtest du damit sagen?

Das Teil funktioniert an sich auch.  Nur eben gerade nicht bei
dir.  Also müssen wir das debuggen, warum's nicht geht.  Du
machst zumindest erst einmal keinen offensichtlichen Fehler in
der Benutzung.

Da die Fehler nur im Assemblercode auftreten, brauchen wir halt
das generierte Assemblerfile.

von Walter W. (wummpe)


Lesenswert?

Habe jetzt beschlossen, dass ich die Funktion weglasse und selber ein
schreibe.

danke

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


Lesenswert?

Das maskiert doch das Problem nur.  Warum magst du nicht, dass
wir gemeinsam den Bug suchen und finden?

von Walter W. (wummpe)


Lesenswert?

Moin

ich glaube noch tiefer in Sache einsteigen wird für mich zu
kompliziert. Habe übrigens selber eine Funktion geschrieben und hatte
da das gleiche Problem. Habe dann ein bisschen gegoogle und habe das
hier gefunden:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19087

das kennst du ja schon.
Habe zwar nur die Hälfte verstanden, aber wenn man im Makefile "DEBUG
= dwarf-2" durch "DEBUG = stabs" ersetzt geht es. Frag mich bloß
nicht warum.

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


Lesenswert?

Ach, daher kommen die Assemblerfehler...

> Habe zwar nur die Hälfte verstanden, aber wenn man im Makefile
> "DEBUG = dwarf-2" durch "DEBUG = stabs" ersetzt geht es. Frag
mich
> bloß nicht warum.

Die derzeitige DWARF-2-Implementierung im AVR-GCC benutzt nur 16 bits
für die Zeiger, die der Debug-Code beinhaltet.  Damit lässt sich Code
> 64 KB nicht mehr damit debuggen.  Die Lösung des Problems ist nicht
wirklich schwer, aber sie muss halt passend koordiniert werden, weil
ansonsten das passiert, was bei WinAVR-20060119 der Fall war: das AVR
Studio als Konsument des in dieser Version reparierten DWARF-2 hat mit
der Änderung nicht gerechnet, und krachte ins Bodenlose...

Wenn du mit AVR Studio weiter debuggen willst, kannst du dich
zumindest noch an AVR-COFF versuchen.  Ist nicht berühmt, hat aber
diese Limitierung nicht.  Oder aber du bringst eben deinen Code unter
64 KB.

von Walter W. (wummpe)


Lesenswert?

debuggen tue ich nichts, ich mach das nach dem try and error prinzip.
Bin mit der Lösung voll zufrieden.

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


Lesenswert?

> debuggen tue ich nichts, ich mach das nach dem try
> and error prinzip.

Dann kann dir das Debugformat reichlich schnuppe sein, eigentlich
brauchst du gar kein -g.

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.