Hallo, ich habe festgestellt, dass ab einer gewissen Groesse des Konstantenbereiches die Konstanten falsch sind. Bsp.: (lcd_putstr ist pseutofonkt-on zur stringausgabe auf LCD) //1. Korrekte Darstellung const char* str1="Hello"; lcd_putstr( str1 ); //2. Fehlerhafte Darstellung const char* str1="Hello"; ... viele const char* konstanten const char* strX="Hello"; lcd_putstr( str1 ); Ab welchen Konstantengroesse Fehler auftretten, habe ich noch nicht rausgefunden. uC ist AT90S2313. Ist jemandem sowas passiert? Seltsam ist, dass Code compilliert und in uC geladen wird. Gruss. P.S.: Die Konstanten stehen ueberall im Code, auch in Funktionen. Muesste man die alle am Anfang im globalen Bereich deklarieren?
Danke Stefan, sowas habe ich auch vermutet, aber wieso erkennt der Kompiler es nicht? uC Typ wird doch angegeben, also weiss Compiler genau wieviel RAM zur Verf. steht. Gibt es da eine Moegligkeit (ein Schalter) Konstanten auch in Flash anzulegen? Gruss
Der Compiler baut das ja nicht zusammen, sondern der Linker. Der hat aber keine Kennung mehr, wie viel RAM der jeweilige Chip wirklich hat (die Linkerscripts kennen nur die absolute Obergrenze der jeweiligen Architekturgruppe). Außerdem hast Du ohnehin schon weit vor dem statischen Überlaufen Probleme, weil Du ja keinen Platz mehr für den Stack übrig lässt. Fazit: der Entwickler sollte die Ausgaben von avr-size schon selbst ein bissel im Auge behalten... Zum Experimentieren sind die Mini-Chips wie AT90S2313 aus diesem Grunde auch eher ungünstig. Nimm lieber einen ATmega8, kostet nur paar Cent mehr, hat aber viel mehr Platz.
Mit PROG_MEM* als prefix werden Konstanten im ROM abgelegt. Allerdings kann auf solche Konstanten nicht ohne weiteres zugegriffen werden, das liegt an der Harvard-Architektur der AVRs, bei denen RAM und ROM in komplett getrennten Adressräumen liegen. Also muss entweder die aufgerufene Funktion, die mit diesen Konstanten arbeitet, in einer spezielle Variante vorliegen, die ROM-Pointer verwendet, oder die Konstanten müssen vor Gebrauch ins RAM kopiert werden. Praktisch, nicht? *) oder so ähnlich, Details bitte in Dokumentation nachlesen, die hab' ich hier gerade nicht verfügbar
OK, vielen Dank an alle! Mit den Antworten kommen ich gut weiter. Hinweis von Jörg - "keinen Platz mehr für den Stack übrig" klaert mich nun ueber das curiose Verhalten des Programms nach Funktionsaufrufen auf. Sah tatsaechlich so aus, als haette der wachsende Stack Datenspeicher uebeschrieben. Gruss, und auf Widerlesen! Valentin
"Sah tatsaechlich so aus, als haette der wachsende Stack Datenspeicher uebeschrieben." ... was bei korrekter Einhaltung von Stacktests eigentlich nicht vorkommen sollte. Oder hast Du bei Microsoft gelernt ? :-)
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.