8051 Problem mit Initialisierung globaler Variablen

Gast #2095217
Lesenswert?
• ▲
▼
Hallo Leute!

Programmiere gerade einen AT89C51RC2 mit Keil.

Beim Debuggen ist mir aufgefallen, dass die globalen Variablen, die ich 
schon vordefiniert habe, nicht immer richtig initialisiert werden.

Liegen die Variablen am Anfang des XDATA Bereichs, dann funktioniert die 
Initialisierung. Liegen sie weiter hinten, so stehen irgendwelche 
falschen Werte drin.

Habe aus dem Programmcode alle Schleifen etc. auskommentiert, damit ich 
sichergehen kann, dass der Fehler nicht von meinem Programm kommt.

Der XDATA Bereich ist auch bei weitem nicht voll und den XBPSTACK habe 
ich auch deaktiviert, da ich keine reentrant funktionen benötige.

Woher kann dieser Fehler kommen?

Kann da was am STARTUP.A1 oder am INIT.A51 file faul sein?

Vielleicht kann mir ja jemand einen Tip geben?

mfg Josef
#2095405
Lesenswert?
• ▲
▼
Hast du in der Datei START.A51 in der Sektion "Power-On Initialization 
of Memory" die Startadresse sowie die Größe des Xdata Bereichs korrekt 
eingestellt?
Denn nur diese Einstellung führt dazu, dass zu Beginn des Programms der 
Bereich vollständig mit 0x00 Initialisiert wird. Andernfalls hast du 
nach dem Einschalten zufällige Werte drin. Ohne diese Initialisierung 
musst du eben nur sichergehen, dass du deine Variablen vor der ersten 
Verwendung immer vorbelegt hast.

Ciao,
     Rainer
Gast #2095432
Lesenswert?
• ▲
▼
Ja, das Verändern der Konstante XDATALEN habe ich auch schon probiert, 
das hat aber keine Besserung gebracht, jetzt habe ich direkt im 
Assembler die XRAM Größe eingegeben

MOV 0x8E,#0x0C

So scheint es zu funktionieren, aber das sollte eigentlich doch auch 
irgendwie funktionieren, ohne dass man direkt in den Assembler Code 
eingreift, oder?

mfg Josef
#2095469
Lesenswert?
• ▲
▼
Josef schrieb:
> Habe die XRAM Größe am Beginn meines C Programms auf 1024 Byte gestellt,
> also mittels Befehl:
>
> AUXR = AUXR | 0xC0;
>
> und das scheint irgendwie den Fehler auszulösen.

Also falls das kein Schreibfehler war, dann funktioniert es so nicht. Es 
muss 0x0C lauten, wie bei deiner Assembler Variante. Wenn du wirklich 
0xC0 reinschreibst ist das Verhalten undefiniert, da du ein reserviertes 
Bit setzen würdest.

Ciao,
     Rainer
Gast #2095527
Lesenswert?
• ▲
▼
> So scheint es zu funktionieren, aber das sollte eigentlich doch auch
> irgendwie funktionieren, ohne dass man direkt in den Assembler Code
> eingreift, oder?
Öffne die Startup.a51 im Editor. Unterhalb des Fensters sollte "config 
wizard" o.ä. stehen. DA STELLT MAN DANN DIE SACHEN EIN :)

Ralf

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.