Bestimmte Code-Teile nicht optimieren

Gast #1922347
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...
Gast #1922407
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.
Gast #1922418
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.
:-)
Gast #1922420
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...
#1922453
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.
Gast #1922456
Hier der Teil von dem Code der nicht optimiert werden soll.
1
void detect_short_circuit(void)
2
{
3
  if(relay_state == ON)
4
  { 
5
    for (unsigned long int count = 0; count < 125; count++)
6
    {
7
      asm ("nop");
8
    }
9
    
10
    C3_adc_value = Read_ADC_Ch(AD_PORT_SHORT_CIRCUIT_C3);
11
    if (C3_adc_value < 1000)
12
    {
13
      C3_OFF;
14
    }
15
    
16
    C2_adc_value = Read_ADC_Ch(AD_PORT_SHORT_CIRCUIT_C2);
17
    if (C2_adc_value < 1000)
18
    {
19
      C2_OFF;
20
    }
21
    
22
    C1_adc_value = Read_ADC_Ch(AD_PORT_SHORT_CIRCUIT_C1);
23
    if (C1_adc_value < 1000)
24
    {      
25
      C1_OFF;
26
    }
27
  }
28
}

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

Scheint aber immer noch nich richtig zu laufen.
#1922460
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.
Gast #1922490
Habe jetzt die for-Schleife durch
1
__delay_cycles(5000);
 ersetzt und die Zeit erhöht. Jetzt scheint es erstmal zu funktionieren.
Danke für die hilfreichen Antworten.
Gast #1922572
wenn geht sollte die Schleife durch was anderes ersetzt werden.
1
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.