If-Bedingung und Else-Zweig gleichzeitig wahr

OP #7533330
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?

Angehängte Dateien:
Gast #7533339
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

OP #7533341
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
#7533345
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.

Gast #7533348
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.

#7533374
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.

#7533426
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. ;)

#7534718
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren