Forum: Mikrocontroller und Digitale Elektronik Struct aus EEPROM lesen als Funktionsparameter


von Mark (Gast)


Lesenswert?

Hallo,

ich habe eine Struktur im EEPROM liegen und möchte diese mit einer 
Funktion auslesen. Ich nutze eeprom_read_block aus der <avr/eeprom.h> 
Lib.

Bin mir nicht sicher ob das so gehen könnte.

Zudem wie könnte ich der Funktion einen weiteren Parameter hinzufügen 
mit dem ich das jeweilige Element von Level[..] setzen kann, dass gerade 
ausgelesen soll?

Danke!

1
typedef struct
2
{
3
  uint8_t allowed;
4
  uint8_t LV;
5
}Set1_t;
6
7
typedef struct
8
{
9
  int32_t mot_Pos1Offset;
10
  int32_t mot_Pos2Offset;
11
  Set1_t default;
12
}Set2_t;
13
14
typedef struct
15
{
16
  Set2_t Level[7];
17
} Def_Set_t;
18
19
Def_Set_t EEMEM EEPROMparameters;
20
Def_Set_t RAMparameters;
21
22
void Factors (volatile Def_Set_t *Lv)
23
{
24
  eeprom_read_block( &Lv->Level[3].default.allowed, &Lv->Level[3].default.allowed, sizeof(Lv->Level[3].default.allowed) );
25
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Meinst Du vielleicht so etwas ?
1
void Factors (volatile Def_Set_t *Lv, int index)
2
{
3
  eeprom_read_block( &Lv->Level[index].default.allowed,  sizeof(Lv->Level[3].default.allowed) );
4
}

Du hast eeprom_read_block zweimal den gleichen Parameter übergeben; ich 
nehme an, daß das ein Tippfehler ist, denn was außer Zieladresse und 
Anzahl der zu lesenden Bytes soll der Funktion übergeben werden?

Ist Dir bewusst, daß Du so nur genau ein Byte liest?

sizeof(Lv->Level[3].default.allowed) ist nämlich sizeof uint8_t ...

von Mark (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Meinst Du vielleicht so etwas ?
>
> void Factors (volatile Def_Set_t *Lv, int index)
> {
>   eeprom_read_block( &Lv->Level[index].default.allowed,
> sizeof(Lv->Level[3].default.allowed) );
> }

Ja genau sowas meinte ich, weil ich vom Index abhängig mache was gelesen 
werden soll aus dem Struct

Rufus Τ. F. schrieb:
> Du hast eeprom_read_block zweimal den gleichen Parameter übergeben; ich
> nehme an, daß das ein Tippfehler ist, denn was außer Zieladresse und
> Anzahl der zu lesenden Bytes soll der Funktion übergeben werden?

Der Prototyp der Funktion lautet
1
 void eeprom_read_block (void *__dst, const void *__src, size_t __n);

wo die Quelle, das Ziel und die größe angegeben werden muss...

Wieso sind bei dir da nur zwei Parameter angegeben?


Rufus Τ. F. schrieb:
> Ist Dir bewusst, daß Du so nur genau ein Byte liest?
>
> sizeof(Lv->Level[3].default.allowed) ist nämlich sizeof uint8_t ...

Ja ist mir bewusst, aber die Struktur enthält auch andere Datentypen die 
größer uint8_t sind z.B. könnte allowed auch uint32_t sein... die 
Struktur habe ich für die Frage stark vereinfacht

von Jakob (Gast)


Lesenswert?

Blöde Frage von einem ASM-bevorzugenden Dino:

Wozu kann "uint8_t allowed" und ".default.allowed" gut sein,
WENN man eben nicht uintDEFAULT_t, sondern ganz POPLIG und REAL
die int32_t lesen will, die man hoffentlich auch so gespeichert
hat?

Bitte keine ideologischen Debatten, sondern einleuchtende (!)
Erklärungen für den Gebrauchs-, oder Portabilitäts-Vorteil
solcher (mir) umständlich erscheinenden Definitions-Rituale!

von Jakob (Gast)


Lesenswert?

Kommt BESTIMMT nichts Sachbezogenes!
Werde wohl, wenn überhaupt Reaktionen kommen,
als Troll behandelt... :-(

von Mark (Gast)


Lesenswert?

müsste es nicht so heißen?
1
Def_Set_t EEMEM EEPROMparameters;
2
Def_Set_t RAMparameters;
3
4
void Factors (volatile Def_Set_t *Lv, uint8_t index)
5
{
6
  eeprom_read_block( &Lv->Level[index].default.allowed, &EEPROMparameters.Level[index].default.allowed, sizeof(Lv->Level[index].default.allowed) );
7
}

von Mark (Gast)


Lesenswert?

Jakob schrieb:
> Kommt BESTIMMT nichts Sachbezogenes!
> Werde wohl, wenn überhaupt Reaktionen kommen,
> als Troll behandelt... :-(

die Struktur ist für die Frage bewusst vereinfacht gehalten...

Ansich ähnelt die Struktur einem Baumdiagramm

von Axel S. (a-za-z0-9)


Lesenswert?

Mark schrieb:
> Jakob schrieb:
>> Kommt BESTIMMT nichts Sachbezogenes!
>> Werde wohl, wenn überhaupt Reaktionen kommen,
>> als Troll behandelt... :-(
>
> die Struktur ist für die Frage bewusst vereinfacht gehalten...

Damit tust du dir keinen Gefallen. Warum glaubst du, eine Antwort auf 
ein Problem, das dem deinigen nur ähnlich ist (wenn überhaupt) würde dir 
besser helfen als eine Antwort auf dein eigentliches Problem?

> Ansich ähnelt die Struktur einem Baumdiagramm

Dann zeigs halt. Oder laß es. Zum Rätselraten ist mir meine Zeit zu 
schade. Ach ja, warum du ein Array in eine struct verpacken mußt, weißt 
auch nur du. Für mich sieht das so aus, als wärest du in die Grube 
gefallen, die du dir selber gegraben hast mit deinen x-fach 
verschachtelten struct Definitionen.

Vielleicht möchtest du mal nachlesen (in einem C-Buch) was der sizeof() 
Operator tut, wenn man ihn auf struct-Member anwendet. Und wie sich das 
davon unterscheidet, wenn man ihn auf die gesamte struct anwendet.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mark schrieb:
> Der Prototyp der Funktion lautet  void eeprom_read_block (void *__dst,
> const void *__src, size_t __n);
>
> wo die Quelle, das Ziel und die größe angegeben werden muss...

Bei Deinem Aufruf sind Quelle und Ziel identisch:
1
void Factors (volatile Def_Set_t *Lv)
2
{
3
  eeprom_read_block( 
4
     &Lv->Level[3].default.allowed, 
5
     &Lv->Level[3].default.allowed, 
6
     sizeof(Lv->Level[3].default.allowed) );
7
}

Daß die gelesenen Daten natürlich auch noch irgendwo hinmüssen, das 
hatte ich ... wohl von der Doppelung verwirrt ... übersehen.

Damit verändert sich das hierzu:
1
void Factors (volatile Def_Set_t *Lv, int index, uint8_t *dest)
2
{
3
  eeprom_read_block( 
4
     &Lv->Level[index].default.allowed,  
5
     dest, 
6
     sizeof(Lv->Level[3].default.allowed) );
7
}

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.