Forum: Compiler & IDEs Compiler vs. if-Bdeingung


von hickhack0 (Gast)


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!

von Karl H. (kbuchegg)


Lesenswert?

hickhack0 schrieb:

> Warum?????
1
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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

Verwende volatile.

von Justus S. (jussa)


Lesenswert?

da fehlt ein volatile für status

von hickhack0 (Gast)


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.

von Karl H. (kbuchegg)


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.

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.