Manuel schrieb:
> ich habe eine Frage zum beschreiben des EEPROMS. DAs Tutorial dazu habe
> ich mir durchgelesen, bin aber noch nicht ganz schlau geworden.
> Folgende Frage/Problemstellung:
> Ich möchte einen array zuvor im EEPROM ablegen, d.h. eine .eep oder .hex
> Datei muss erzeugt werden, die ich per ISP programmieren kann. Erzeugt
> der Compiler bzw. das Makefile mir direkt durch die Vorbelegung beim
> Deklarieren einer Variable diese Datei:
>
1 | > uint8_t eeFooByteArray1[] EEMEM = { 18, 3 ,70 };
|
Ja.
> Nach diesem Quelltext würde also in der .eep Datei mein array stehen?
So ungefähr.
In der EEP Datei steht drinnen welche Werte im EEPROM wo abzulegen sind.
Das ist so angeordnet, dass diese Daten an genau der Stelle ins EEPROM
gebrannt werden, die der Compiler/Linker als die Adresse des Arrays
eeFooByteArray festgelegt haben.
> Ist das richtig? Ist es nur so möglich, das EEPROM "vorab" zu
> beschreiben?
Ja.
Du kannst dir natürlich das HEX-File auch selber zusammenbauen, wenn du
unbedingt möchtest und das Format kennst.
Aber wenn du die Daten vor dem ersten Flashen eines Programms im µC
stehen haben willst, dann gehts nur so.
Man kann natürlich auch sein Programm so schreiben, dass es beim ersten
Start selber rausfindet, dass die Werte im EEPROM noch nicht gültig sind
und vom eigentlichen Programm aus die Erstbelegung machen.
> Diese array kann/soll vom Benutzer selbst Werte erlangen. Also muss ich
> diesen während des Programmbetriebs ändern. Dies erledige ich dann mit
> der Schreibe Block Funktion richtig?
Zum Beispiel mit dieser Funktion, ja.
Es gibt ja auch noch andere Funktionen. Aber für ein Array ist das schon
ein guter Ansatz.
>
1 | > uint8_t myByteBuffer[3];
|
2 | > eeprom_write_block(myByteBuffer,eeFooByteArray1,sizeof(myByteBuffer));
|
3 | >
|
> Wird dort der komplette Block geschrieben, also alle 4 Stellen
> (0,1,2,3)? Weil in C habe ich gelernt, dass man jede Stelle des arrays
> über eine Schleife beschreiben muss.
eeprom_write_block weiß nichts von einem Array.
Dem eeprom_write_block sagt man
* da hast du eine Adresse im SRAM Speicher
* da hast du noch eine Adresse im EEPROM Speicher
* ich will dass du x Bytes von A nach B umkopierst.
Wenn man nun das x so gestaltet, dass es genau der Arraygröße in Bytes
entspricht, dann wird das komplette Array umkopiert. Genauer: Alle Bytes
die zu diesem Array gehören.
und jetzt schaun wir mal: sizeof( myByteBuffer )
Aha. sizeof gibt die Anzahl der Bytes in seinem Argument zurück. IN
deinem Fall das komplette Array. Also wird hier dem write_block mehr
oder weniger gesagt: Kopiere soviele Bytes, wie in myByteBuffer
verbraucht wurden
> So, das waren meine Fragen. Ich wäre froh, wenn sich jemand findet, der
> mir das Licht anschaltet :-)
Einfach mal ein bischen nachdenken. Sich die Funktionsargmuente ansehen
und überlegen, was das alles wohl bedeuten mag.