mikrocontroller.net

Forum: PC-Programmierung Werte vom Flash lesen bringt falsches ergebnis


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche gerade den Flash auszulesen, allerdings bekomme ich nicht 
den Inhalt heraus

Im Flash steht
...
0x70050000  00000000 000000A0 659C772F 802BF800
0x70050010  20202020 00000000 00000000 00000001
...
uint32 *adresse = (uint32*) 0x70050000
uint64 value = *adresse

in value steht aber nur 0x00 ich würde aber eigentlich 0xA0 erwarten.

weiß jemand wo hier mein Fehler ist und würde mir auf die sprünge 
helfen?

Autor: Hellseher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bestimmt, denn es gibt auf der ganzen Welt nur ein Flash, und eine 
einzige Art, dieses auszulesen.

Es steht auf S42 des Datenblatts des Flash, und auf S33 des Controllers, 
was du tun musst.

Im Ernst: Es fehlern ein paar Details...

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Mark schrieb:
> uint32 *adresse = (uint32*) 0x70050000

Du meinst vermutlich uint32_t? Einen Zeiger auf einen 32bit-Typ zu 
dereferenzieren liefert eben nur 32bit, also die 0x00000000. Dass du die 
nach dem Lesen auf 64bit erweiterst ändert das auch nicht. Was geht:
uint64_t *adresse = (uint64_t*) 0x70050000;
uint64_t value = *adresse;

Die Frage ist natürlich, warum willst du eine bestimmte Adresse 
auslesen? Das umgeht den Linker und dessen hilfreiche Mechanismen. Warum 
nicht eine Variable in den Flash legen und diese normal auslesen?
const uint64_t flashData = 0xA0;

uint64_t value = flashData;

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Du meinst vermutlich uint32_t?

ja, das habe ich im code aber auch so stehen. habe den teil aber nicht 
hierein kopiert, sondern neu geschrieben.

Niklas G. schrieb:
> uint64_t *adresse = (uint64_t*) 0x70050000;
> uint64_t value = *adresse;

Das ja, aber warum? Die Adresse ist doch uint32_t. nur der Wert, der 
dort steht ist uint64_t. oder was genau steht dann in *adresse?

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark schrieb:
> Die Adresse ist doch uint32_t.

Das Integer-Literal 0x70050000 ist vermutlich vom Typ "int". Pointer 
sind auf einer Plattform immer gleich groß - bei dir also vermutlich 
immer 32bit. Der Zeiger-Typ gibt nicht die Größe der Adresse selbst 
an, sondern den Typ der Ziel-Daten.

Mark schrieb:
> nur der Wert, der
> dort steht ist uint64_t
Das sagst du. Das weiß der Compiler aber nicht. Da könnte auch nur 1 
Byte stehen.

Mark schrieb:
> oder was genau steht dann in *adresse?

"*adresse" liest die Daten von der Adresse aus. Den Typ dieser Daten 
teilst du über den Pointer-Typ mit, also "uint32_t". Es werden also 4 
Bytes ausgelesen.

Wenn der Pointer vom Typ "uint64_t*" ist, werden 8 Bytes gelesen - auch 
wenn die Adresse selbst nur 4 Bytes lang ist.

Vermutlich gibt es aber einen viel besseren Weg. Was genau hast du vor, 
warum musst du genau diese Adresse auslesen?

: Bearbeitet durch User
Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark schrieb:
> in value steht aber nur 0x00 ich würde aber eigentlich 0xA0 erwarten.

Ich würde 0 erwarten denn im Flash steht an der Stelle 0x00000000.

: Bearbeitet durch User
Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark schrieb:
> weiß jemand wo hier mein Fehler ist und würde mir auf die sprünge
> helfen?

Der Compiler interessiert sich beim Auswerten erstmal nur auf die 
"rechte" Seite des "=". Dort steht aber nur ein Pointer auf einen 32 Bit 
uint, also liesst er nur 4 Bytes aus dem Speicher - die sind alle Null.

Der 4 Byte uint wird dann erst nachher auf 64 Bits erweitert und in die 
64 Bit Variable geschrieben.

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.

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