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
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)
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
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.
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.
Nö, ich hatte eher an Konstanten via <avr/pgmspace.h> gedacht.
> ...aber auf keinen Fall über 64k.
Die > 80 KB sind dann reiner Code?
Gut, 22 KB sind wirklich nicht zu viel. Bleibt nicht viel anderes übrig, als das Teil direkt in Assemblercode übersetzen zu lassen.
Das Teil ist eine Funktion aus der stdlib.h wo von ich ausgehe das es auch funktioniert.
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.
Habe jetzt beschlossen, dass ich die Funktion weglasse und selber ein schreibe. danke
Das maskiert doch das Problem nur. Warum magst du nicht, dass wir gemeinsam den Bug suchen und finden?
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.
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.
debuggen tue ich nichts, ich mach das nach dem try and error prinzip. Bin mit der Lösung voll zufrieden.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.