www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit AVR-Studio Attiny13 und GCC Optimierer


Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe gerade bei der Programmierung eines Attiny13 mit Hilfe von 
AVR-Studio 4.15 B623 und WINAVR GCC 20081205 ein Problem:
Bei der Verwendung des Optimierers  (im AVR-Studio Configuration 
Settings=>Optimization) scheint mir der Compiler die simpelsten 
Zuweisungen Wegzuoptimieren.

Zum Beispiel etwa so:


int main(void)
{
SystemStatus = 1;
ADMUX   = ReferenzIn;
ADCModus = StartUp;
}

würde nur die Zeile ADMUX ausgeführt werden - die anderen werden einfach 
übersprungen.

Dieser Effekt tritt bei allen Optimierungs-Einstellungen auf, außer bei 
-O0...

Hat jemand einen Tip?

Danke!
Gruß Manfred

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred wrote:
> die anderen werden einfach
> übersprungen.

Ja klar: die machen ja auch nichts.  Dafür keinen Code zu generieren,
ist folglich sowohl hinsichtlich des Speicherplatzbedarfs als auch
der Ausführungszeit "optimal".

> Hat jemand einen Tip?

Ja: sinnvollen Code schreiben, der auch was macht.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder wenn er es unbedingt ausführen soll volatile verwenden.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Warum ist eine Zuweisung einer Variable mit einem Wert sinnlos?

Die Variablen werden später im folgenden Code schon - z.B. für 
Fallunterscheidungen verwendet - ich hatte nur ein paar Beispielzeilen 
gepostet. (und den Rest jetzt gerade weggelassen)

Weil das eigentliche Problem zeigt sich ja später:
Da in  den oberen Zeilen die Zuweisung (weil wegoptimiert?) nicht 
erfolgt, fliegt weiter unten dann der Code aus der Fallunterscheidung 
raus, weil die benötigte Variable nicht gefüllt wurde.

Optimal...

Ich meine, klar, wenn ich mir z.B. eine globale Variable schaffe, in der 
ich den Status oder Arbeitsmodus ablege, um in Funktionen, ISR's usw 
abfragen zu können, welchen Status das Gerät hat, verbrate ich fest eine 
Speicherstelle und verursache vielleicht Overhead dadurch, daß ich mit 
globalen Variablen arbeite....aber diese Variante sinnlos  sein solle 
und deshalb wegoptimiert werden muß...verstehe ich gerade nicht.

Gruß Manfred

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für eine qualifizierte Auskunft isr mehr vom Programm nötig. Die 3 
Zeilen oben sind nicht aussagekräftig.

Autor: Martin Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sind einfach zuwenig Informationen - in deinem Beispiel ist
die Variablenzuweisung tatsächlich sinnlos, weil keine
weiter Verarbeitung dieser Variablen stattfindet.

Von weiterem Code war bisher auch nicht die Rede -
soll ich wiedermal die Glaskugel oder den Kaffeesatz befragen???

AHoi, Martin

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Optimizer hat gewissen Freiheiten, den Code zu reorganisieren, wenn 
er der Ansicht ist, dass sich dadurch nichts ändert. So kann es 
vorkommen, dass scheinbar fehlender Code ganz woanders aufkreuzt.

Und in deinem Beispiel ist noch nicht ersichtlich, ob die fraglichen 
Vars global oder lokal sind.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, Ja entschuldigt bitte...
ich bin davon ausgegangen, daß es mehr logisch ist, daß ich die 
Variablen nicht nur so belege...

Also das Prinzip ist sozusagen das:
ICh belege die globalen Variablen - damit ich beim Debuggen und die 
entsprechenden Routinen "wissen" in welchem Zustand sich das Gerät 
befindet.

z.B.
in der Hauptroutine weise ich zu:
int main(void)
{
ADCModus = StartUp;
...
...
werfe 5 Zeilen später den ADC mit Interrupt an und frage in der ADC ISR 
ab:

ISR (ADC_vect)
{
...
if (ADCModus == Work)
  MittelWert+=MessWert-(MittelWert>>5);
if (ADCModus == StartUp)
  {
  MittelWert = (MessWert<<5);  //Startwert setzen
  ADCModus = Work;
  }
...
}

Um - wie man sieht eine Art gleitenden Mittelwert bilden zu können, der 
bei der ersten Behandlung einen sinnvollen Startwert bekommt.


Mit diesem Prinzip und mehreren Variablen schalte ich also im Betrieb 
die Modis um - z.B. erst Referenz berechnen, bevor dann die 
Eingangswerte behandelt werden usw.

Das Prinzip dahinter ist immer das gleiche:
Die globale Variable, die als für an jeder Stelle des Programmes 
verfügbares Zeichen für den Zustand herhalten kann/muß.

Soweit - sogut - was aber eben passiert (sowohl im Simulator, als auch 
im (DEbugWire-MKII)Debugger ist, daß schon ganz am Anfang im 
Hauptprogramm - wo noch kein Interrupt läuft - die Zuweisung ignoriert 
wird - daher dann, wenn der Interrupt freigeschaltet ist, die ISR ohne 
den Wert natürlich nichts anfangen kann.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hier immer noch fehlt, ist die Deklaration der Variablen. Ob das 
bereits erwähnte und bei Verwendung in einer ISR entscheidende 
"volatile" drin steht.

Tip: Wenn du die Information für's Forum auf die paar Zeilen Pseudocode 
zurechtstutzt, die für dich relevant scheinen, dann nimmst du das 
Ergebnis der Analyse bereits vorweg. Also besser nicht irgendwelchen 
Pseudocode abliefern, in dem viele möglicherweise relevanten Zeilen 
fehlen, sondern einen minimierten Testcase der sich ggf. auch 
compilieren lässt.

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso....
Nee, steht natürlich nicht drin.
Ich habe die Varablen einfach so als int, unsigned int, char usw. 
definiert (hatte mehreres probiert)...

Achjott - habe es gerade ergänzt...
DAS scheint es gewesen zu sein.

Herzlichsten Dank!
Manfred

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.