www.mikrocontroller.net

Forum: Compiler & IDEs Fehler in GCC mit AT90S2313 ?


Autor: Valentin Heinitz (Gast)
Datum:

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

Autor: Stefan May (Gast)
Datum:

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

ciao, Stefan.

Autor: Valentin Heinitz (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Valentin Heinitz (Gast)
Datum:

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

Autor: Jürgen Schuhmacher (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie willst Du was testen beim Stack?

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.