AVR: Array(s) im EEPROM auf feste Adressen legen

OP #1044783
Lesenswert?

Hallo,

ich habe folgendes Problem, ich habe 2 Arrays im EEPROM ligen, die ich 
später außerhalb des AVR modifizieren möchte/muss. Dazu übetrage ich das 
gesamte EEPROM (Mega64 2kByte) via USB Feature Report auf einen PC.

Um jetzt die richtigen Bytes der Arrays zu erwischen müsste ich im 
Quellcode für den AVR festlegen ab welcher Speicherstelle im EEPROM die 
jeweiligen Arrays liegen.

Hat jemand einen Tip, wie man das bewerkstelligen könnte?

Auf dem AVR möchte ich weiterhin mit eeprom_read_byte(&data[]) auf meine 
Daten zugreifen.

Grüße

STB
OP #1044854
Lesenswert?

Danke, prinzipiell könnte ich es so machen, allerdings sind die beiden 
Arrays relativ groß. Zu allem Übel enthalten sie auch noch default 
Werte.

Hier ein Beispiel:
1
unsigned char KeyboardeePROM[35][5] EEMEM ={                                                            
2
                                              {0x15, 0x15, 0x15, 0x15, 0x15},
3
                                              {0x52, 0x52, 0x52, 0x52, 0x52},
4
                                              {0x09, 0x09, 0x09, 0x09, 0x09},
5
                                              {0x51, 0x51, 0x51, 0x51, 0x51},
6
                                              {0x07, 0x07, 0x07, 0x07, 0x07},  
7
                                              {0x50, 0x50, 0x50, 0x50, 0x50},
8
                                              {0x0A, 0x0A, 0x0A, 0x0A, 0x0A},
9
                                              {0x4F, 0x4F, 0x4F, 0x4F, 0x4F},
10
                                              ...}
11
                                            };
12

13
So wie ich das sehe hilft mir das Tutorial da nicht recht weiter oder es hat einfach bei mir noch
14
nicht klick gemacht...
15

16
STB
OP #1044870
Lesenswert?

Hi !

Das hat mit meinem Problem nichts zu tun, EEPROM auslesen im AVR ist 
kein Problem. Ich will die Daten ausserhalb des AVRs modifizieren, dazu 
muss ich festlegen können wo genau im EEPROM die Daten stehen, damit 
nich bei jedem neu compilieren der AVR Soft. die Adressen in der 
(Windows-) Anwendung geändert werden müssen.

Trotzdem Danke für den Link.

STB
OP #1044993
Lesenswert?

Nein, das ist nicht mein Problem. Ich will festlegen abe welcher Adresse 
das Array im EEPROM steht. Natürlich steht das Array im EEPROM immer an 
der gleichen festen Adresse nach dem Compilieren aber diese kann sich 
nach Änderungen am Code und Neukompilierung ändern, dieses möchte 
ich/muss ich verhindern.

Vielleicht bin ich auch nur Blind, wie wäre es mit einem etwas 
aussagekräftigeren Zitat?


Grüße

STB
Gast #1045027
Lesenswert?

>Vielleicht bin ich auch nur Blind, wie wäre es mit einem etwas
>aussagekräftigeren Zitat?

Ja. bist du. So sollte das gehen:
1
Strukturtype  Name;
2

3
...
4
//-- für XXX die (feste) Startadresse im EEPROM eintragen
5
eeprom_read_block(&Name, (uint8_t*)XXX, sizeof(Name) );
OP #1045078
Lesenswert?

So blind bin ich dann doch nicht.

So kann man aus festen Adressen im EEPROM lesen, das ist (auch mir) 
nicht neu.

Vielleicht erkläre ich es falsch, ich möchte einem Array mit Name 
"KeyboardeePROM[35][5]" an einer von mir zur Compilierzeit gewählten 
Adresse ablegen. Wie ich das auslese weiss ich.

Der Ansatz aus dem Tutorial s. Zitat von "docean" löst mein Problem 
eigentlich, bis auf die (komfortable) Initialisierung des Arrays.

Grüße

STB
Gast #1047731
Lesenswert?

Genau das gleich suche ich im Moment auch.

Ziel ist, die Adresse der Daten im Eprom nicht durch dn Kompiler zu 
vergeben. Diese kann schließlich von Programmstand zu Programmstand 
unterschiedlich sein.

uint16_t eeData EEMEM = 1000;

Die 1000 ist dabei der Initialwert (Speicherinhalt), aber die Adresse 
wird vom Compiler verteilt.

Sondern der Compiler soll eine bestimmt Adresse von mir definiert 
bekommen.
Dabei ist aber natürlich wichtig, das der Kompiler die adresse nachher 
nicht nochmal verteilt, und dann zwei Daten nur einer Zelle zugeteilt 
sind.

Vielleicht hat jemand einen Tipp?

Grüße Henning
Gast #1052957
Lesenswert?

Hallo,

damit habe ich mich auch schon rumgeschlagen. Also: man packt das Array 
in eine extra memory section (z.B. my_eeprom) und weist dieser eine 
Adresse im Linker zu.

Leider hat AVR Studio einen Bug an dieser Stelle: wenn man in project 
settings diesen Speicher anlegt, wird das nicht richtig zum makefile 
durchgereicht. Man muß also das makefile manuell editieren und unter 
anderem Namen abspeichern und dann in den project-settings auf custom 
makefile umschalten.

Servus Wolfgang
www.opendcc.de
Persönliche Seite #1052987
Lesenswert?

Henning wrote:
> Genau das gleich suche ich im Moment auch.
>
> Ziel ist, die Adresse der Daten im Eprom nicht durch dn Kompiler zu
> vergeben. Diese kann schließlich von Programmstand zu Programmstand
> unterschiedlich sein.
>
> uint16_t eeData EEMEM = 1000;
>
> Sondern der Compiler soll eine bestimmt Adresse von mir definiert
> bekommen.

Der Compiler vergibt keine Adressen.

> Vielleicht hat jemand einen Tipp?

Die Adressen macht der Linker. Ergo: Nicht via EEMEM (aka. section 
.eeprom oder so) lokatieren, sondern ne eigene Section anlegen und die 
im Linker-Script beschreiben.

Falls es nur um 1 Object geht, weiß man, daß es an Adresse 0 liegt, weil 
der Linker bei der kleinsten Adersse anfängt.

Falls man doch mit nem ld-script arbeiten will, darauf achten, nicht die 
physikalischen Adressen zu verwenden, sondern (wegen 
Harvard-Architektur) die logischen.

Wenn auf mehrere Objekte so zugegriggen werden soll, dann braucht jedes 
seine eigene Section. Oder man packt alles in einen großen EEPROM-Strukt 
(so mach ich das) und hat damit wieder nur 1 Objekt.

Alternativlösung: Die Adresse ausm map-File rausgreppen und in dem 
externen Tool verwenden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren