AtmelStudio Compilerprobleme?

Gast #3353936
Lesenswert?

Mahlzeit,

ich arbeite derzeit mit einem Atmel SAM4S.
Ich habe einige Probleme im Moment bei der Programmierung, vielleicht 
steh ich aber auch gerade nur einfach auf dem Schlauch.
Hauptproblem ist wohl, dass irgendwie meine Variablen nicht richtig 
initalisiert werden.

meine Hauptschleife sieht im Moment zu Testzwecken wie folgt aus:
1
int main(void)
2
{
3
  system_init();
4
        uint16_t TRX[3];
5
  TRX[0]=1;
6
  TRX[1]=2;
7
  TRX[2]=3;
8
  uint16_t TXB=0;
9
  uint16_t i = 0;
10
  while(1)
11
  {
12
    for(i=0; i<3; i++)
13
    {
14
      TXB=TRX[i];
15
    }
16
   udi_cdc_putc('n');
17
   delay_ms(500);
18
   }
19
}
Nun habe ich folgendes Problem:
ich habe einen Breakpoint in der For-Schleife gesetzt. Aber beim 
debuggen erreicht das Programm nie die Stelle.
Ich habe dann eine USB-Ausgabe hinzugefügt (auskommentierter Teil), die 
auch richtig funktioniert und auch einen Breakpoint darauf gesetzt.
Wenn ich nun die Variablen TXB, TRX und i überwache, sehe ich als Wert 
"Unkown location".

Woran liegt das ?
#3353982
Lesenswert?

Holger schrieb:

> Woran liegt das ?

Das liegt daran, dass der Optimizer rausgefunden hat, dass sich am 
externen Verhalten des Programms nichts ändert, wenn er die Variablen 
und die Schleife einfach rauswirft.
ALso hat er genau das getan. Dein Compiler ist nämlich ein hilfreicher. 
Der versucht für dich Laufzeit und/oder Speicherplatz aus dem Programm 
rauszuholen, wo er nur kann. Entdeckt er irgendwo eine 'Berechnung' 
deren Ergebnis überhaupt nicht benutzt wird, dann ist die 'Berechnung' 
offensichtlich für die Funktion des Programms nicht notwendig. Also: weg 
damit.
Gast #3354037
Lesenswert?

Ok kann man diese Optimierung irgendwie abschalten?
Mein Code-Beispiel ist vllt auch etwas falsch gewählt..
Aber wieso sagt der Debugger dann "Unkown location"
Ich hatte es auch schon, dass irgendwas mimt optimized da stand.
#3354041
Lesenswert?

Holger schrieb:
> Ok kann man diese Optimierung irgendwie abschalten?

Sicher.
Hängt von deiner IDE ab. Irgendwo gibt es einen Menüpunkt 'Options' oder 
'Configuration' und dort findet sich dann auch eine Einstellung, welchen 
Optimiergrad die IDE dem Compiler vorgibt.
Wenn du keine IDE benutzt, sondern ein Makefile, dann findet sich die 
entsprechende Angabe irgendwo da drinnen.


> Mein Code-Beispiel ist vllt auch etwas falsch gewählt..
> Aber wieso sagt der Debugger dann "Unkown location"

Weil im Programmtext eine Variable auftaucht, die es im laufenden 
Programm aber nicht gibt.

> Ich hatte es auch schon, dass irgendwas mimt optimized da stand.

dann gibt es noch den Fall, dass es eine Variable zwar formal gibt, das 
für sie aber kein Speicherplatz reserviert wird, weil der Compiler es 
geschafft hat, die Variable während ihrer Verwendungszeit komplett in 
einem CPU Register zu halten.
Persönliche Seite #3354344
Lesenswert?

Karl Heinz Buchegger schrieb:
> Holger schrieb:
>> Mein Code-Beispiel ist vllt auch etwas falsch gewählt..
>> Aber wieso sagt der Debugger dann "Unkown location"
>
> Weil im Programmtext eine Variable auftaucht, die es im laufenden
> Programm aber nicht gibt.

Das ist nicht wesentlich. Wichtig ist, daß die Info in den 
Debug-Informationen enthalten ist, was bei halbwegs modernen 
Debug-Formaten wie DWARF-3 der Fall ist.  Beispielsweise wird in
1
void fun (void)
2
{
3
    int var = 0;
4
}
ein Eintrag für var erstellt und eingetragen, daß es den Wert 0 hat.

Oft hakt es an ältliche Debugger, die diese Information nicht adäquat 
auszuwerten oder anzuzeigen wissen. Der Debugger ist offenbar so 
engstirnig, daß er versucht, über die Adresse von var an dessen Wert 
zu gelangen, was natürlich fehlschlagen muß.

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