mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bestimmte Code-Teile nicht optimieren


Autor: dastien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

gibt es eine möglichkeit bestimmte Teile eines Codes aus der Optimierung 
zu nehmen ?
Als Compiler benutze ich IAR embedded Workbench.

Oder ist dies nur möglich in dem der betreffende Code-Abschnitt in 
Assembler geschrieben wird ?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Wahrscheinlichkeit, dass du das gar nicht brauchst liegt bei 90%.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Wahrscheinlichkeit, dass du das gar nicht brauchst liegt bei 90%.

Ich erhöhe auf 99%

Autor: me (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mit IAR noch nie gearbeitet, kann dir also nicht sagen ob dein 
Compiler das unterstützt. (bei Keil gibt es diese Funktionalität)

Schau in der Hilfe nach Compiler Direktiven (pragma, optimize, ...). 
Wenn es die Funktion gibt, steht sie auch im Handbuch.

Allerdings solltest du dich fragen wofür du das wirklich brauchst...

Autor: dastien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe bestimmten Code der erst nach einer Warteschleife ausgeführt 
werden soll.
Ich habe aber festgestellt das je nach Optimierungseinstellungen Teile 
des Codes anscheinend vor der Warteschleife ausgeführt werden.
Ich habe schon versucht alle möglichen Ursachen für das Fehlverhalten 
auszuschliessen, und jetzt wollte ich es mal damit probieren.
Werde dann noch mal schauen ob ich in der Compiler-Hilfe irgendwas 
finde.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dastien schrieb:
> Ich habe aber festgestellt das je nach Optimierungseinstellungen Teile
> des Codes anscheinend vor der Warteschleife ausgeführt werden.

vielleicht wird ja deine Warteschleife wegoptimiert?
Kannst ja mal den Code posten.
:-)

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Ich erhöhe auf 99%

Aber immerhin noch 1%, wo man es doch braucht.

dastien schrieb:
> gibt es eine möglichkeit bestimmte Teile eines Codes aus der Optimierung
> zu nehmen ?

Anweisungen an den Compiler werden mit der pragma-Direktive gemacht. 
Damit solltest du auch Optimierungen ausschalten können. Google mal nach 
pragma...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@dastien: Sonderlich lang kannst du ja nicht danach gesucht haben.
O-Text Manual: #pragma optimize=param[ param...]

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dito schrieb:

> Aber immerhin noch 1%, wo man es doch braucht.

Oder man andere auch nicht sehr elegante Wege einschlagen muss. Ja, eine 
portable optimization barrier gibt's in C leider nicht. In GCC kann man 
sich z.B. mit bestimmten leeren asm-statements behelfen, wenn der 
Compiler beispielsweise eine langsame Division genau in das Codestück 
reinschiebt, in dem man es partout nicht gebrauchen kann.

Autor: dastien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der Teil von dem Code der nicht optimiert werden soll.
void detect_short_circuit(void)
{
  if(relay_state == ON)
  { 
    for (unsigned long int count = 0; count < 125; count++)
    {
      asm ("nop");
    }
    
    C3_adc_value = Read_ADC_Ch(AD_PORT_SHORT_CIRCUIT_C3);
    if (C3_adc_value < 1000)
    {
      C3_OFF;
    }
    
    C2_adc_value = Read_ADC_Ch(AD_PORT_SHORT_CIRCUIT_C2);
    if (C2_adc_value < 1000)
    {
      C2_OFF;
    }
    
    C1_adc_value = Read_ADC_Ch(AD_PORT_SHORT_CIRCUIT_C1);
    if (C1_adc_value < 1000)
    {      
      C1_OFF;
    }
  }
}

Ich habe jetzt folgendes noch eingefügt
#pragma optimize = no_code_motion

Scheint aber immer noch nich richtig zu laufen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es in IAR keinerlei Delay-Funktionen? Solche unbewaffneten 
Delay-Schleifen sind Zeitbomben.

Oft reicht schon ein grosszügigerer Umgang mit "volatile" für die 
beteiligten lokalen Variablen, hier beispielsweise käme der Index der 
Schleife dafür in Frage.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dastien schrieb:

> Ich habe aber festgestellt das je nach Optimierungseinstellungen Teile
> des Codes anscheinend vor der Warteschleife ausgeführt werden.

Vermutung oder durch Blick in den erzeugten Code? Kannst ja letzteren 
mal rausrücken, als Disassembly-Listing von dem Stück beispielsweise.

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liefert dein ADC kein Statussignal, das signalisiert wann ein gültiges 
Cx_adc_value bereit steht?

Autor: dastien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt die for-Schleife durch
__delay_cycles(5000);
 ersetzt und die Zeit erhöht. Jetzt scheint es erstmal zu funktionieren.
Danke für die hilfreichen Antworten.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dastien schrieb:
> for (unsigned long int count = 0; count < 125; count++)
>     {
>       asm ("nop");
>     }

Vermutung:
Der Compiler optimiert die Schleife weg.
Würde das mit dem beobachteten Verhalten übereinstimmen?
:-)

Autor: dastien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wegoptimiert wird sie nicht. Habe einen Output Pin davor und danch 
toggeln lassen. Klappt.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber die Laufzeit der Schleife ist extrem optimierungsabhängig.

Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
problier mal

volatile asm ("nop");

das darf er nicht wegoptimieren

Autor: thomasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn geht sollte die Schleife durch was anderes ersetzt werden.
asm volatile ("nop");

würde dem Compiler sicher auch helfen, damit er nichts weg optimiert. 
Oder auch wie schon oben gesagt die Schleifen Variable als volatile.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thomasH schrieb:

> wenn geht sollte die Schleife durch was anderes ersetzt werden.
asm volatile ("nop");

Beim IAR Compiler funktioniert das auch?

Aber auch dann ist die Laufzeit stark optimierungsabhängig.

Autor: dastien (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe es jetzt mit
__delay_cycles(5000);
 gemacht.
Funktioniert wunderbar. Ist aus dem Help-File vom IAR-Compiler.

Autor: M. B. (manubaum) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Vorschlag:
Compile die C files zu object files (mit den spezifischen 
Compiler-Optimierungen). Und dann das ganze zu einem binary 
zusammenlinken.

Cheers

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.