Forum: Mikrocontroller und Digitale Elektronik Die Größe einer Adresse in Cortex M3


von jesse (Gast)


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
von Juergen (Gast)


Lesenswert?

Deklarier sie als Funktionspointer, dann wird der Compiler schon das 
richtige tun.

Ansonsten ist aber 32 Bit richtig, wobei es noch ein paar Verwicklungen 
mit Bit 0 = 1 für Thumb geben kann.
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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]();
von Mark B. (markbrandis)


Lesenswert?

Ich versuch grad das Codebeispiel so zu verstehen... werde es aber wohl 
doch durch den Compiler jagen und um Ausgaben ergänzen ;-)
von Carsten (Gast)


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?
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.
von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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
: : :
von jesse (Gast)


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.
von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Siehe im Artikel: STM32 Eclipse Installation

Das Eclipse Demo-Projekt:
"Blink-LED, komplettes Eclipse-Workspace von MmVisual" (mir)

Alles drin.

Die STM32 Vektortabelle besteht aber nur aus 32-Bit Adressen, die man 
nicht erweitern kann. Hardwareabhängig.
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.