Compiler optimizations

Gast #2502182
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
    }
}
Gast #2502192
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.
#2502202
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
Persönliche Seite #2502204
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren