Pointer frei einstellen

Gast #6392740
Lesenswert?

Hallo,

ich möchte einen (4 Byte) Pointer beliebig im Adressbereich auf eine 
Adresse zeigen lassen. Bei der Übergabe einer (4 Byte) Int als Adresse 
an den Pointer beschwert sich der Compiler (int nicht möglich an int*).
Damit möchte ich eine flexible Funktion aufbauen, um diverse Register zu 
lesen und zu setzen.
Wie bekomme ich das hin? Hat jemand einen Schnipsel für mich? Die 
Register sind ebenfalls 4 Byte lang. STM32 mit IAR.

Gruß
Gast #6392742
Lesenswert?

Uwe P. Wettin schrieb:
> Bei der Übergabe einer (4 Byte) Int als Adresse
> an den Pointer beschwert sich der Compiler (int nicht möglich an int*).

Erstens nimmt man dafür den C99-Datentypen uintptr_t und nicht int. 
Zweitens castet man den dann zu einem Pointer auf den gewünschten 
Datentyp. Aufgepaßt, weil nicht alle Cortex-Ms unaligned access können.
Gast #6392925
Lesenswert?

Das einfachste wäre ein int *p;

Per Default 0, und mit p[1000] oder int i=1000; p[i] greifst du 
int-alligned auf die Speicherstelle .... 4000 zu.

Ich hoffe, dass die Warnmeldung in echt aussagekräftiger war und "Cast" 
enthalten hat.
Gast #6394448
Lesenswert?

So geht es nicht:

#include "stdint.h"
uintptr_t Adr ;
unsigned int * PAdr ;

void SetAdr(void){
// set Adr
...}

unsigned int Fetch(void){
PAdr = Adr ;   // Error uintptr_t cannot assigned unsigned int *
return(*PAdr) ;
}

void Store(unsigned int Val){
*Adr = Val ;
}

Wie kann ich PAdr setzen?
Gast #6394558
Lesenswert?

Uwe P. Wettin schrieb:
> uintptr_t Adr ;

Uwe P. Wettin schrieb:
> void Store(unsigned int Val){
> *Adr = Val ;
> }

ähm, so wie es verstehe, ist das kein Zeiger, sondern eine Variable, die 
eine beliebige (aber gültige) Adresse aufnehmen kann. Also ist hier der 
Dereferenzierungsoperator nicht erforderlich (der Compiler musste sich 
hier aber melden).

Uwe P. Wettin schrieb:
> #include "stdint.h"

<stdint.h>
#6394570
Lesenswert?

and his name is schrieb:
> Uwe P. Wettin schrieb:
>> uintptr_t Adr ;
>
> Uwe P. Wettin schrieb:
>> void Store(unsigned int Val){
>> *Adr = Val ;
>> }
>
> ähm, so wie es verstehe, ist das kein Zeiger, sondern eine Variable, die
> eine beliebige (aber gültige) Adresse aufnehmen kann.

Genau. Es ist ein vorzeichenloser Integer, der groß genug ist, um einen 
beliebigen Zeigerwert verlustlos aufnehmen zu können, aber es ist selbst 
kein Zeiger. Ich würde aber auch als Parameter für Store einen uintptr_t 
nehmen und keinen unsigned int, denn bei letzterem kommt es auf die 
Plattform an, ob er einen Zeigerwert immer verlustlos aufnehmen kann. 
Genau deshalb gibt es ja uintptr_t.

> Also ist hier der Dereferenzierungsoperator nicht erforderlich (der Compiler
> musste sich hier aber melden).

Richtig.
Gast #6395849
Lesenswert?

Hallo,

es ist erstaunlich:
Kaum macht man es richtig, schon funktioniert es!

Vielen, vielen Dank für die ganzen Hinweise. Mädels, ihr seid echt nett 
zu mir.

Ich kann ganze Liebesbriefe in C schreiben, aber Pointer benutze ich 
leider viel zu selten. Und wenn, dann landet der Brief an der falschen 
Adresse :-(.

Aktuell sehe ich auf dem Terminal die gleichen Hex wie auf dem 
IAR-Disassembly-Window. Ein gutes Zeichen (genauer: viele gute Zeichen).

Anscheinend habe ich viel zu kompliziert gedacht, jedenfalls packe ich 
die ganzen Hinweise unters Kopfkissen und kaue sie bei Gelegenheit mal 
ruhig wieder.

Wenn ich darf, eine Frage hätte ich noch: Ich möchte über das Terminal 
einen Wert (einen Pointer) eingeben, zu dem das Programm springen soll 
(mit BX LR von dort retour). BL Pointer sozusagen, wobei BL in C und 
Pointer nicht relativ sein sollten. Gibt es sowas?

Nochmals vielen Dank !
Gast #6395938
Lesenswert?

Es gibt in GCC eine C-Erweiterung, die sich "computed goto" nennt. Damit 
kann man beispielsweise goto-Labeladressen in einem Array speichern und 
dann über den Array-Index einen funktions-lokalen Sprung ausführen. Den 
Inhalt kann man natürlich auch mit uintptr_t speichern und ausgeben.

Wenn Du es noch drastischer brauchst, wären setjmp/longjmp (Standard-C) 
etwas. Das kann überall hinspringen, wo es schonmal war. Aber aufgepaßt, 
das funktioniert nur, solange Du im Calltree nicht abwärts springst. Ist 
zur Fehlerbehandlung gedacht, so macht man Exceptions in C.
Persönliche Seite #6397435
Lesenswert?

Uwe P. Wettin schrieb:
> Hallo,
>
> ich möchte einen (4 Byte) Pointer beliebig im Adressbereich auf eine
> Adresse zeigen lassen. Bei der Übergabe einer (4 Byte) Int als Adresse
> an den Pointer beschwert sich der Compiler (int nicht möglich an int*).
> Damit möchte ich eine flexible Funktion aufbauen, um diverse Register zu
> lesen und zu setzen.
> Wie bekomme ich das hin? Hat jemand einen Schnipsel für mich? Die
> Register sind ebenfalls 4 Byte lang. STM32 mit IAR.
>
> Gruß

Meinst du wirklich die uC Register oder Flash Speicher?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren