Forum: Mikrocontroller und Digitale Elektronik If-Bedingung und Else-Zweig gleichzeitig wahr


von Alexander (alecxs)


Angehängte Dateien:

Lesenswert?

Hallo hallo,
ich weiß das kommt evtl. bekannt vor, hat aber nichts mit dem Thread zu 
tun.
Beitrag "Arduino unter Windows stellt sich dumm an"

Wie kann eine Bedingung "gleichzeitig" wahr und falsch sein? Ich arbeite 
zum ersten Mal mit einem richtigen Debugger, sind das so typische 
Eigenarten?

Ich habe mal zwei Screenshots gemacht, dazwischen liegt nur eine Taste 
F5 es ist also noch derselbe Durchlauf. Er springt aber definitiv beide 
Zeilen an, wie funktioniert das?

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Alexander schrieb:
> Ich habe mal zwei Screenshots gemacht, dazwischen liegt nur eine Taste
> F5 es ist also noch derselbe Durchlauf. Er springt aber definitiv beide
> Zeilen an, wie funktioniert das?

Optimierung?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander schrieb:
> Er springt aber definitiv beide Zeilen an, wie funktioniert das?
Hast du die Optimierung ausgeschaltet?

> wie funktioniert das?
Wie sieht der zugehörige Assemblercode aus?

von Michael B. (laberkopp)


Lesenswert?

Alexander schrieb:
> wie funktioniert das?

Wahrscheinlich hast du Optimierung nicht so ausgeschaltet, wie es sich 
für Debuggen gehört.

Er wird nur das Laden des Werts in ein Register nach dem if aufteilen, 
aber das Abspeichern am Ziel zusammenfassen und macht eben das nach F1..

von Monk (roehrmond)


Lesenswert?

Rolf M. schrieb:
> Optimierung?

Denke ich auch. Deaktiviere den Optimizer, damit der generierte Code mut 
dem Quelltext überein stimmt. Dann funktioniert der Debugger richtig.

Als Kompromiss gibt es die Stufe -Og, die nur so weit optimiert, dass 
der Debugger nicht beeinträchtigt wird. Ich benutze  standardmäßig die 
Stufe -O1, weil der Debugger damit auch noch weitgehend funktioniert und 
ich mit der selben Stufe in Produktion gehen kann.

https://community.st.com/t5/stm32cubeide-mcus/how-do-i-change-code-optimization/td-p/271208

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Optimierung? Wenn das nötig ist für debuggen, wieso macht das die IDE 
nicht automatisch? Wie schalte ich das aus?

Assemblercode, der war gut. Ich bin froh wenn ich den CPP code 
verstehe..

edit: danke, jetzt lässt es sich nicht mehr starten
1
ld.exe: LishuiFOC.elf section `.text' will not fit in region `FLASH'
2
ld.exe: region `FLASH' overflowed by 9780 bytes
3
collect2.exe: error: ld returned 1 exit status

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Alexander schrieb:
> Optimierung? Wenn das nötig ist für debuggen, wieso macht das die IDE
> nicht automatisch?

Weil du entscheiden musst, ob du Optimierungen haben willst oder nicht. 
Abgesehen davon hat es gewisse Nachteile, wenn du mit anderen 
Einstellungen Debugst als die, mit denen dein Programm später laufen 
soll.

> Wie schalte ich das aus?

Mit dem dazugehörigen Schalter deiner IDE.

Alexander schrieb:
> edit: danke, jetzt lässt es sich nicht mehr starten
> ld.exe: LishuiFOC.elf section `.text' will not fit in region `FLASH'
> ld.exe: region `FLASH' overflowed by 9780 bytes
> collect2.exe: error: ld returned 1 exit status

Das heißt, durch deine geänderten Einstellungen braucht dein Programm 
jetzt auf einmal irrsinnig viel Flash.

: Bearbeitet durch User
von Monk (roehrmond)


Lesenswert?

Alexander schrieb:
> wieso macht das die IDE nicht automatisch?

Macht sie normalerweise.

> Wie schalte ich das aus?

Scrolle nochnal hoch, ich habe dir einen Link zur Anleitung gepostet.

> FLASH' overflowed by 9780 bytes

Shit happens. Jetzt brauchst du einen Mikrocontroller mit mehr Speicher. 
Oder probiere die beiden von mir genannten Optionen.

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Steve van de Grens schrieb:
> Scrolle nochnal hoch, ich habe dir einen Link zur Anleitung gepostet.

hatte sich überschnitten. mit Stufe -Og klappt es. danke.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Steve van de Grens schrieb:

> Alexander schrieb:
>> wieso macht das die IDE nicht automatisch?
>
> Macht sie normalerweise.

Nein, sicher nicht automatisch. Es wird natürlich die eingestellte 
Optimierung verwendet.

von Monk (roehrmond)


Lesenswert?

Ob S. schrieb:
> Nein, sicher nicht automatisch. Es wird natürlich die eingestellte
> Optimierung verwendet.

Die IDE richtet zwei Konfigurationen ein. Eine zum Debuggen und eine für 
das Release.

von Monk (roehrmond)


Lesenswert?

Oh, ich sehe gerade, dass er die alte AC6 IDE (System Workbench for 
STM32) benutzt. Meine Aussage bezog sich auf die Cube IDE. Ich kann mich 
nicht erinnern, wie viele Konfigurationen die AC6 IDE anlegt.

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Ja, extra Debugging Konfiguration ist vorhanden, in dieser habe ich es 
auf -Og geändert.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Steve van de Grens schrieb:

> Die IDE richtet zwei Konfigurationen ein. Eine zum Debuggen und eine für
> das Release.

Ja sicher. Aber man muss dann immer noch die passende wählen. Und zwar 
bewusst, bevor man debuggt. Da geht nix automatisch.

von J. S. (jojos)


Lesenswert?

man kann auch einzelne Dateien mit debug übersetzen wenn der Platz im 
Flash knapp ist, mit dem Eclipse Builder geht das einfach: Properties 
von der Quelldatei im Kontextmenu auswählen und optimize ändern. Beim 
Release Build muss man dem Linker evtl. noch sagen das er die Symbole 
nicht wegschmeißt.

von Michi S. (mista_s)


Lesenswert?

Alexander schrieb:
> Wie kann eine Bedingung "gleichzeitig" wahr und falsch sein?

Quantenfluktuationen - so ähnlich wie bei Schrödingers Katze.

Erst wenn Du in Deine Variable reinschaust entscheidet sich, welcher 
Ausführungspfad durchlaufen wurde, wenn Du im weiterten Verlauf NIE mehr 
aus der Zielvariable liest, vielleicht weder der eine noch der andere, 
denn dann kann das ganze if-Statement weg. ;)

von Jim M. (turboj)


Lesenswert?

Alexander schrieb:
> Wie kann eine Bedingung "gleichzeitig" wahr und falsch sein?

Gar nicht.

Aber ARM v7-m kennt halt IT Blöcke, das sind kurze (IIRC 4 Instruktionen 
lange) Blöcke mit bedingter Codeausführung. Dabei sieht der Debugger 
schlecht ob eine Instruktion im Block jetzt "scharf" ist (Bedigung 
erfüllt) oder nicht.  Das würde man im Disassembly erforschen können.

Der Prozessor "führt" die Instuktionen auch soweit aus das man beim 
Steppen durch den Code auch an den Stellen anhält wo die Bedingung nicht 
erfüllt ist. Dadurch landet man dann sowohl im if als auch im else Zweig 
einer (einfachen) Bedingung.

Im obigen Beispiel solltest Du im Debugger sehen können das RxState nur 
in einer der beiden Fälle beschrieben wird.

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.