Forum: Mikrocontroller und Digitale Elektronik Atmel Studio 6 Erste Schritte: Debug / Watch


von Hawa M. (hawamand)


Angehängte Dateien:

Lesenswert?

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

von Ralf G. (ralg)


Lesenswert?

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.

von Hawa M. (hawamand)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Zaunpfahl (Gast)


Lesenswert?

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.

von Zaunpfahl (Gast)


Lesenswert?

Kontrolliere die Optimierungseinstellung des Compilers, manchmal ist es 
nützlich, diese abzuschalten.

von Hawa M. (hawamand)


Angehängte Dateien:

Lesenswert?

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 ;-)

von Ralf G. (ralg)


Lesenswert?

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?

von Hawa M. (hawamand)


Lesenswert?

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?

von Ralf G. (ralg)


Lesenswert?

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)

von Hawa M. (hawamand)


Angehängte Dateien:

Lesenswert?

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.

von Hawa M. (hawamand)


Lesenswert?

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?

von Hawa M. (hawamand)


Lesenswert?

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?

von spess53 (Gast)


Lesenswert?

Hi

>Begründung warum sinnlos? Weil PORTC noch nicht als Output definiert?

Weil der Wert von 'turns' nicht weiter verarbeitet wird.

MfG Spess

von Hawa M. (hawamand)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Hawa M. (hawamand)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

>-> turns an PORTC zuweisen, turns inkrementieren.

Stimmt. Da war ich wohl mit Blindheit geschlagen. Entschuldige.

MfG Spess

von Hawa M. (hawamand)


Lesenswert?

spess53 schrieb:
> Stimmt. Da war ich wohl mit Blindheit geschlagen. Entschuldige.
Kein Problem. Danke für das bisherige sachliche Mitdiskutieren ;-)

von Dietrich L. (dietrichl)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.