Compiler vs. if-Bdeingung

Gast #1380370
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.
1
#define F_CPU 10000000      // Clock in Hz ( 10 MHz )
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5

6
uint8_t status = 0b00000000;
7

8

9
void initialize (void) {
10

11

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

24
  // Interrupt Enable Register
25
  TIMSK = (1<<TICIE1);  // Timer/Counter0 Overflow, Timer/Counter1 Overflow, Timer/Counter1 Input Capture
26
  
27
  // I/O Ports
28
  DDRA = 0xFF;
29
  DDRB = 0xFF;
30
  DDRC = 0xFF;
31
  DDRD = 0xFF;
32
  DDRE = 0;
33

34
  PORTA = 0xFF;
35
  PORTB = 0xFF;
36
  PORTC = 0xFF;
37
  PORTD = 0xFF;
38
  PORTE = 0xFF;
39

40
}
41

42
ISR ( TIMER1_CAPT_vect ) {  // Input Capture
43
  ...
44
  status = 0x03;
45
}
46
int main (void) {
47

48

49
  initialize();
50
  
51
  sei();
52
  
53
  while(1) {
54
    
55
    PORTB = (( PORTB & 0xF8 ) ^ 0x80) | ( ~status & 0x07 );
56

57
    if ( status & 0x03 )  {  
58
      status &= ~(1<<1);
59
      PORTC = 0xAA;
60
    }
61

62
  }
63
  return 0;
64
}
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!
Gast #1380391
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.

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