Für Unit-Tests eines eingebetteten Projekts auf dem Host habe ich begonnen, Funktionszeiger zu verwenden, um zur Laufzeit zwischen der "echten" Implementierung einer Funktion und einem Mock wechseln zu können. So sieht meine Funktion ‚foo‘, wie dies in der C-Datei:gcc: Können Sie Funktionszeiger auf einen anderen Abschnitt (nicht .data) setzen?
// the 'real' implementation of the function to be used during runtime
void fooImplementation ()
{
/* ... */
}
// the function pointer, initialized to the 'real' implementation
void (*foo) () = fooImplementation;
Es stellte sich heraus, dass der Zielprozessor (Blackfin) eine Ausnahme erzeugt, da der Funktionszeiger in dem internen L1-Datenspeicher befindet sich die ist nicht erlaubt, Code zu tragen, sondern nur Daten.
Eine Lösung, die funktioniert, ist ein Attribut für jeden Funktionszeiger zuzuweisen, damit es in einem anderen Abschnitt versetzt wird, die in L1-Datenspeicher, beispielsweise befindet sich nicht:
void (*foo) () __attribute__ ((section(".ext_mem"))) = fooImplementation;
Aber das macht den Code ein ein wenig schwer zu lesen und ist fehleranfällig (wenn Sie vergessen, das Attribut zuzuweisen, werden Komponententests problemlos ausgeführt, aber der Code generiert die Ausnahme, sobald die Funktion für das Ziel aufgerufen wird).
Also meine Frage ist, ob es eine Möglichkeit gibt zu sagen, gcc alle Funktionszeiger standardmäßig auf einen anderen Abschnitt zu setzen.