mikrocontroller.net

Forum: Compiler & IDEs eeprom: Daten nach Übergabe in Unterfunktion werden falsch geschreiben


Autor: Ludwig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgende vereinfachte Ausgangssituation:



unsigned short Var1[3] = {1,2,3};
unsigned short Var1_EE[3] EEMEM = {0};

void Write2EEProm(void)
{
  eeprom_write_block(Var1,Var1_EE, size_of(Var1));
}

Write2EEProm();

Inhalt Var1_EE:  [0]:1 , [1]:2, [2]:3



Das obige Beispiel funktioniert bestenes, die Variablen sind global 
definiert und die Funktion Write2EEProm steht direkt darunter in der 
selben c-Datei.

Wenn ich jetzt die Funktion Write2EEProm so modifiziere, dass ihr ein 
Pointer für das SRAM Array übergeben werden kann, wird nur noch der 1. 
Wert des Arrays ins EEProm geschrieben, statt das ganze Array:



unsigned short Var1[3] = {1,2,3};
unsigned short Var1_EE[3] EEMEM = {0};

void Write2EEProm(unsigned short* pVar1)
{
  eeprom_write_block(pVar1,Var1_EE, size_of(pVar1));
}

Write2EEProm(Var1);
oder
Write2EEProm(&*Var1); // kommt auf das gleiche raus

Inhalt Var1_EE:  [0]:1 , [1]:0, [2]:0



Die EEProm Variable und (weil für das Beispiel einfacher) die SRAM 
Variable ist weiter direkt global darüber deklariert, lediglich wird 
jetzt der Quell-Pointer an die Funktion übergeben.

Was mache ich hier falsch ?

Dank für eure Hilfe.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du sagst doch selbst, es solle nur 1 Wert geschrieben werden:
 eeprom_write_block(pVar1,Var1_EE, size_of(pVar1));
Wie groß ist denn die Größe des Pointers ermittelt mit size_of(pVar1)?
2 Byte? Soviel wird dann auch geschrieben...

Da mußt du jetzt schon die Länge des Arrays noch extra angeben. Allein 
von einer Adresse (einem Pointer) kannst du nicht auf die Länge des 
Arrays schließen.

Autor: unbedarfter_no1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void Write2EEProm(unsigned short* pVar1)
{
  eeprom_write_block(*pVar1,Var1_EE, size_of(pVar1));
}
Muß der Pointer nicht dereferenziert werden?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unbedarfter_no1 wrote:

> Muß der Pointer nicht dereferenziert werden?

Dann schreibt er aber auch nur ein unsigned short.
Es führt kein Weg daran vorbei, die Größe als zusätzlichen Parameter zu 
übergeben.

Autor: Ludwig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich weiß echt nicht, wieso das ganze so nicht funktioniert. Die 
Größe wird durch size of RICHTIG ermittelt. selbst wenn ich die Größe 
des Arrays als konstanten Wert eingebe, wird nur 1 Wert geschrieben.

Gelöst habe ich das ganze problem, indem ich in einer For-Schleife das 
komplette zu schreibende Array pVar1 in eine temporäre locale Variable 
umkopiert habe.

also quasi:

unsigned short Var1[3] = {1,2,3};
unsigned short Var1_EE[3] EEMEM = {0};

void Write2EEProm(unsigned short* pVar1)
{
  unsigned short Var1Temp[3] = {1,2,3};

  for(int i=0; i<3; i++)
    Var1Temp[i] = pVar1[i];

  eeprom_write_block(Var1Temp,Var1_EE, size_of(Var1Temp));
}

Write2EEProm(&*Var1);

Inhalt Var1_EE:  [0]:1 , [1]:2, [2]:3



So funktionierts jetzt.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ludwig wrote:
> Also ich weiß echt nicht, wieso das ganze so nicht funktioniert. Die
> Größe wird durch size of RICHTIG ermittelt.

Bei deiner Pointerversion nicht.

> selbst wenn ich die Größe
> des Arrays als konstanten Wert eingebe, wird nur 1 Wert geschrieben.

Und was ist das für ein konstanter Wert? Womöglich 3?

> Gelöst habe ich das ganze problem, indem ich in einer For-Schleife das
> komplette zu schreibende Array pVar1 in eine temporäre locale Variable
> umkopiert habe.

Unflexibel und überflüssig.

PS: Was soll das size_of, das du da ständig benutzt, eigentlich sein? 
Ist das eine selbst geschriebene Funktion?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal das:
unsigned short Var1[3] = {1,2,3};
unsigned short Var1_EE[3] EEMEM = {0};

void Write2EEProm(unsigned short* pVar1)
{
    eeprom_write_block(pVar1,Var1_EE, 3*2); // 3 Shorts = 3 * 2 Bytes 
}

Write2EEProm(Var1);

Wichtig hier: 6 Bytes schreiben, nicht 3
Denn size_of(Var1Temp) in deiner temporären Lösung ist gleich 6.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.