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


von Mark (Gast)


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
...
1
uint32 *adresse = (uint32*) 0x70050000
2
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?

von Hellseher (Gast)


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...

von Niklas G. (erlkoenig) Benutzerseite


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:
1
uint64_t *adresse = (uint64_t*) 0x70050000;
2
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?
1
const uint64_t flashData = 0xA0;
2
3
uint64_t value = flashData;

von Mark (Gast)


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?

von Niklas G. (erlkoenig) Benutzerseite


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
von Bernd K. (prof7bit)


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
von Jim M. (turboj)


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.

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.