- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 8 von 8

Thema: avr-gcc optimiert gleiche Ausdrücke weg - abstellen?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562

    avr-gcc optimiert gleiche Ausdrücke weg - abstellen?

    Hallo allerseits,

    ich habe mal eine kurze Frage an die GCC - Kenner:

    Wenn ich z.B. in einem Programm schreibe:
    Code:
    PORTC = 0x01; 
    PORTC = 0x01; 
    PORTC = 0x01;
    also eben mehrfach das gleiche, dann optimiert das der GCC auf nur einen Ausdruck, was ja prinzipiell auch sinnvoll ist.
    Doch das darf bei mir nicht sein, weil sich dann die Ausführungszeit ändert.

    Der Hintergrund ist folgender:
    Ich experimentiere ein bisschen mit DDS - Funktionsgeneratoren per AVR, und ich habe ein kleines Programm (Computerprogramm) geschrieben, das mir die Tables(in Form von vielen "PORTC = ...") für verschiende Signalverläufge generiert. Der AVR mit dann mit einem veränderbaren Oszillator getaktet, somit kann man die Frequenz des Signals ändern.
    Nun muss es aber so sein, dass er manchmal den gleichen Wert mehrfach ausgibt, wenn das Signal eine kleine Steigung hat (z.B. beim Sinus - Maximum), sonst verzerrt sich natürlich der Verlauf.

    Deshalb die Frage: kann man das abstellen, bzw. wie könnte ich es sonst machen?
    Ach ja: Im Makefile habe ich natürlich OPT = 0 eingestellt, aber das nützt anscheinend nichts.
    Bascom ist da nicht schlau genug, dort funktionierts, aber ich würde halt gerne bei C bleiben.

    Danke für eure Antworten!

    Mfg Thegon

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    37
    Beiträge
    1.225
    Zitat Zitat von Thegon Beitrag anzeigen
    also eben mehrfach das gleiche, dann optimiert das der GCC auf nur einen Ausdruck, was ja prinzipiell auch sinnvoll ist.
    Sicher nicht. PORTC ist als volatile gekennzeichnet, der Compiler muss jeden Zugriff darauf ausführen. Dass -O0 den Fehler nicht beseitigt deutet auf eine andere Ursache hin, ohne Optimierung kann eigentlich nichts weggelassen werden.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von markusj Beitrag anzeigen
    Sicher nicht. PORTC ist als volatile gekennzeichnet, der Compiler muss jeden Zugriff darauf ausführen.
    Das ist so nicht richtig.

    Der Compiler muß, wenn eine Variable volatile ist, damit rechnen, daß sie außerhalb des aktuellen Programmkontextes geändert werden kann. Da sie aber wieder überschrieben wird, ist dreimal schreiben logisch das gleiche wie einmal schreiben, solange nicht gelesen wird. Er darf zwischen zwei Lesevorgängen die Variable nicht in einem Register halten, sondern muß sie immer neu lesen. Hier wird nie gelesen, also ist alles korrekt.

    Es könnte funktionieren, wenn statt einer Konstanten eine Variable geschrieben würde. Diese müsste dann aber volatile sein, damit der Compiler nicht davon ausgehen kann, daß sie konstant ist. Oder man schreibt die Elemente eines Arrays auf den Port.

    also eben mehrfach das gleiche, dann optimiert das der GCC auf nur einen Ausdruck, was ja prinzipiell auch sinnvoll ist. Doch das darf bei mir nicht sein, weil sich dann die Ausführungszeit ändert.
    Das läßt sich in einer höheren Sprache nicht formulieren. Die Ausführungszeit läßt sich nicht vorgeben. Eine höhere Programmiersprache garantiert die logische Richtigkeit der Programmausführung, nicht mehr. Bei einem einfachen µC kann man sich mit Assembler helfen, bei einem größerem System mit mehreren (auch internen) Bussen oder Busmastern (z.B. DMA) geht das dann auch nicht mehr. Da hilft nur noch dedizierte Hardware, im einfachsten Fall ein (Timer)Interrupt.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Klebwax Beitrag anzeigen
    Das ist so nicht richtig.
    Doch, ist es.

    Zitat Zitat von Klebwax Beitrag anzeigen
    Der Compiler muß, wenn eine Variable volatile ist, damit rechnen, daß sie außerhalb des aktuellen Programmkontextes geändert werden kann.
    Nein. Er muss damit rechnen, dass auf sie außerhalb zugegriffen wird, egal ob schreibend oder lesend. Und das wiederum bedeutet, dass jeder Zugriff tatsächlich ausgeführt werden muss, auch schreibende.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von sternst Beitrag anzeigen
    Er muss damit rechnen, dass auf sie außerhalb zugegriffen wird, egal ob schreibend oder lesend. Und das wiederum bedeutet, dass jeder Zugriff tatsächlich ausgeführt werden muss, auch schreibende.
    Solange der andere Kontext nur liest, ist einmal schreiben gut genug. Aber:

    In C und C++ wird durch diesen Typqualifikator spezifiziert, dass sich der Wert der Variable jederzeit ändern kann, beispielsweise durch andere Prozesse oder Threads
    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Klebwax Beitrag anzeigen
    Solange der andere Kontext nur liest, ist einmal schreiben gut genug.
    volatile bedeutet, dass jeder Zugriff für den Compiler nicht einsehbare Seiteneffekte haben kann, und daher durchgeführt werden muss. Ob Schreiben oder Lesen spielt dabei keine Rolle. Es spielt auch keine Rolle, ob dieser "Seiteneffekt" nun ein anderer Software-Kontext ist, der ebenfalls auf die Variable zugreift, oder ob es ein Hardware-Effekt ist, weil die Variable in Wirklichkeit ein Register ist.

    Zitat Zitat von Klebwax Beitrag anzeigen
    Aber:
    In C und C++ wird durch diesen Typqualifikator spezifiziert, dass sich der Wert der Variable jederzeit ändern kann, beispielsweise durch andere Prozesse oder Threads
    Und? Nur weil etwas irgendwo steht, ist es noch lange nicht richtig. Das Zitierte ist jedenfalls mindestens unvollständig, um nicht zu sagen falsch.
    Geändert von sternst (14.01.2013 um 20:46 Uhr)
    MfG
    Stefan

Ähnliche Themen

  1. [ERLEDIGT] Darf der Compiler das ??? (Kaputt optimiert)
    Von Siro im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 01.06.2011, 16:55
  2. Ausdrücke on/off als constanten nutzen?
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 23.10.2008, 06:47
  3. avr-gcc (GCC) 4.2.2 zu neu für Baselib?
    Von axel88 im Forum Robby RP6
    Antworten: 1
    Letzter Beitrag: 10.07.2008, 13:25
  4. AVR GCC: warning abstellen !?
    Von _maddin im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 08.07.2008, 20:24
  5. gcc-avr/avr-libc und FreeDOS
    Von pischke im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 14.10.2006, 09:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test