www.mikrocontroller.net

Forum: Compiler & IDEs Compiler vs. if-Bdeingung


Autor: hickhack0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus beieinander,

ich hab gerade eine große auseinandersetzung mit meinem Compiler.
sobald irgend eine Optimierung aktiv ist funktioniert meine if-Bedingung 
nicht mehr (ist nie oder immer wahr, je nach optimierung)
Ich nutze ganz normal das AVR Studio V4.15

In einer ISR wird ein status auf 0x03 gesetzt und später in der main() 
abgerufen.
#define F_CPU 10000000      // Clock in Hz ( 10 MHz )
#include <avr/io.h>
#include <avr/interrupt.h>


uint8_t status = 0b00000000;


void initialize (void) {


  // Timer/Counter0 (8-bit) deaktiv
  TCNT0 = 0x00;
  OCR0 = 0;
  TCCR0 = 0;
  
  // Timer/Counter1 (16-bit)
  TCNT1 = 0;
  OCR1A = 0;
  OCR1B = 0;
  TCCR1A = 0;  // Normal mode, normal Port operation
  TCCR1B = (1<<ICNC1) | (1<<CS11) | (1<<CS10);  // Noise Canceler, Input Capture on falling Edge, prescaling by 64

  // Interrupt Enable Register
  TIMSK = (1<<TICIE1);  // Timer/Counter0 Overflow, Timer/Counter1 Overflow, Timer/Counter1 Input Capture
  
  // I/O Ports
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD = 0xFF;
  DDRE = 0;

  PORTA = 0xFF;
  PORTB = 0xFF;
  PORTC = 0xFF;
  PORTD = 0xFF;
  PORTE = 0xFF;

}

ISR ( TIMER1_CAPT_vect ) {  // Input Capture
  ...
  status = 0x03;
}
int main (void) {


  initialize();
  
  sei();
  
  while(1) {
    
    PORTB = (( PORTB & 0xF8 ) ^ 0x80) | ( ~status & 0x07 );

    if ( status & 0x03 )  {  
      status &= ~(1<<1);
      PORTC = 0xAA;
    }

  }
  return 0;
}
Mit der Compilereinstellung -O0 funktioniert das, mit allen anderen ist 
die if-Bedingung immer oder nie wahr!???
Warum?????
Ach ja, im Simulator wie auch auf meiner Hardware das selbe Problem!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hickhack0 schrieb:

> Warum?????
volatile uint8_t status = 0b00000000;


Dein Compiler sieht für sich keine Möglichkeit, wie sich status in der 
main() verändern könnte.
Volatile teilt ihm mit, dass er auf dieser Variablen keine Optimierung 
machen darf.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
status wird im Interrupthandler und in main verwendet. Das aber weiß der 
Optimierer nicht.

Verwende volatile.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da fehlt ein volatile für status

Autor: hickhack0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso?!
d.h. Alle Variablen, die in der ISR und main (oder verschiedenen ISR) 
verwendet werden bekommen volatile.
auch wenn sie nur gelesen werden (was ja hier nicht der fall ist).

Was ein so kleinen wörtchen doch alles ausmachen kann.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hickhack0 schrieb:

> Was ein so kleinen wörtchen doch alles ausmachen kann.

:-)
Warte ab, bis du das erste mal den Fall hast, dass ein einzelnes 
Zeichen die Bedeutung eines Programms komplett umdrehen kann.

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.