Warnung in IAR

OP #2486603
Lesenswert?

Hi,

eine Methode zur Initialisierung vom Timer2 im Atmega169 sieht so aus:
1
void RTC_init(void)
2
{
3
    Delay(1000);            // wait for 1 sec to let the Xtal stabilize after a power-on,
4

5
    __disable_interrupt();  // disabel global interrupt
6

7
    cbi(TIMSK2, TOIE2);             // disable OCIE2A and TOIE2
8

9
    //ASSR = (1<<AS2);        // select asynchronous operation of Timer2
10

11
    TCNT2 = 0;              // clear TCNT2A
12
    TCCR2A |= (1<<CS22) | (1<<CS20);             // select precaler: 32.768 kHz / 128 = 1 sec between each overflow
13

14
    while((ASSR & 0x01) | (ASSR & 0x04));       // wait for TCN2UB and TCR2UB to be cleared
15

16
    TIFR2 = 0xFF;           // clear interrupt-flags
17
    sbi(TIMSK2, TOIE2);     // enable Timer2 overflow interrupt
18

19
    OCR2A = 200;    // set timer2 compare value
20
    
21
    __enable_interrupt();                 // enable global interrupt
22
}

Der IAR Compiler gibt eine Warung für „while((ASSR & 0x01) | (ASSR & 
0x04));“ aus:

Warning[Pa082]: undefined behavior: the order of volatile accesses is 
undefined in this statement

Was bedeutet das?

Gruss
Owen
Gast #2486605
Lesenswert?

> Was bedeutet das?
Steht doch in der Warning!

Der Compiler muss die beiden Lesezugriffe auf ASSR serialisieren und 
macht Dich darauf aufmerksam, daß die Reihenfolge bei volatile-Reads 
eine Auswirkung auf Dein Programm haben kann.
Gast #2486745
Lesenswert?

Owen Senmeis schrieb:
> Warning[Pa082]:

Bei den Compileroptionen kann man diese Warnung unter 'Diagnostics' 
unterdrücken lassen, wenn sie zu sehr nervt.
Den Interrupt global zu sperren, wie es im obigen Beispiel der Fall ist, 
ist keine gute Idee und nicht notwendig. Wenn man Pech hat, kann die 
'while()'-Schleife das Timing total 'versauen'.
#2487022
Lesenswert?

Willi schrieb:
> Rolf Magnus schrieb:
>> Statt die Warnung zu unterdrücken, könnte man aber auch die Ursache
>> beheben.
>
> Wie, den Rechner ausschalten?

In diesem Fall gibt es aber eine einfache Möglichkeit, wie man das 
umschreiben kann.

>
> Beispiel:
> volatile int a,b;
> ...
>   a = a+b; //gibt Warnung

Das ist aber eine andere Situation. Und auch die kann man so 
umschreiben, dass man dem Compiler, der freundlicherweise sagt 
"Möglicherweise implementiere ich da jetzt etwas anderes als du 
erwartest, check das bitte noch mal" keine Chance für Missverständnisse 
gibt. Die meisten Warnungen sind dergestalt, dass es keine gute Idee 
ist, sie zu ignorieren.
Gast #2487093
Lesenswert?

Karl Heinz Buchegger schrieb:
> Die meisten Warnungen sind dergestalt, dass es keine gute Idee
> ist, sie zu ignorieren.

Das sehe ich im Grunde auch so, aber beispielsweise war bei einem 
AVR-GCC Quellcode (scheinbar) alles in Ordnung und erst IAR gab 
Warnungen aus. IAR ist da ein bißchen strikter, wobei wohl schon 
MISRA-Regeln angewendet werden. Und wie beseitigt man Warnungen? Man 
schaltet sie ab :-)

Die Warnung kann man dadurch umgehen, dass man eine nicht volatile - 
Hilfsvariable einfügt, was aber bei einem Ausdruck "a += b;" recht 
lästig ist. Oben müßte man wohl ASSR in 'temp' kopieren und dann testen, 
oder besser formuliert: da muß man es so machen.

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