Forum: Compiler & IDEs Fehler in GCC mit AT90S2313 ?


von Valentin Heinitz (Gast)


Lesenswert?

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?

von Stefan May (Gast)


Lesenswert?

Konstanten stehen mit dem AVR-GCC auch im RAM. Also wird Dir der
Speicher ausgehen.

ciao, Stefan.

von Valentin Heinitz (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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.

von Rufus T. Firefly (Gast)


Lesenswert?

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

von Valentin Heinitz (Gast)


Lesenswert?

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

von Jürgen Schuhmacher (Gast)


Lesenswert?

"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 ? :-)

von Jörg Wunsch (Gast)


Lesenswert?

Wie willst Du was testen beim Stack?

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.