Problem mit Variable

OP #2203632
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
Gast #2203762
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
OP #2203788
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?
#2203802
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.
#2203806
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.
Gast #2203821
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.