AVR Studio - "location not valid"

Gast #937896
Lesenswert?

hallo

mein Programm läuft auf einem ATtiny und hat noch einen kleinen Fehler - 
also hab ich das AVR Studio installiert und wollt das Ganze mal 
debuggen. Im Watch -Window krieg ich dann auch gleich die erste 
Fehlermeldung. Das seltsame ist nur sie kommt schon kurz nach 
Programmstart bei der Variablendeklaration;

int main(void)
{
    int i;
    unsigned int c;

    char buffer[65];
    char Datensatz[7];

  i = 0;
....

Wenn der Debugpfeil über diese Zeilen gesprungen ist, steht im 
Watch-Window:


c         Location not valid
buffer    Location not valid
i         0
Datensatz [...]

Damit gibts für den weiteren Programmablauf wohl nur noch die Variablen 
Nr. 3 und 4. Gibts dafür ne einleuchtende Erklärung?

danke
Martin
Gast #937903
Lesenswert?

Ohne mich auszukennen würde ich vermuten, dass "Location not valid" nur 
heißt, dass die Variable noch nicht initialisiert ist.
Oder sie wurde vom Compiler wegoptimiert. Soweit ich weiß darf er das. 
Schalt halt zum Debuggen mal die Optimierung aus.

Sebastian
#937909
Lesenswert?

Das sind Variablen, die nur in Registern existieren, nicht im RAM. 
Entweder du schaust in den Assembler-Code, um zu sehen, in welchem 
Register die Variable steckt, dann kannst du einfach das Register im 
Auge behalten, oder du schaltest die Optimierungen aus, dann stehen sie 
im RAM und du kannst sie "normal" beobachten.
Gast #1225316
Lesenswert?

Guten Tag

Ich weis dass dieser Beitrag etwas älter ist aber ich habe genau dass 
selbe Problem.

Ich bekomme immer wieder bei einigen Variablen die Meldung "Location not 
valid".

Hier ist ein Beispielcode bei dem der Fall auftritt:
Weis wer warum "uch" und "uchTmpVal" als "Location not valid" angezeigt 
werden?
1
void Unterfunktion(void)
2
{
3
   unsigned char uch; //Zählervariable
4
   unsigned char uchTmpVal = PINC;/* Zwischenspeichern damit sich die Daten während der Bearbeitung nicht ändern*/
5
   
6
   for(uch = 0x00; uch < 0x08; uch++)
7
   {
8
      PORTB = uchTmpVal & uch;
9
...
10
// Hier wird uchTmpVal weiter bearbeitet.
11
   }
12
}
13

14
void main(void)
15
{
16
...
17
//uC initialisieren
18
...
19

20
   while(1)
21
   {
22
      ...
23
      Unterfunktion();
24
      ...
25
   }
26
}

Ist es jetzt die einzige Möglichkeit dass überall ein volatile vor die 
Variablen zu setzen damit sie mir nicht wegoptimiert werden?
Ich habe übrigens extra die neueste Version von AVR-Studio und WinAVR 
installiert um sicher zu sein dass es nicht daran liegt.
Gast #1384796
Lesenswert?

Nur für en nächsten der fragt:

Bei

Project -> Configuration Options -> General

unter 'Optimization' von s auf 0 stellen oder, wenn ein externes 
Makefile verwendet wird, dann diese Änderung im Makefile vornehmen.
#2608522
Lesenswert?

Auch wenn der Beitrag schon uralt ist, bin ich mir sicher dass er noch 
oft gelesen wird. Also: Danke für die klaren Tips !
Noch'n Tip, auch auf die Gefahr hin dass er selbstverständlich 
erscheint.
Um das Programm nach Rückstellen auf -0s zu überprüfen: Um dann den Wert 
einer (z.B. int) Variablen "int X" zu überprüfen, einfach im gleichen 
Gültigkeitbereich 'ne volatile Variable "int vV" definieren.  im 
Programm   "vV = X"; setzen und vV in die Watchlist übernehmen.
Natürlich kann vV mehrfach auch für das Verfolgen weiterer Variablen 
wiederverwendet werden.

Funzt: Hermann
#2884767
Lesenswert?

Sven P. schrieb:
> Hat da der Optimierer zugeschlagen...? Wenn du die Variable nicht
> verwendest, dann schmeißt der die nämlich komplett raus.

Hallo Gemeinde

Habe auch gerade so ein Problem bei der Funktion:

unsigned char NMEA_checksum(char *string)
{
  char check[2];
  unsigned char value = 0;
  unsigned char Ergebnis;

  while(*string != '*' )
  {
    value ^= *(string++);
  }

  string++;
  check[0] = *(string++);
  check[1] = *(string++);

  Ergebnis = 0;
  if (strtol(check, NULL, 16) == value) Ergebnis = 1;

  return Ergebnis;

}

Hier wird "value" in WATCH als "Lacation not valid" angezeigt.
SIe wird aber offensichtlich gebrtaucht.

Kann das jemand erklären ???

Grüße
TOrsten
Gast #2886503
Lesenswert?

Wer das "volatile" umgehen will, kann das Entsorgen einer Variablen auch 
dadurch verhindern, indem er sie einfach nochmal benutzt.
Kurz vor dem return am Ende der Funktion ein:
if (value == 0);
Sollte den Compiler dazu zwingen, das Teil bis zu dieser Stelle am Leben 
zu erhalten. Es sei denn Du optimierst zu aggressiv.
Persönliche Seite #2886512
Lesenswert?

amateur schrieb:
> Wer das "volatile" umgehen will, kann das Entsorgen einer Variablen auch
> dadurch verhindern, indem er sie einfach nochmal benutzt.
> Kurz vor dem return am Ende der Funktion ein:
> if (value == 0);
> Sollte den Compiler dazu zwingen, das Teil bis zu dieser Stelle am Leben
> zu erhalten. Es sei denn Du optimierst zu aggressiv.

Tut er aber.
Gast #2886520
Lesenswert?

amateur schrieb:
> kann das Entsorgen einer Variablen auch
> dadurch verhindern,

Abgeshen davon, daß Compiler auch in der niedrigsten Optimierungsstufe 
nicht blöd sind, und leere Programmanweisungen erkennen, geht es 
überhaupt nicht darum, das entsorgen zu verhindern.

Volatile sorgt dafür, daß die Variable bei jedem Lesen neu aus dem 
Speicher gelesen wird, und nicht einfach der Wert, der noch vom letzten 
lesen in einem Prozessorregister steht genommen wird. Den der bekommt 
von einer zwischenzeitlichen Änderung des Wertes im Speicher durch eine 
ISR nichts mit.

Oliver
#2886978
Lesenswert?

Torsten B. schrieb:
> Danke, werde ich so machen.
> Hab die Funktion im Netz geklaut.

Weißt du noch wo?
Ein Tip: klau nie wieder bei dem Typen.
Stringbehandlung ist der erste Stolperstein für jeden C-Programmierer. 
Und da siehts bei ihm eher düster aus, wenn er nicht weiß, dass er für 
einen String mit 2 sichtbaren Buchstaben ein Array der Länge 3 braucht 
und was er mit dem 3.ten char im Array machen muss.

> Was ist dann daran alles falsch?

Du könntest zb mal sicher stellen, dass strtol sauber arbeitet, indem du 
ihm einen korrekten String mit 2 Buchstaben (der in einem Array aus 3 
chars angelegt werden muss, wegen dem abschliessenden \0) vorlegst.


Und den potentiellen Fehler in der Abbruchbedingung der while Schleife 
würde ich auch behandeln. Schliesslich ist die Checksumme im NMEA 
optional und nicht zwingend vorgeschrieben.
Gast #2887047
Lesenswert?

Noch was optisches, ändert an der Funktion selbst nichts:
1
unsigned char Ergebnis;
2
[...]
3
Ergebnis = 0;
4
if (strtol(check, NULL, 16) == value) Ergebnis = 1;
5
return Ergebnis;

Das lässt sich deutlich kürzer schreiben:
1
return (strtol(check, NULL, 16) == value)

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