Forum: Mikrocontroller und Digitale Elektronik Probleme mit AVR Studio Optimierung bei uint32_t


von Stefan H. (zero-cool)


Lesenswert?

hi all ich habe ein Problem mit folgenem Code:
1
uint32_t read_R (void)
2
{
3
  uint32_t Wert = 0;  
4
5
  ADMUX &= ~(1<<MUX0);            
6
  ADCSRA |= (1<<ADSC);            
7
  while ( !(ADCSRA & (1<<ADIF))) {}
8
  Wert += ADCL;
9
  Wert += (ADCH * 0x100);
10
11
        ....
12
}
(ist jetz nur ein ausschnitt)

(Optimierung: -0s)
Wenn ich diese stelle mit dem AVR Studio simuliere und die variable Wert 
beobachte, so wird sie nicht auf 0 gesetzt, obwohl das in der 
deklaration geschieht. Das aufaddieren der Werte von ADCL und ADCH 
funktioniert ebenfalls nicht...

(Optimierung: -00)
Hier funktioniert alles einwandfrei, da die deklarationszeile nicht 
wegoptimiert wurde. auch die Ausgaben des ADC werden aufaddiert, wie ich 
es will (nur so ist der code halt doppelt so groß wie oben...)

Gibt es da abhilfe?
Was haltet ihr vom AVR Studio als Programmieroberfläche und compiler?
Gibt es eine möglichkeit meinen µC Code mit µVision3 (Keil) zu schreiben 
und zu kompilieren?
Finde ihn dort nämlich nicht bei der Device Auswahl...
geht übrigends um nen Atmel Atmega 8535.


Vielen Dank schonmal für eure Antworten!

Gruß
Stefan

von Sven P. (Gast)


Lesenswert?

Stefan Hopf schrieb:
> hi all ich habe ein Problem mit folgenem Code:
> (ist jetz nur ein ausschnitt)
Das ist immer ungünstig.

> (Optimierung: -0s)
Wenn du optimierst, kannst du dich nicht mehr auf den Debugger 
verlassen. Schau lieber ins Assembler-Listing, eventuell wurde aus 
anderen Gründen etwas wegoptimiert.

> Was haltet ihr vom AVR Studio als Programmieroberfläche und compiler?
AVR Studio kenne ich nicht mehr (zu lange her), der C-Compiler ist der 
AVR-GCC, und von dem halte ich nicht soooooo besonders viel.

von Stefan H. (zero-cool)


Lesenswert?

hi Sven
erstmal danke für die schnelle antwort!

ok wenn es sinnvoller ist, dann poste ich das komplette modul:
1
uint32_t read_R (void)
2
{
3
  uint32_t Wert = 0;  
4
5
  ADMUX &= ~(1<<MUX0);            
6
  ADCSRA |= (1<<ADSC);            
7
  while ( !(ADCSRA & (1<<ADIF))) {}
8
  Wert += ADCL;
9
  Wert += (ADCH * 0x100);
10
11
  ADMUX |= (1<<MUX0);
12
  ADCSRA |= (1<<ADSC);
13
  while ( !(ADCSRA & (1<<ADIF))) {}
14
  Wert += ADCL;
15
  Wert += (ADCH * 0x100);
16
    
17
  Wert *= 488281;  
18
  Wert /= 14;
19
  Wert /= 100000;
20
  Wert += 900;
21
  
22
  Wert = gerundet (Wert);  
23
  
24
  
25
  return Wert;
26
}

> Wenn du optimierst, kannst du dich nicht mehr auf den Debugger
> verlassen. Schau lieber ins Assembler-Listing, eventuell wurde aus
> anderen Gründen etwas wegoptimiert.

Ja also das rücksezten auf NULL der Variable entfällt auch laut 
Assembler listing.
Was meinst du mit anderen Gründen?

von Anja (Gast)


Lesenswert?

>Ja also das rücksezten auf NULL der Variable entfällt auch laut
>Assembler listing.
Warum soll der Compiler auch erst die Variable auf null setzen wenn 
anschließend der ADC-Wert addiert wird? Da ist es doch einfacher statt 
der Addition eine einfache Zuweisung zu machen.
Wenn du haben willst daß tatsächlich eine Addition durchgeführt wird 
mußt Du die Wert-Variable als "volatile" deklarieren.

Also:
volatile uint32_t Wert = 0;

Übrigens:
>  Wert += ADCL;
>  Wert += (ADCH * 0x100);

kann man kürzer schreiben als
   Wert += ADCW;

von Stefan H. (zero-cool)


Lesenswert?

hi Anja
cool das mit dem ADCW Register hab ich in meinem headerfile wohl 
überlesen (habs nun gesehn) =)

warum volatile?
Es lässt sich zwar damit simulieren und funktioniert, aber warum, ich 
verwende doch im mom noch keine Interrupts!
Ist bis jetzt ja bloß n test code.

Achja weiß jemand, warum das Variablen beaobachtem beim AVR Studio 
manchmal funktioniert, und manchmal nicht (not in scope, location not 
valid)?

Gruß
Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan Hopf schrieb:

> warum volatile?

Damit der Compiler daran gehindert wird, an dieser Variablen 
Optimierungen durchzuführen, wie zb

Die Variabel wird komplett wegoptimiert ...

> Achja weiß jemand, warum das Variablen beaobachtem beim AVR Studio
> manchmal funktioniert, und manchmal nicht (not in scope, location not
> valid)?

... wie zb hier

von (prx) A. K. (prx)


Lesenswert?

Diese Optimierung hat aber in diesem Fall nur Einfluss auf das im 
Debugger/Simulator beobachtete Verhalten. Das Ergebnis stimmt obwohl der 
Debugger die Variable falsch anzeigt.

Im Prinzip gilt deshalb, dass man nur bei abgeschalteter Optimierung 
debuggen sollte. Was bei AVRs leider nicht ganz praktikabel ist. Sei es 
weil der Code dann nicht ins Flash passt, sei es weil die _delay_xx 
Funktionen dann nicht funktionieren.

von Stefan H. (zero-cool)


Lesenswert?

ah ok dann ist mir das jetz auch klar...
denn im controller funktionierts ja wies soll... bloß beim debuggen eben 
ned, aber wenn ich das weiß, dann muss ich halt die optimierung 
ausschalten, wenn ich debugge.

Vielen Dank für eure Hilfe!

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.