www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variablen im xdata-Bereich werden überschrieben


Autor: Marko (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Peter,

für Deine Antwort.
Es lag an einen externen Bustreiber, der ebenfalls auf die 
UART-Schnittstelle zugreift. Der war fehlerbehaftet. Also doch kein 
Speicherproblem.

Gruß Marko

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.