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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.