Wie den Inhalt von bestimmter Adresse lesen?

Gast #1228722
Moin!

Ich möchte von einem Freescale DSP56F8025 aus dem Ram und/oder Flash von 
einer bestimmten Adresse den Inhalt lesen. Das ganze soll zum Debuggen 
sein und im Betrieb ermöglichen, Fehlercodes, die an definierten 
Adressen gespeichert werden, auszulesen. Entwicklungsumgebung ist der 
Metroworks Codewarrior 8.22 und natürlich in C.
Bislang hatte ich gedacht dass ich mit

us_Wert = * (unsigned short*) us_Adresse;

dahin käme. Leider ist der Kompiler anderer Meinung.
Ich hab das ganze mal etwas entzerrt und folgendes gemacht:

unsigned short us_Wert;
unsigned short us_Adresse;
unsigned short *pus_Pointer;

...
us_Adresse wird ein Wert über Kommunikation mitgeteilt.
...

pus_Pointer = (unsigned short *) us_Adresse;
us_Wert = *pus_Pointer;

Das hat zur folge, dass im Debugger der Pointer auf die Gewünschte 
Adresse zeigt. Aber die Übergabe des Inhalts an us_Wert funktioniert 
nicht. Stattdessen wird die Adresse übergeben.

Hat jemand eine Idee wie ich entweder den Codewarrior dazu kriege den 
Wert zu nehmen oder eine andere Idee, wie man den Inhalt einer gegebenen 
Adresse ausliest?

Mit freundlichen Grüßen, Systroup
Systroup wrote:

> Bislang hatte ich gedacht dass ich mit
>
> us_Wert = * (unsigned short*) us_Adresse;
>
> dahin käme. Leider ist der Kompiler anderer Meinung.

Nämlich welcher?

> Hat jemand eine Idee wie ich entweder den Codewarrior dazu kriege den
> Wert zu nehmen oder eine andere Idee, wie man den Inhalt einer gegebenen
> Adresse ausliest?

Zeig mal ein komplettes Beispiel.
Inwiefern ist der Compiler denn "anderer Meinung"? Ich kenne den 
Controller zwar nicht, aber in der reinen C-Denkweise sollte das schon 
so klappen, zumindest für den RAM-Zugriff. Für's Flash bzw. EEPROM 
(sofern vorhanden) würde ich mal das Handbuch nach etwaigen Intrinsics, 
Macros und Pragmas befragen.

Bei dem Controller dürfte "unsigned short" 16-bittig sein. Evtl. 
Alignment-Problem?
Gast
Mhm, da hab ich mich schlecht ausgedrückt. Der Kompiler meckert nicht, 
aber der Fehler ist wie schon beschrieben. Das heisst, statt des Inhalts 
bekomme ich die Adresse zurückgegeben.

Das obige Konstrukt habe ich schonmal erfolgreich auf einem NEC 
eingesetzt.

Festlegungen im Linker scheiden hier aus, da völlig verschiedene 
Speicherbereiche ausgelesen werden sollen. Auch mit der Möglichkeit, den 
kompletten Speicher auszulesen.

Der Controller ist ein 16 Bitter, und auf das Alignment wurde schon 
geachtet.

MfG, Systroup
Gast
Rufus: Daten (X) und Programm (P) getrennt


So geht es auf jeden Fall bei mir (direkt, d.h. ohne eigenen Pointer):
  static UWord16 Speicherinhalt,testAdr = 0x1234;
  Speicherinhalt = *(UWord16*)testAdr;

wird übersetzt in
  move    X:FtestAdr$4,R0
  nop
  move    X:(R0),X0
  move    X0,X:FSpeicherinhalt

...

FtestAdr$4    DC    4660


Wie übersetzt er bei Dir?
Hallo Forum!

Wenn es gestattet ist, häng ich mich hier mal mit ran - hänge auch 
gerade an diesem Problem.
Bei mir handelt es sich um einen 8051 mit dem IAR Compiler. Ich versuche 
die SFRs (0x80 bis 0xFF) auszulesen und in einen Puffer zu schreiben. 
Hier der dazugehörige Code:
1
  j=0x80;
2
  do {
3
    bufferSPI[j-0x80] = (*((volatile char *) j));
4
  } while (++j);

Mach ich das so, steht danach irgendwelcher Murks im Puffer - jedenfalls 
nicht die SFR-Werte.
1
  j=0x80;
2
  do {
3
    asm("MOV R0,#temp");
4
    asm("MOV @R0,j   ");
5
    bufferSPI[j-0x80] = temp;
6
  } while (++j);

Das ist die originale Schreibweise des IAR-Compilers beim Auslesen eines 
SFRs - also die beiden Assembler Zeilen. Nur steht statt "#temp" die 
Adresse von temp und statt "j" der Name des SFRs bzw. dessen Adresse.
Mir scheint es so, als gäbe es ein Problem mit "j", denn selbt das 
funktioniert nicht:
1
  j=0xF4;
2
  asm("MOV R0,#temp");
3
  asm("MOV @R0,j   ");

Ich muss zugeben, dass ich nicht sondelich bewandert bin, was solche 
Dinge angeht. Sieht vielleicht jemand von euch meinen Fehler?


Viele Grüße
mario
Gast
Hallo!
Ja, beim 8051 werden die SFR's direkt addressiert, weil auf den gleichen 
internen Speicherplätzen (0x80..0xFF) RAM liegt. Dieser kann NUR 
indirekt adressiert werden (also so, wie Du es machst).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.