Forum: Compiler & IDEs Keil µvision C Fehler?


von heda0021 (Gast)


Lesenswert?

Hallo,

vielleicht kann mir jemand weiterhelfen, der schon mal das selbe Problem 
mit dem C-Comiler von Keil µ-vision2 gehabt hat. Ein einfaches Programm 
zur Servoansteuerung funktionierte beim ersten mal. Als ich nochmal 
starten wollte (und zuvor neu compellierte) ging es nicht mehr. Nach 
einigen Malen ausprobieren ging es dann wieder. Um was für ein 
mystisches Phänomen handelt es sich dabei?? Habe beim Step-Modus 
gemerkt, das er von der Hauptschleife in die Unterfunktionen reinspringt 
und einen Befehl der dies Veranlasst.
Hoffe es kann mir jemand weiterhelfen -DANKE

von Peter D. (peda)


Lesenswert?

Da muß man aber wirklich hellsehen können (Deine Gedanken, den Inhalt 
Deiner Festplatte).

Überlege Dir Deine Frage besser nochmal, d.h. bringe auch relevante 
Informationen mit hinein.

Allgemein gilt:
- Einstellungen überprüfen (Speichermodell, Compiler, Linker)
- auf Warnungen und Errors achten und beheben
- Speicherauslastung prüfen (*.m51-File)


Peter

von Markus (Gast)


Lesenswert?

Verwendest du Interrupts ?
(Verriegelung von Datenzugriffen)
Wie groß ist deine Stack Größe ?
(Kann sein das du manchmal einen Stack Overflow hast!)

von Astrid (Gast)


Lesenswert?

Hallo!
Die Beiträge sind zwar schon ein paar monate her, aber trotzdem würde 
ich gerne wissen, ob es irgendeine Lösung gab.
Ich hatte das gleiche Problem, dass aber auf einen Stack-Overflow 
zurückzuführen war. Jetzt habe ich ein anderes - evtl. ähnliches Problem 
(Stack ist aber ok). Variablen, die sich im XDATA befinden, werden bei 
einem Funktionsaufruf geändert. Hört sich schon an wie ein 
Stack-Problem, aber eigentlich befindet sich der doch in IDATA? Und die 
Variablen liegen mitten in XDATA (ca. 100H bei FFFH XDATA-Größe)
Ich benutze das LARGE Memory Model.
Kann mir jemand helfen??

Astrid

von Oliver (Gast)


Lesenswert?

Hallo Astrid,
der Keil verwendet zudem noch einen Userstack. Lokal definierte 
Variablen in Funktionen werden dort abgelegt und beim Verlassen wieder 
freigegeben. Siehe den Startup-Code Start167.a66?

Grüße
Oliver

von Astrid (Gast)


Lesenswert?

Hallo Oliver!

Danke für die Antwort - soweit war ich jetzt auch schon ;-)
Ich benutze einen C8051. Inzwischen bin ich einen Schritt weiter und 
habe bemerkt, dass der Befehl "MOVX @DPTR,A" den Wert aus A an zwei 
Stellen in meinen XDATA-Memory schreibt, nämlich an die Adresse, die der 
DPTR beinhaltet (also die richtige Stelle) und die gleiche 
Adresse-1000H. Wenn also der DTPR auf 12B9H steht, wird der Wert 
ebenfalls an die Stelle 2B9H geschrieben... im worst case also an eine 
Adresse, an der sich irgendwelche Variablen befinden.
Irgendeine Idee??

LG,
Astrid

von Oliver (Gast)


Lesenswert?

Sorry,
bin kein C8051-Jünger. Plage mich seit Anbeginn der Zeit mit dem C167 
rum.

Grüße
Oliver

von Astrid (Gast)


Lesenswert?

Schade... Trotzdem Danke!!!

von Peter D. (peda)


Lesenswert?

@Astrid,

der MOVX schreibt bestimmt nicht an 2 Adressen gleichzeitig, Du liest 
nur von 2 Adressen das Gleiche.
Entweder Du hast eine Adressleitung nicht angeschlossen oder Dein 
externer Speicher ist so klein und wird deshalb an der höheren Adresse 
gespiegelt. Im Klartext, diese Adreßleitung wird gar nicht ausgewertet.


Das Large-Model sollte man möglichst nicht verwenden, es erzeugt nur 
unnötig großen und langsamen Code. Deshalb ist als default auch das 
Small-Model eingestellt.

Da ich nur selten externen Speicher angeschlossen habe, geht sowieso nur 
Small.

Aber auch mit externem Speicher ist Small immer zu empfehlen und 
sauschnell. Man kann ja größere Variablenfelder trotzdem als XDATA 
deklarieren. Also ist man in der Speicherverwendung in keinster Weise 
eingeschränkt.

Und wenn man möglichst wenige globale bzw. static Variablen hat, reicht 
der interne RAM (128 Byte) verdammt weit. Der Keil kann ihn nämlich 
überlagern, d.h. für mehrere Funktionen den selben Speicher verwenden.

Hier mal ein Beispiel:

http://www.specs.de/users/danni/appl/soft/c51/thclock/index.htm



Peter

von Hammoud (Gast)


Lesenswert?

Hi,

Es hört sich vielleicht ein wenig eigenartig an, aber ich habe das
selbe Problem wie Astrid. Das eigenartige bei mir ist, dass dieses
Problem (Die Manipulation von Variablen) nur dann auftaucht, wenn ich
eine Funktion aufrufe, die eine "printf"- Anweisung enthält. Wird
diese entfernt, läuft alles eiwandfrei. Auf der Keil-Website stand
irgend etwas davon, dass im Large-Modell 40 Byte für die "printf"
Anweisung im XDATA-Bereich reserviert werden. Parameter für printf
werden in diesen 40 Bytes abgelegt. Ich vermute, das dies das Problem
ist.

Hammoud

von Der Elektrische Reiter (Gast)


Lesenswert?

Ein Paar Vermutungen...

A) Hardware-Ursache:
Der Abstand zwischen der Originaladresse un der Schmieradresse von
1000h hört sich schon stark nach einem Problem der Adressedcodierung
an. Deshalb stellen sich drei Fragen:
1. An welcher Adresse landen die Werte eines movx @dptr,a, wenn
dptr=12bah?
2. Gibt es eine weitere Schmieradresse im Abstand eines ganzzahligem
vielfachen von 1000h?
3. Wei groß (byte) ist der angeschlossene XRAM und an welchen Adressen
ist ein eingeblendet?

B) prinf schreibt auf XRAM:
Ich gehe davon aus Problem(Hammoud)=Problem(Astrid). Da der Effekt mit
der Schmieradresse mit dem entfernen von printf verschwindet:
Schreibt printf auf diese Adresse? Vieleicht als push acc?
Dann wäre der ABstand von 1000h nur Zufall.

cu

von Astrid (Gast)


Lesenswert?

Hallo!

Kann es sein, dass diese Probleme immer nur im Mai auftreten? g

Ne, mal ernsthaft... 2 Jahre sind eine lange Zeit, aber ich meine mich
erinnern zu können, dass dieses "Doppelschreiben" daran lag, dass
mein realer Speicher kleiner war als der adressierbare und somit der
Bereich 0-FFFh identisch war mit 1000h-1FFFh. (Oder so ähnlich...) Ein
Faux-pas meinerseits... Man sollte wirklich vorsichtig mit dem
Large-Modell umgehen!

Vielleicht hilft dies jemandem hier...

Happy programming,
Astrid

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.