2017-12-28 25 views
2

Ich brauche Funktion von einer bestimmten Adresse (z. B. Double function indirection in C), aber nicht genau das gleiche. Ich könnte die Zeiger aus der Mapping-Tabelle ziehen und dynamisch erzeugte Funktionszeiger manipulieren, die ich lieber vermeiden möchte. Zum Beispiel möchte ich diese Art von Anruf zu vermeiden:GCC auf ARM Cortex M3: Aufruf von Funktionen von bestimmten Adressen

((int)(*)(void*)) compute_volume = ((int)(*)(void*)) 0x20001000; 

int vol = (*compute_volume)(); 

Stattdessen würde ich es vorziehen, eine Art von Linker versehen Symbolen oder anderen Methoden zu verwenden, um folgendes zu erreichen, mit der Ausnahme, dass die compute_volume() Funktion durch ein anderes Bild zur Verfügung gestellt vielleicht so etwas wie diese:

extern int compute_volume(void); 

vol = compute_volume(); 

Mit anderen Worten, ich beabsichtige, meinen Code in mehrere Bilder aufgeteilt, wodurch die Notwendigkeit zum Modifizieren oder das Überschreiben des Flash-jedesmal, wenn ein Symbol oder Berechnung Änderungen zu reduzieren.

Irgendwelche Vorschläge/Ideen?

+0

Funktionszeiger sind dafür ausgelegt. Aber wenn die Syntax Sie stört, könnten Sie in diesem Fall ein '# define' oder vielleicht ein [typedef] (https://stackoverflow.com/questions/4295432/typedef-function-pointer) –

+0

oder http: // blog verwenden .atollic.com/using-gnu-gcc-on-arm-cortex-geräte-platzierung-code-und-daten-auf-spezielle-speicher-adressen-using-the-gnu-ld-linker –

+0

Beachten Sie, dass dies * nicht * gibt Ihnen mehr Update-Zyklen im Vergleich zum Neuschreiben des gesamten Flash jedes Mal, weil Mikrocontroller-Flash-Speicher keine Wear Leveling hat. –

Antwort

0

Sie können Jump-Tabelle definieren, die immer in der gleichen Flash-Region (Sie können diese Region in Linker und Pragmas in dem Code, den ich denke, zu definieren) und beim Aufruf springt zur gewünschten Funktion.

Im Firmware-Teil I definieren Sie nur Symbole, die sich auf "passing" -Funktionsadressen beziehen (wenn Sie sie immer in derselben Region behalten, werden zukünftige Updates VIEL einfacher). Im Firmware-Teil II erstellen Sie eine Sprungtabelle, die sich im Adressraum befindet, auf den Sie im Firmware-Teil I Bezug genommen haben, und ruft die eigentlichen Funktionen auf.

Ich bin nicht 100% sicher, dass ich es richtig beschrieben habe, aber dies sollte Ihnen eine Vorstellung davon geben, wie Sie Ihr Problem lösen können. Der mitgelieferte Link Ring-Ø sollte Ihnen helfen, den Sprungtabellen-Code an einer Stelle zu platzieren.

Verwandte Themen