mikrocontroller.net

Forum: Compiler & IDEs Speicherverwaltungsproblem?


Autor: Walter Wummpe (wummpe)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eventuell mehr als 64 KB an ROM-Strings und -Konstanten?

Autor: Walter Wummpe (wummpe)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter Wummpe (wummpe)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Walter Wummpe (wummpe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, von den habe ich einige und zwar genau 22697 Bytes

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, 22 KB sind wirklich nicht zu viel.

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

Autor: Walter Wummpe (wummpe)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter Wummpe (wummpe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt beschlossen, dass ich die Funktion weglasse und selber ein
schreibe.

danke

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Walter Wummpe (wummpe)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter Wummpe (wummpe)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.