Forum: Compiler & IDEs Probleme beim Schreiben ins EEPROM (C)


von Christian O. (hightec)


Lesenswert?

Nabend zusammen,
ich melde mich mal wieder zu Wort.

Ich habe ein kleines Versuchsprogramm in C geschrieben in dem ich den 
wert einer Variablen mit einer Taste inkementiere und mit einer anderen 
Taste dekriemtiere. Den Wert der Variablen lasse ich mir auf einem LCD 
anzeigen.
(Ja ich weiss die Tasten sind nicht entprellt usw. aber es ist nur ein 
experientiercode)

Nun möchte ich den Wert der Variable in das EEPROM schreiben um ihn nach 
abschalten der Stromversorgung wieder in meine Variable schreiben zu 
können.

Ich habe mich da an dem AVR-GCC-Tutorial orientiert.
Allerdings meckert der Compiler mit folgender Fehlermeldung:

"main.c:17: error: section attribute cannot be specified for local 
variables"

Und da komm ich nicht weiter. Was habe ich vergessen, was habe ich 
falsch gemacht. Kann mir da wer helfen?

Hier mein Code aus der main.c
1
#include <avr/io.h>
2
#include "lcd.h"
3
#include <util/delay.h> 
4
#include <stdlib.h>
5
#include <avr/eeprom.h>
6
int main(void)
7
{
8
    
9
  DDRD = 0b00000000;
10
  lcd_init();
11
  uint8_t X = 0;
12
  char Buffer[20]; // in diesem {} lokal
13
      itoa( X, Buffer, 10 ); 
14
      lcd_clear();
15
      // ... ausgeben  
16
      lcd_string( Buffer );
17
  uint8_t eeFooByte EEMEM = 0;
18
    while(1)
19
    {
20
    if (!( PIND & (1<<PD6)) )
21
    {
22
      X++;
23
      lcd_setcursor(0,0);
24
      char Buffer[20]; // in diesem {} lokal
25
      itoa( X, Buffer, 10 ); 
26
      lcd_clear();
27
      // ... ausgeben  
28
      lcd_string( Buffer );
29
      eeprom_write_byte(&eeFooByte, X);
30
      while(!(PIND & (1<<PD6)))
31
      {
32
      }
33
      
34
    }
35
    if (!( PIND & (1<<PD7)) )
36
    {
37
      X--;
38
      lcd_setcursor(0,0);
39
      char Buffer[20]; // in diesem {} lokal
40
      itoa( X, Buffer, 10 ); 
41
      lcd_clear();
42
      // ... ausgeben  
43
      lcd_string( Buffer );
44
      eeprom_write_byte(&eeFooByte, X);
45
      while(!(PIND & (1<<PD7)))
46
      {
47
      }
48
      
49
    }
50
    
51
  
52
    }
53
 
54
    return 0;
55
}

Ich danke schonmal für eure Hilfe ;-)

Gruß

HighTec

: Verschoben durch User
von ImLichteArbeitender (Gast)


Lesenswert?

Das liegt an dem hier:
1
uint8_t eeFooByte EEMEM = 0;

Eine (funktions-) lokale Variable mit Section-Attribut.
Für den Compiler (-bauer) insofern ein Widerspruch, als funktionslokale 
Variablen nur solange leben, wie die Funktion abgearbeitet wird.

Verschiebe diese Zeile an einen Punkt ausserhalbt jeder Funktion.

von ImLichteArbeitender (Gast)


Lesenswert?

Im Grunde sagt die Fehlermeldung auch schon alles Wissenwerte:

"main.c:17: error: section attribute cannot be specified for local
variables"

1. Eine lokale Variable
2. Mit section-Attribut
3. Darf/Kann nicht

von Karl H. (kbuchegg)


Lesenswert?

Christian O. schrieb im Beitrag

> Ich habe mich da an dem AVR-GCC-Tutorial orientiert.
> Allerdings meckert der Compiler mit folgender Fehlermeldung:
>
> "main.c:17: error: section attribute cannot be specified for local
> variables"
>
> Und da komm ich nicht weiter. Was habe ich vergessen, was habe ich
> falsch gemacht. Kann mir da wer helfen?

Das heisst schlicht und ergreifend einfach nur:
EEMEM Variablen muessen global definiert werden. Zieh sie aus den 
Funktionen raus und alles ist gut.

von ImLichteArbeitender (Gast)


Lesenswert?

Karl Heinz schrieb:

> Das heisst schlicht und ergreifend einfach nur:
> EEMEM Variablen muessen global definiert werden. Zieh sie aus den
> Funktionen raus und alles ist gut.

Komisch. Das habe ich auch gedacht. Lach.

So. Ich gehe jetzt in Bett, Raymond Chandler lesen.
Gute Nacht.

von Christian O. (hightec)


Lesenswert?

:D
Asche über mein Haupt.. jetzt funktioniert es einwandfrei. Ich muss mcih 
noch stark mit Variablen und deren Gegebenheiten beschäftigen..

Vielen Dank ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

ImLichteArbeitender schrieb:
> Im Grunde sagt die Fehlermeldung auch schon alles Wissenwerte:
>
> "main.c:17: error: section attribute cannot be specified for local
> variables"

Die Meldung ist falsch bis verwirrend. Anstatt "local variables" müsste 
da z.B. stehen "variables not in static storage" oder "can only be 
applied to variables in static storage".

> 1. Eine lokale Variable
> 2. Mit section-Attribut
> 3. Darf/Kann nicht

Doch. Beispiel:
1
#include <avr/eeprom.h>
2
3
int main ()
4
{
5
    static int e EEMEM = 1;
6
    return e;
7
}

Es liegt also nicht an lokal/global sondern an static storage oder 
nicht.

Bei EEprom-Variablen mutet das vielleicht seltsam an, bei lokalen 
Lookup-Tabellen im PROGMEM aber nicht mehr.

: Bearbeitet durch User
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.