Die Größe einer Adresse in Cortex M3

Gast #2397322
Lesenswert?

Hallo allerseits,

Kennt jemand die Adress-struktur des Cortex M3-Prozessors?
Ich möchte eine Variable anlegen um darin die Adresse einer C-Funktion 
speichern zu können, weis aber nicht welche Typ von Variable dafür 
geeignet ist.
Ich würde gerne wissen wie groß die Addresse einer Funktion für den cpu 
werden kann? (Cortex M3 ist soweit ich weis ein 32 bit controller)

danke
Moderator Persönliche Seite #2397566
Lesenswert?

Juergen schrieb:
> Deklarier sie als Funktionspointer, dann wird der Compiler schon das
> richtige tun.

Ja, das ist auch der einzige portable Weg.  Dran denken: Funktions-
zeiger und Objektzeiger sind nicht portabel ineinander überführbar.
Also:
1
void foo(void);
2

3
...
4
void *fooptr = (void *)foo;

ist falsch bzw. unportabel.  Der Standard garantiert jedoch, dass
sich ein Funktionszeiger beliebig in einen anderen Funktionszeiger
und wieder zurück wandeln lässt.  Damit kann man sich einen
"generischen Funktionszeigertyp" schaffen:
1
typedef void (*funcptr)(void);
2

3
int foo(int i);
4
void bar(void);
5

6
funcptr fns[] = { (funcptr)foo, (funcptr)bar };
7

8
...
9
  fn1 = (int (*)(int))fn[0];
10
  i = fn1(42);
11
  fns[1]();
Gast #2397593
Lesenswert?

Wie ist denn dann fn1 zu deklarieren da stehe ich auch auf dem Schlauch?

int (*)(int) fn1; //??

Man muss aber zu jedem Zeitpunkt so oder so wissen, welcher Funktionstyp 
wo im fn Array steht und sich das passend casten. Also einen irgendwie 
gearteten Automatismus gibts nicht, oder?
Moderator Persönliche Seite #2397612
Lesenswert?

Carsten schrieb:
> Wie ist denn dann fn1 zu deklarieren da stehe ich auch auf dem Schlauch?
>
> int (*)(int) fn1; //??
1
int (*fn1)(int);

Sieht ein wenig ungewohnt aus, wenn man noch nicht viel mit
Funktionszeigern gemacht hat, der Name steht halt relativ weit
vorn.

> Man muss aber zu jedem Zeitpunkt so oder so wissen, welcher Funktionstyp
> wo im fn Array steht und sich das passend casten.

Ja.

> Also einen irgendwie
> gearteten Automatismus gibts nicht, oder?

Ja, gibt's nicht.
(Firma: EleLa - www.elela.de) #2397654
Lesenswert?

Dieses Array mit Funktionszeiger ist eine super Sache. Ich nutze das um 
in C die Interrupt-Vectortabelle zu generieren (für STM32). Dabei 
wird dieses Array als Konstante zu Beginn des Flashes gelinkt.
Fertig ist die dynamische Sprungtabelle und man kann auf die Assembler 
Codierte Sprungtabelle verzichten.
Dazu kommen noch zwei for Schleifen um die Variablen zu initialisieren.
1
typedef void( *intfunc )( void );
2
typedef union { intfunc __fun; void * __ptr; } intvec_elem;
3

4
const intvec_elem Vectors[] __attribute__ ((section(".vectors"))) =
5
{
6
  {(intfunc) STACK_TOP},  // stack pointer
7
  {Main},
8
  {__FW_DummyISR_Handler},  // NMIException
9
: : :
Gast #2398175
Lesenswert?

Hi, ersmal danke an alle

Markus Müller schrieb:
> Ich nutze das um
> in C die Interrupt-Vectortabelle zu generieren (für STM32)

Würde mich freunen wenn Du mehr über die generierung deiner 
Interupt-vektortabelle schreiben würdest.
Ich glaube das ist ungefähr das gleiche was ich auch letzlich vorhabe.
Also zumindes ein Teil der Aufgabe besteht darin, in einer Vektortabelle 
Adressen von Funktionen mit den dazugehörigen Timestumps rein 
zuschreiben, die dann später (unter Verwendung dieser Adressen) 
aufgerufen werden können. Die Vektortabelle selbst stelle ich mir als 
ein Array von Sturcts vor, die 2 elemente enthalten: 1 int für Timestump 
und ein ??? für die Adresse der Funktion.

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