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?
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) –
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 –
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. –