- Labornetzteil AliExpress         
Ergebnis 1 bis 5 von 5

Thema: eeprom struct array speichern und lesen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    04.12.2006
    Beiträge
    32

    eeprom struct array speichern und lesen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!

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

    Code:
    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????

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Ä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).

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    04.12.2006
    Beiträge
    32
    hi markus!

    da oben istn tippfehler...

    habs jetzt so gemacht und es funktioniert!

    Code:
    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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    04.12.2006
    Beiträge
    32
    cool!

    das ist auch die richtige adresse: eeFoo_S_ChProgam[i]

    igendwie logisch :-D

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Hallo Thomas

    Zitat Zitat von Tyrald
    wie zwinge ich den Compiler... immer den gleichen speicherberreich zu nehemen?
    ungefähr so:

    Code:
    #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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad