Probleme mit Switch Case

OP #2476383
Lesenswert?

Hallo

Hab da mal ne Frage. Kann es sein, dass man beim avr eine 
Switchanweisung so nicht programmieren kann?
1
switch(UDR0)
2
  {
3
    case 0xD0 :      // Set Retry
4
    case 0xD1 :      // Set RF Power
5
    case 0xD2 :      // Set Sensing Time
6
    case 0xE0 :      // Set PWM1 compare
7
    case 0xE1 :      // Set PWM2 compare
8
    case 0xE2 :      // Set PWM3 compare
9
    case 0xE3 :      // Set PWM4 compare
10
            Flag = UDR0;
11
      break;
12

13
    default  :
14
      break;
15
  }


Irgendwie bekomm ich da immer nur sch... raus...

mfg
Bastian
Gast #2476405
Lesenswert?

Du kannst so nicht arbeiten. UDR0 ist ein SFR und verloren, wenn es 
einmal ausgelesen und nicht zugewiesen wurde. Die Zuweisung an Flag in 
den case-Anweisungen liest ein neues UDR0 aus und übergibt nicht 
unbedingt den Wert aus der switch-Bedingung.
1
  volatile uint8_t tmp;
2
  switch( (tmp = UDR0) )
3
  {
4
    case 0xD0 :      // Set Retry
5
    case 0xD1 :      // Set RF Power
6
    case 0xD2 :      // Set Sensing Time
7
    case 0xE0 :      // Set PWM1 compare
8
    case 0xE1 :      // Set PWM2 compare
9
    case 0xE2 :      // Set PWM3 compare
10
    case 0xE3 :      // Set PWM4 compare
11
      Flag = tmp;
12
      break;
13
    default  :
14
      break;
15
  }
Gast #2476490
Lesenswert?

Aus dem Bauch raus geschätzt: An der Stelle wird es nix machen.

Das hängt natürlich von der nicht gezeigten Umgebung ab, d.h. wie viele 
Register der Codegenerator gerade noch frei hat. In einer ISR sind 1) eh 
alle gerettet und 2) vielleicht noch nicht so viele in Benutzung.
#2476676
Lesenswert?

Krapao schrieb:
> Aus dem Bauch raus geschätzt: An der Stelle wird es nix machen.
>
> Das hängt natürlich von der nicht gezeigten Umgebung ab, d.h. wie viele
> Register der Codegenerator gerade noch frei hat. In einer ISR sind 1) eh
> alle gerettet und 2) vielleicht noch nicht so viele in Benutzung.

Doch, es wird was ausmachen.
Als volatile Variable wird sie ja eben nicht in einem Register gehalten, 
sondern sie existiert real im Speicher. Mit dem volatile zwingst du den 
Compiler dazu, extra für diese Variable einen Stack-Frame anzulegen. 
Ohne das volatile würde sie aller Wahrscheinlichkeit nach nur in einem 
Register existieren.

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