Forum: Mikrocontroller und Digitale Elektronik AVR Studio Debug "The symbol could not be found"


von Franz (Gast)


Lesenswert?

Hallo!

Kann mir jemand helfen. Ich wollte das On-Chip-Debugging mit dem JTAG 
ICE mkII testen. Leider scheitert das schon bei folgendem 
Minimalprogramm
1
int main() {
2
   uint8_t i = 0;
3
4
   while (1) {
5
      i++;
6
   }
7
}

Ich wollte einen Data-Breakpoint auf 'i' setzen bzw. 'i' als 
Watch-Variable verwenden. Bei ersterem bekomme ich im Fenster 'Add data 
breakpoint' die Meldung 'The symbol 'i' could not be found'. Wenn ich 
das mit der Watch-Variable versuche bekomme ich die Meldung 'Location 
not valid'.

Mache ich einen systematischen Fehler oder warum funktioniert rein 
garnichts?

Danke für die Hilfe,
Franz.

von Nils (Gast)


Lesenswert?

Hallo Franz,

> 'The symbol 'i' could not be found'
hört sich danach an, dass der Präprozessor mir Dir schimpft.

Alle Includes da? Die, z.B.:
#include <avr/io.h>
#include <stdint.h>

Gruß
Nils

von Jochen (Gast)


Lesenswert?

Hm...

Wenn ich das so anschaue: das Porgramm macht ja auch nichts. Kein 
Schwein interessiert es, wie gross "i" gerade ist. Soll heissen:
Vielleicht hast du alles wegoptimiert?!
Wäre jedenfalls meine erste Vermutung.
Entweder Optimierung aus oder
 PORTA = i++;
statt
 i++;
Dann natürlich mit #include <avr/io.h>

von Rahul D. (rahul)


Lesenswert?

>hört sich danach an, dass der Präprozessor mir Dir schimpft.

Nö, es ist der Debugger.
Vermutlich optimiert der Compiler alles, was mit i zu tun hat einfach 
weg, weil, wie Jochen schon schrieb, nichts ausser Hochzählen damit 
gemacht wird.

von Franz (Gast)


Lesenswert?

Natürlich - ich hab die Rechnung ohne den Compiler gemacht.
'i' wird tatsächlich wegoptimiert. Das lässt sich z.B. durch ein 'PORTx 
= i;' in der Schleife vermeiden.
Jetzt kann ich 'i' auch bequem als Watch-Variable markieren und dessen 
aktuellen Wert beobachten.

Danke für die Tips,
Gruß Franz.

von Franz (Gast)


Lesenswert?

Ein kleines Problem gibt es noch bei folgendem Szenario:
1
void bla() {
2
  uint8_t x = 0;
3
4
  PORTA = x;
5
  x++;
6
  PORTA = x;
7
  x++;
8
  PORTA = x;
9
}
10
11
12
int main() {
13
  DDRA |= 0xFF;
14
15
  bla();
16
}

Wenn ich jetzt hier versuche in der Funktion 'bla()' den Inhalt von 'x' 
als Watch-Variable zu kontrollieren, dann bekomme ich die Meldung 
'Location not valid'. Warum funktioniert das nicht?

von Simon K. (simon) Benutzerseite


Lesenswert?

Franz wrote:
> Warum funktioniert das nicht?

Weil der Compiler die "PORTx = x++" Aufrufe durch Konstanten ersetzt. 
Die Variable x gibt es also im "richtigen" Code nicht mehr.

von Tobi (Gast)


Lesenswert?

Deklarier die Variablen als "volatile".
Damit umgehst du Optimierungen- Die Variable liegt dann im SRAM.
Mfg

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.