Forum: Compiler & IDEs Compiler optimizations


von Markus (Gast)


Lesenswert?

Hallo,

das Argument channel (function messung) wird nur übergeben, wenn ich die 
Compiler Optimierung auf -O0 schalte ... bei allen anderen Einstellungen 
wird mir immer nur 0 übergeben ...
Das Ganze teste ich mit dem AVR Studio 5.
Wenn ich das auf den uc übertrage, scheint es sich irgendwie anders zu 
verhalten ...

hat hier jemand eine Idee?

Gruß aus Salzgitter
Markus
73 de Markus, do9mbs


#define F_CPU 3686400
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
//#include "lcd_display.h"

int messung(int channel){
  /*
  Register ADMUX:
  Bit 7: REFS1 "Auswahl der Referenzspannung"
  Bit 6: REFS0 "Auswahl der Referenzspannung"
  Bit 5: ADLAR "Ausgabeformat" 0=Ausgabe rechtsbündig in ADCH/ADCL
  Bit 4:
  Bit 3: MUX3 "Kanalauswahl"
  Bit 2: MUX2 "Kanalauswahl"
  Bit 1: MUX1 "Kanalauswahl"
  Bit 0: MUX0 "Kanalauswahl"
  */
  ADMUX = 0x40;
  //jetzt noch den richtigen Eingang setzen
  channel &= 0x0f;
  ADMUX |= channel;

  /*
  Register ADCSRA:
  Bit 7:ADEN "ADC Enable" :1
  Bit 6:ADSC "ADC Start Conversion" :1
  Bit 5:ADFR "ADC Free Running" :0
  Bit 4:ADIF "ADC Interrupt Flag" :0 auf 1 warten
  Bit 3:ADIE "ADC Interrupt Enable" 0
  Bit 2:ADPS2 "ADC Prescaler" :1
  Bit 1:ADPS1 "ADC Prescaler" :0
  Bit 0:ADPS0 "ADC Prescaler" :1
  */
  ADCSRA = 0xc5;

  /* Auf Ergebnis warten */
  int readySignal=0;
  uint16_t result;

  do
  {
    readySignal=ADCSRA;
    readySignal &=0x10;
  } while (readySignal==0);

  /* Ergebnis in eine 16 Bit Zahl konvertieren */
  //ADCL=0xEF;
  //ADCH=0x03; --> Ergebnis ist 1007
  result = ADCL;
  result +=(ADCH<<8);

  return result;
}


int main(void)
{
  messung(1);
    while(1)
    {
        //TODO:: Please write your application code
    }
}

von Peter II (Gast)


Lesenswert?

Markus schrieb:
> bei allen anderen Einstellungen
> wird mir immer nur 0 übergeben ...

woher weisst du das?


Da du den Return deiner funktion überhaupt nicht auswertest, hat der 
Optimier hier sehr viel spielraum.

von Krapao (Gast)


Lesenswert?

> das Argument channel (function messung) wird nur übergeben, wenn ich die
> Compiler Optimierung auf -O0 schalte ... bei allen anderen Einstellungen
> wird mir immer nur 0 übergeben ...

Im Simulator (?) an welcher Position im Code festgestellt?

channel ist im Simulator nur bis zur Stelle  ADMUX |= channel; 
relevant. Danach ist dem Compiler die Variable eh wurscht.

Bei eingeschalteter Optimierung kann dem Compiler sogar die Variable 
insgesamt wurscht sein, wenn er "aggressiv" messung() als inline 
Funktion erzeugt und gleich den unveränderlichen Wert channel=1 bei der 
Codeerzeugung berücksichtigt.

Kurzfassung - Simulieren mit Codeoptimierung kann man machen, muss man 
aber öfter überlegen was passiert.

von Markus B. (do9mbs)


Lesenswert?

Hallo Peter,

ich habe mir das mit dem Debugger angesehen ... und da hat die Variable 
channel immer den Wert 0.

Das ist hier nur ein Auszug aus dem kompletten Code ... das Ganze 
funktioniert aber auch nicht mit:

uint16_t fswr=0; /* Vorlaufende Welle */
uint16_t bswr=0; /* Ruecklaufende Welle */
float swr=0; /* SWR */
fswr = messung(0);
bswr = messung(1);
swr = (float)(fswr+bswr) / (float)(fswr-bswr);



Gruß

Markus

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bei saftiger Optimirung ist messung() überhaupt nicht mehr vorhanden! 
Also wird auch nix übergeben...

Compiliert mit

avr-gcc-4.5.2 -combine -fwhole-program -S messung.c -mmcu=atmega88 -Os
1
  .file  "messung.c"
2
__SREG__ = 0x3f
3
__SP_H__ = 0x3e
4
__SP_L__ = 0x3d
5
__tmp_reg__ = 0
6
__zero_reg__ = 1
7
  .text
8
.global  main
9
  .type  main, @function
10
main:
11
/* prologue: function */
12
/* frame size = 0 */
13
/* stack size = 0 */
14
.L__stack_usage = 0
15
  ldi r24,lo8(64)
16
  sts 124,r24
17
  lds r24,124
18
  ori r24,lo8(1)
19
  sts 124,r24
20
  ldi r24,lo8(-59)
21
  sts 122,r24
22
.L2:
23
  lds r24,122
24
  sbrs r24,4
25
  rjmp .L2
26
  lds r24,120
27
  lds r24,121
28
.L3:
29
  rjmp .L3
30
  .size  main, .-main

von Peter II (Gast)


Lesenswert?

Markus Bühler schrieb:
> ich habe mir das mit dem Debugger angesehen ... und da hat die Variable
> channel immer den Wert 0.
wenn optimierun eingeschaltet ist, kann man sich nicht auf dem debugger 
verlassen.

Welcher wert steht denn in ADMUX nach der Messung?

von Markus B. (do9mbs)


Lesenswert?

Peter II schrieb:
> Markus Bühler schrieb:
>> ich habe mir das mit dem Debugger angesehen ... und da hat die Variable
>> channel immer den Wert 0.
> wenn optimierun eingeschaltet ist, kann man sich nicht auf dem debugger
> verlassen.
>
> Welcher wert steht denn in ADMUX nach der Messung?

Hallo Peter,

in ADMUX steht immer 0x40 ...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

So ist das doch nur Rumgestocher.

Sag doch einfach mal, welche Compiler-Optionen und -Version zum Einsatz 
kommen.

von Markus B. (do9mbs)


Lesenswert?

Hallo,

vielen Dank für eure schnelle Hilfe!

Vorerst kann ich mir mit volatile behelfen ... dann sehe ich trotz 
eingeschalteter Optimierung die Werte im Debugger ...

Jetzt kann ich den eigentlichen Fehler suchen :-).

Markus

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
Noch kein Account? Hier anmelden.