Werte vom Flash lesen bringt falsches ergebnis

Gast #5843590
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?
Gast #5843597
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...
Persönliche Seite #5843601
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;
Gast #5843618
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?
Persönliche Seite #5843626
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?
#5843933
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.