Forum: Mikrocontroller und Digitale Elektronik Problem mit Variable


von Sebastian Z. (sz1985)


Lesenswert?

Hallo zusammen,

ich sitze gerade vor einem Problem, das ich mir nicht erklären. Ich 
definiere eine Variable i mit 2 Byte Länge ohne Vorzeichen. Dieser weiße 
ich einmal über die RS232 einen Wert (0x55). Das Funktioniert. Danach 
möchte ich der Variable den Wert 0x0800 zuweisen und der Debugger sagt 
mir beim ausführen, dass die Variable den Wert 0x40 hat.
1
int main (void)
2
{
3
    // Scheduler initialisieren und Funktionen übergeben-------  
4
  TASK_init();
5
  MAIN_taskInit();
6
  uart_init();
7
8
  uint16_t i = 0;
9
10
  sei();
11
12
13
  while(1)      // Hintergrundtask
14
  {
15
    //Abfrage auf Updateprogrammierung
16
    i=uart_getc_wait ();
17
18
    if (i==0x55)  //Hier hat die Variable den richtigen Wert 0x55
19
    {  uint8_t flash_data[SPM_PAGESIZE+2];
20
      //Löschen des Flashspeichers
21
      memset(flash_data, 0xFF, sizeof(flash_data));
22
      i=0;
23
      for (i=0x800; i<0x1FFF; i=i+64) //Hier hat die Variable den Wert 0x40 statt 0x800
24
        {  
25
        program_page((uint16_t)i, flash_data);
26
        }
27
28
      }
29
      uart_putc (0xA1);
30
    }
31
    //Bootloader ohne flashen verlassen
32
    else uart_putc(0x11);
33
34
}
35
    
36
37
38
  return 0;
39
40
}

Hoffe ihr könnt mir das erklären.

Vielen Dank für eure Hilfe!

Gruss

sz1985

von Karl H. (kbuchegg)


Lesenswert?

Hast du den Optimizer eingeschaltet?

Die Chancen stehen nicht schlecht, dass der COmpiler für das i in der 
Schleife gar keine Variable angelegt hat, sondern alles einzig und 
alleine über Register abwickelt.

von Helfer (Gast)


Lesenswert?

Das ist kein vollständiges Programm (u.a. fehlt die Definition von i), 
alle folgenden Tipps sind daher Raterei.

1) Mit "die Variable" meinst du i.

2) Du hast im nicht sichtbaren Codeteil i als 8-Bit Wert definiert.

In einer anständigen Toolchain sollte in folgender Zeile eine Warung 
beim Compilieren kommen:
>      for (i=0x800; i<0x1FFF; i=i+64) //Hier hat die Variable den Wert 0x40 statt 
0x800

von Sebastian Z. (sz1985)


Lesenswert?

@Karl Heinz Buchegger:
Der Optimizer ist eingeschalten und setht auf 0s. Du hast recht, wenn 
ich Debugge, zeigt er mi hinter der Variable zwei Register an.
Kann ich das umgehen ohne die Optimierungen auszuschalten?

@Herlfer:
Also ich verwende AVR Studio 4 mit WinAVR. Die Variable ist im Text mit 
i bezeichnet worden und ist auch wie folgt definiert "uint16_t i = 0;". 
Warum sollte mein Compiler mir hier eine Warnung ausgeben?

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Z. schrieb:
> @Karl Heinz Buchegger:
> Der Optimizer ist eingeschalten und setht auf 0s. Du hast recht, wenn
> ich Debugge, zeigt er mi hinter der Variable zwei Register an.
> Kann ich das umgehen ohne die Optimierungen auszuschalten?

Du kannst dir den Wert innerhalb der Funktion ansehen, in der 
Argumentvariablen, in der er übergeben wurde.
Sofern die Funktion nicht geinlined wurde, müsste er dort stimmen.

von Karl H. (kbuchegg)


Lesenswert?

Eine andere Möglichleit ist es noch, die Variable als 'volatile' zu 
markieren. Damit verbietest du dem Compiler jegliche Optimierung auf 
dieser Variablen. Jeder Zugriff muss so ausgeführt werden, wie du ihn 
hingeschrieben hast.
Allerdings verlangsamt sich damit das Programm, du veränderst so das 
Timing.

von Sebastian Z. (sz1985)


Lesenswert?

Vielen Dank für eure Hilfe. Werde es vorerst mit volatile probieren.

von Helfer (Gast)


Lesenswert?

Sorry, du hast Recht, da ist keine Warnung zu erwarten. Ich hatte deine 
Definition von i übersehen, weil Includes fehlen, weil es keine Globals 
gibt und weil die Definition nicht am Funktionsanfang ist.

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.