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
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.
Oder wenn er es unbedingt ausführen soll volatile verwenden.
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
Für eine qualifizierte Auskunft isr mehr vom Programm nötig. Die 3 Zeilen oben sind nicht aussagekräftig.
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
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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.