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!
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 ...
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
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
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!
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
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.
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
voidFactors(volatileDef_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: