PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : eeprom struct array speichern und lesen



Tyrald
11.10.2010, 13:54
Hallo!

Ich probier gerade ein Array aus structs im Eeprom zu speichern und zu laden:


struct S_ChProgram {
uint8_t mode;
uint16_t value[2];
};

#ifndef EEMEM
#define EEMEM __attribute__ ((section (".eeprom")))
#endif

#define NUMBER 2 //Gesamtzahl S_ChProgram Structs

uint8_t eeFoo_S_ChProgamm[NUMBER][sizeof(struct S_ChProgram)] EEMEM;

struct ch[NUMBER];

void write_eeprom (void )
{
for (int i = 0; i < NUMBER; i++)
eeprom_write_block (&ch[i],&eeFoo_S_ChProgamm[i],sizeof(struct S_ChProgram));
}

void read_eeprom ( void )
{
for (int i = 0; i < NUMBER; i++)
eeprom_read_block (&ch[i],&eeFoo_S_ChProgamm[i],sizeof(struct S_ChProgram));
}


ch[0] wird erfolgreich geschrieben und gelesen... aber alles andere läuft nicht! ich denke es liegt an den zeigenr auf die Eeprom-adresse ,, kenn mich damit aber noch nicht so gut aus!

jemand nen tipp????

markusj
11.10.2010, 14:48
Ähem,

Das macht auch so wenig Sinn.
1. EEMEM solltest du selbst nicht definieren - das wird in eeprom.h gemacht.
2. Warum legst du das nicht direkt als Array aus Structs an? Deine Konstruktion mit einem zweidimensionalen Array ist unnötig komplex.
3. eeFoo_S_ChProgamm[i] ist bereits ein Zeiger, das "&" davor ist unnötig.

Das Map- und Listfile (.map und .lst) wären ganz hilfreich um die verwendeten Adressen zu sehen ...

mfG
Markus

PS: Da der Compiler/Linker die Daten frei platzieren darf, ist es empfehlenswert ihn dazu zu zwingen, die Struktur im EEPROM immer an gleicher Stelle zu platzieren. Ich für meinen Teil bette alle EEPROM-Daten daher in ein Struct ein, welches alle frei bleibenden Bytes mit einem Dummy-Array belegt (und ferner das erste Byte blockiert).

Tyrald
11.10.2010, 15:59
hi markus!

da oben istn tippfehler...

habs jetzt so gemacht und es funktioniert!



struct ChProgram ch[NUMBER];

for (int i = 0; i < NUMBER; i++)
eeprom_read_block (&ch[i],eeFoo_S_ChProgam+(sizeof(struct ChProgram)*i),sizeof(struct S_ChProgram));

wie zwinge ich den Compiler... immer den gleichen speicherberreich zu nehemen?

Vielen Dank!
Thomas

Tyrald
11.10.2010, 16:00
cool!

das ist auch die richtige adresse: eeFoo_S_ChProgam[i]

igendwie logisch :-D

markusj
11.10.2010, 19:33
Hallo Thomas


wie zwinge ich den Compiler... immer den gleichen speicherberreich zu nehemen?

ungefähr so:



#include <stdint.h>
#include <avr/eeprom.h>

#define EEPROM_SIZE (E2END + 1)

typedef struct {
// Beliebige Eigene Nutzdaten
} payload_t;

typedef struct {
uint8_t firstByteDummy;

payload_t payload;

uint8_t aligmentDummy[EEPROM_SIZE - sizeof(payload_t) - 1];
} eeprom_data_t;

EEMEM eeprom_data_t eeprom;


Du kannst dir dann (z.Bsp. via &eeprom.payload) die Adresse auf deine Daten holen und damit ganz normal weiterarbeiten.

mfG
Markus