Forum: Compiler & IDEs Eeprom Adressen der Daten


von Günni (Gast)


Lesenswert?

Hallo,

ich bin auf der Suche nach einer Erklärung wie die Eeprom Daten aus dem
C-Code (eeprom section) in das Eeprom des Prozessors organisiert werden.
Meine bisherigen Erfahrungen haben gezeigt, dass die Daten einfach
rückwärts in des Eeprom geschrieben werden. D.h. der Letzte Eeprom Wert
im C-Code steht im Assembler File an erster Stelle, also hat auch die
nierdrigste Adresse im Eeprom und so weiter.
Meine Frage hierzu: kann man generell von dieser Methode ausgehen oder
hängt dies von Faktoran ab?

Grüße
Günni

von Rufus T. Firefly (Gast)


Lesenswert?

Ohne zu erwähnen, um welchen Compiler und vor allem: welchen Prozessor
es sich handelt, können wir nur raten.

von Günni (Gast)


Lesenswert?

GNU C Compiler für AVR ATMega16 (WinAVR)

von Jörg Wunsch (Gast)


Lesenswert?

Ich würde nicht davon ausgehen.  Früher wurden sie genau andersrum
sortiert.  Die neue Reihenfolge beim GCC 3.4 scheint ein Fietscher,
das ein Seiteneffekt irgendeiner anderen Änderung ist.  Du musst auch
immer damit rechnen, dass der Compiler u. U. mal Variablen nach Größe
sortiert (z. B. um 16-bit Variablen zusammen zu halten).

Wenn Du eine bestimmte Reihenfolge brauchst, dann deklariere den
gesamte EEPROM-Inhalt in eine struct hinein, und benutze diese struct
als einzige Variable im EEPROM überhaupt.

von Matthias (Gast)


Lesenswert?

Hi

wenn du die genauen Addressen außerhalb deines Programms brauchst (ich
hab das mal für eine Konfiguration mittels PC benötigt) dann kannst du
diese aus dem map-file extrahieren. Ein kleines perl Skrip hat bei mir
die Daten extrahiert und in eine Datei zur weiteren Verarbeitung
geschrieben.

#!/bin/perl -w

open(INPUT,"main.map") or die "Fehler beim Öffnen des map file:
$!\n";
open(OUTPUT,"> eeprom_addr.bin") or die "Fehler beim Öffnen von
eeprom_addr.bin: $!\n";

$merker = 0;

#eeprom-addressen aus map file extrahieren
while(defined($i = <INPUT>))
{
  if($merker == 1)
  {
    if($i =~ __eeprom_end)
    {
      $merker = 0;
    }
    else
    {
      if($i =~ /eeprom_./)
      {
        $i =~ s/ {1,}//;
        $i =~ s/ {1,}/#/;
        $i =~ s/\n/#/g;
        $i =~ s/\r//g;
        $i =~ s/0x00810//g;

        print OUTPUT $i
      }
    }
  }

  if($i =~ /\*\(\.eeprom\*\)/)
  {
    $merker = 1;
  }
}

print OUTPUT '#';

close(INPUT);
close(OUTPUT);

Nicht schön erfüllt aber seinen Zweck.

Matthias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.