Compiler vs. if-Bdeingung

Gast #1380370
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!
#1380373
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.
Gast #1380391
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.