Forum: Mikrocontroller und Digitale Elektronik Problem Switch case 8051 µvision


von HELP (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, hab meinen c Quelltext mal angehangen.

Nutze SAB80517A und yvision4.

Das Problem ist, das wenn ich im Schrittmodus den Quelltext abarbeite 
case 1 übersprungen wird, also er landet sofort beim break und spring 
dann (warum auch immer) in die case 3.

Im Headerfile sind Ampelphasen definiert in der Form:

#define Rot_Rot         P5=0x09; P3&=0xFB
#define Rot_RotGelb    P5=0x0B
...

Ich verstehe nicht, weshalb case 0,2,3 funktionieren, aber die 1 nicht.

Jemand ne Idee?

von HELP (Gast)


Lesenswert?

Sorry, Nachtrag:

meine natürlich die 2. switch(j) case anweisung wo der delay 
funktionsaufruf immer mit drin ist.

Gruß

von Yagan Ζ. D. (yagan)


Lesenswert?

Wahrscheinlich optimiert der Compiler die case-1-Sequenz weg, da sie 
kommplett im case-3-Code enthalten ist.

Ciao, Yagan

von Ralf (Gast)


Lesenswert?

> Wahrscheinlich optimiert der Compiler die case-1-Sequenz weg, da sie
> kommplett im case-3-Code enthalten ist.
Das würde man daran erkennen, dass zwar in den 3er-Zweig gesprungen 
wird, dieser aber "mittendrin" abgearbeitet wird. Ausserdem müsste 
soweit ich weiss in dem Fall die Sequenz aus 1 mit dem letzten Teil aus 
3 identisch sein, danach müsste direkt das break und nichts anderes mehr 
kommen. Das würde hier ja zutreffen.

Funktioniert denn das "Problem"? =)

Ralf

von R. W. (quakeman)


Lesenswert?

Poste mal deine Header Datei. Dann kann ich es hier selber mal testen. 
Wobei ich tendenziell schon die Compiler Optimierung im Verdacht habe.

Ciao,
     Rainer

von HELP (Gast)


Angehängte Dateien:

Lesenswert?

also er scheint tatsächlich an die stelle zu springen ab der case 3 case 
1 entspricht...

kann es leider im mom. nich in der praxis teste.

von Peter D. (peda)


Lesenswert?

HELP schrieb:
> also er scheint tatsächlich an die stelle zu springen ab der case 3 case
> 1 entspricht...

Compiler dürfen nicht nur optimieren, sondern sie sollen es auch.

Schau doch mal ins Assemblerlisting.


Peter

von R. W. (quakeman)


Lesenswert?

Ich hab das Programm eben compiliert und das scheinbare "Problem" kommt 
durch die Optimierung des Compilers zustande. Er referenziert die 
identischen Zeilen an nur einer Stelle, anstatt es jedesmal erneut zu 
behalten. Es ist also alles völlig korrekt. Nur im Debug Modus springt 
er eben über die Zeilen hinweg, was etwas verwirrend ist.

Wenn du die Optimierungsstufe von 8 (default) auf 7 herabsetzt wird der 
Code nicht mehr wiederverwendet und an jeder Stelle behalten. Dann 
springt er auch nicht mehr über die Zeilen hinweg, aber der Code wird 
ein gutes Stück größer.

Ciao,
     Rainer

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.