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
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.
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](); |
Ich versuch grad das Codebeispiel so zu verstehen... werde es aber wohl doch durch den Compiler jagen und um Ausgaben ergänzen ;-)
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?
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.
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 | : : : |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.