Hallo, Ich habe ein erstes Testprogramm im Atmel Studio 6 erstellt und versuche nun, dieses im Debugger laufen zu lassen (siehe angehängtes Bild). Folgende Fragen sind aufgetaucht: - Warum kann auf die letzte Zeile "turns++" kein Breakpoint gesetzt werden? Beim Continue mit dem grünen Pfeil springt der Programmablauf zwischen den beiden oberen Breakpoints hin und her, erreicht aber den letzten nicht. - Rechtsklick auf die Deklaration/Definition von "turns", Add Watch -> Symbol wird in Watch1 aufgenommen -> ok. Warum aber wird "No location for symbol" gemeldet?. Gruss
hawa mand schrieb: > Warum kann auf die letzte Zeile "turns++" kein Breakpoint gesetzt > werden? Wie wird 'turns' weiterverwendet? Hat die Variable einen Einfluss auf Eingaben/ Ausgaben an den Ports/ Timern/ anderen Programmteilen ...? Wenn nicht, dann könnte die Variable Opfer der Optimierung geworden sein.
Ralf G. schrieb: > Wenn nicht, dann könnte die Variable Opfer der Optimierung geworden > sein.
1 | int main(void) |
2 | {
|
3 | int turns = 0; |
4 | |
5 | while(1) |
6 | {
|
7 | PORTC = turns; |
8 | PORTB ^= (1 << PORTB0); |
9 | _delay_ms(5); |
10 | PORTB ^= (1 << PORTB1); |
11 | _delay_ms(5); |
12 | PORTB ^= (1 << PORTB2); |
13 | _delay_ms(5); |
14 | turns++; |
15 | }
|
16 | }
|
Auch wenn "turns" verwendet wird: gleiches Bild Breakpoint auf "turns++" geht nicht.
Hi >Auch wenn "turns" verwendet wird: gleiches Bild >Breakpoint auf "turns++" geht nicht. Gehe mal davon aus, das der Compiler merkt, das die beiden Nutzungen von 'turns' sinnlos sind. MfG Spess
hawa mand schrieb: > Testprogramm im Atmel Studio 6 erstellt und versuche > nun, dieses im Debugger laufen zu lassen gewöhne dich dan präzise Angaben: Du benutzt kein Debugger-Tool, sondern den Simulator.
Kontrolliere die Optimierungseinstellung des Compilers, manchmal ist es nützlich, diese abzuschalten.
Zaunpfahl schrieb: > gewöhne dich dan präzise Angaben: Du benutzt kein Debugger-Tool, > sondern den Simulator. Recht hast du schon, aber... ...Atmel Studio ist diesbezüglich auch nicht präzise. Ein Simulator ist ja doch eher ein Debugger als ein Programmer ;-)
spess53 schrieb: > Gehe mal davon aus, das der Compiler merkt, das die beiden Nutzungen von > 'turns' sinnlos sind. Sowas meinte ich. Allerdings in diesem Fall sollte das nicht zutreffen.(?) Wird die Variable überhaupt im Speicher abgelegt? -> Zeigt der Simulator Variablen an, die nur in Registern existieren?
Ralf G. schrieb: > Wird die Variable überhaupt im Speicher abgelegt? -> Zeigt der Simulator > Variablen an, die nur in Registern existieren? Wo finde ich diese Angabe?
hawa mand schrieb: > Wo finde ich diese Angabe? Naja, da gibt's keine Angabe. Musst du mal nachsehen, was der Compiler für einen Code erstellt hat (*.lss-Datei)
Ralf G. schrieb: > Naja, da gibt's keine Angabe. Ok, falsch verstanden (oder unklar ausgedrückt deinerseits...). > Musst du mal nachsehen, was der Compiler > für einen Code erstellt hat (*.lss-Datei) In der .lss Datei steht "turns++" tatsächlich nicht drin.
spess53 schrieb: > Gehe mal davon aus, das der Compiler merkt, das die beiden Nutzungen von > 'turns' sinnlos sind. Begründung warum sinnlos? Weil PORTC noch nicht als Output definiert?
spess53 schrieb: > Gehe mal davon aus, das der Compiler merkt, das die beiden Nutzungen von > 'turns' sinnlos sind. Begründung warum sinnlos? Weil PORTC noch nicht als Output definiert?
Hi
>Begründung warum sinnlos? Weil PORTC noch nicht als Output definiert?
Weil der Wert von 'turns' nicht weiter verarbeitet wird.
MfG Spess
spess53 schrieb: > Weil der Wert von 'turns' nicht weiter verarbeitet wird. doch, wird er. Direkt vor deinem "sinnlos" Einwand hatte ich den aktualisierten Code gepostet: Beitrag "Re: Atmel Studio 6 Erste Schritte: Debug / Watch" -> da haben wir wohl etwas aneinander vorbei gepostet...
Hi
>-> da haben wir wohl etwas aneinander vorbei gepostet...
Nein. Du liest einen Wert vom Port ein. Nach etwas Blabla inkementierst
du den Wert. Dann wird neu vom Port gelesen und damit der inkrementierte
Wert überschrieben.
Also, wo ist jetzt die Stelle, an der du mit 'turns' etwas sinnvolles
machst?
MfG Spess
spess53 schrieb: > Nein. Du liest einen Wert vom Port ein. Nach etwas Blabla inkementierst > du den Wert. Dann wird neu vom Port gelesen und damit der inkrementierte > Wert überschrieben. Andersrum. PORTC wird geschrieben, nicht gelesen. Nachstehend ist das Code-Fragment ohne PORTB und delay: hawa mand schrieb: >
1 | > int main(void) |
2 | > { |
3 | > int turns = 0; |
4 | >
|
5 | > while(1) |
6 | > { |
7 | > PORTC = turns; |
8 | > turns++; |
9 | > } |
10 | > } |
11 | >
|
-> turns an PORTC zuweisen, turns inkrementieren.
Hi
>-> turns an PORTC zuweisen, turns inkrementieren.
Stimmt. Da war ich wohl mit Blindheit geschlagen. Entschuldige.
MfG Spess
spess53 schrieb: > Stimmt. Da war ich wohl mit Blindheit geschlagen. Entschuldige. Kein Problem. Danke für das bisherige sachliche Mitdiskutieren ;-)
@ hawa mand: Das einzige, was mir einfällt (ohne Anspruch auf Richtigkeit): Im Test1.lss finde ich: e6: 8f 5f subi r24, 0xFF ; 255 wobei "r24" "turns" entspricht: PORTC = turns; ae: 88 b9 out 0x08, r24 ; 8 und "subi r24, 0xFF" entspricht "turns++;" (ich hoffe, ich habe richtig gerechnet, dass -255 einem +1 entspricht). Lediglich der Quellcode "turns++;" steht nicht im Listing - warum auch immer. Daher geht auch der Breakpoint nicht. Danach müsste das Programm zumindest richtig arbeiten. Hast Du das mal getestet? Gruß Dietrich
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.