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

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.

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.