Variablen im xdata-Bereich werden überschrieben

Gast #434136
Lesenswert?
• ▲
▼
Hallo zusammen,

ich bin Neuling, was Speicherverwaltung in µControllern angeht.

Equipment:
            Controller: AT89C51ED2
            Compiler: µVision 3, Keil


Folgende Lage:

Ich deklariere Globale Variablen als static xdata unsigned char in C.
Meine Datenmenge ist so groß, dass ich den internen Datenspeicher nicht 
mehr verwenden kann. Deshalb xdata...

Ich merke jedoch, dass eine bestimmte Variable sich verändert, obwohl 
ich es nicht programmiert habe. Ich beschreibe sie über die RS-232 vom 
PC aus und schicke sie mir umgehend zurück. Die RS-232-Verbindung läuft 
tadellos. Muss also an der Variable liegen.

Declariere ich diese Variable mit idata, ist das Problem beseitigt. 
Schreibe ich jedoch mehr Programmcode, so wird entsteht das Problem mit 
anderen Variablen. Ich kann aber nicht alle mit idata declarieren, da 
sonst der interne Datenspeicher zu voll wird.

Ich vermute, dass Programmcodespeicher meine Variablen versauen. Also 
irgendeine Überschneidung im Speicher. Vielleicht eine Adresse für zwei 
Speicherbereiche?

Es wird vorgeschlagen eine Startup.a51-Datei zu verwenden, um 
Speicherbereiche und den Stack zu konfigurieren.
Leider hab ich keinen Plan, was ich dort eintragen soll und welche 
Einstellungen ich unter Target-Optionen im Reiter Target in µVision 
vornehmen soll.
Ich habe schon das ein oder andere ausprobiert, welches dazuführte, dass 
mein Programm überhaupt nichts mehr tat.

Wer sich mit dem 8051 und Keil schon intensiv auseinandergesetzt hat, 
weiß bestimmt die Antworten auf meine Fragen.

Also Danke schon im Voraus...

Marko
#434423
Lesenswert?
• ▲
▼
Marko wrote:

> Declariere ich diese Variable mit idata, ist das Problem beseitigt.


Nö.
Das Problem ist nur im Moment für Dich nicht mehr sichtbar.

In der Regel sind solche Sachen ein Zeichen für falsche 
Pointerverwendung.

Z.B. cast eines char-pointers auf int oder Zugriff auf Element n eines 
Feldes der Länge n.


Peter

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.